Sql server 2008 基于多web服务的城市详细信息数据库设计

Sql server 2008 基于多web服务的城市详细信息数据库设计,sql-server-2008,database-design,Sql Server 2008,Database Design,我正在开发旅游应用程序,所以我们必须处理不同的web服务,如GTA、Gallieo、Kuoni等。获取有关酒店详情的信息。 每个web服务都有自己的城市代码和城市名称列表。 我想设计一个表来存储来自不同web服务的城市详细信息,经过一些研究,我找到了这两种方法 第一种方法 CREATE TABLE [dbo].[City]( [CityID] [int] NOT NULL, [CountryCode] [varchar](5) NOT NULL, [AppCityCode] [varchar](

我正在开发旅游应用程序,所以我们必须处理不同的web服务,如GTA、Gallieo、Kuoni等。获取有关酒店详情的信息。 每个web服务都有自己的城市代码和城市名称列表。 我想设计一个表来存储来自不同web服务的城市详细信息,经过一些研究,我找到了这两种方法

第一种方法

CREATE TABLE [dbo].[City](
[CityID] [int] NOT NULL,
[CountryCode] [varchar](5) NOT NULL,
[AppCityCode] [varchar](10) NOT NULL,
[AppCityName] [varchar](200) NOT NULL,
[GTACityCode] [varchar](10) NULL,
[GTACityName] [varchar](200) NULL,
[GWSCityCode] [varchar](10) NULL,
[GWSCityName] [varchar](200) NULL,
[KuoniCityCode] [varchar](10) NULL,
....
....
....
....
....
....
)
在这种方法中,如果添加了一个新的Web服务,那么由于这种修改,将添加与Web服务对应的两列(城市代码和城市名称),并且存储过程和前端应用程序代码将发生更改。 在文本框中加载城市时不会出现重复

第二种方法 WSSupplier表用于存储Web服务的详细信息,如GTA、Gallieo

CREATE TABLE [dbo].[WSSupplier](
[SupplierID] [smallint] NOT NULL,
[SupplierName] [varchar](100) NOT NULL
)

CREATE TABLE [dbo].[City](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[AppCityCode] [varchar](20) NULL,
[AppCityName] [varchar](150) NULL,
[CountryCode] [varchar](10) NULL,
[WSSupplierID] [smallint] NULL,
[WSCityCode] [varchar](20) NULL,
[WSCityName] [varchar](150) NULL
)
在第二种方法中,将使用相应的web服务供应商ID逐行添加城市 如果新的Web服务出现,那么我不必修改表结构或前端应用程序。 在加载城市时,我必须使用DISTINCT在文本框或前端的下拉列表中加载唯一的城市

在这两种方法中,我都使用Appcitycode和Appcityname,这将在应用程序中加载城市文本框或下拉列表。在选择Appcityname时,它将获得相应的web服务城市代码,并将其作为请求发送给web服务以搜索特定城市中的酒店


我想知道哪种方法是最好的,或者是否有其他好的方法

第三种方法是在城市表和供应商表之间创建一个交集表,列出供应商版本的城市代码

您的城市表将只有您自己的系统的城市标识符。这座城市只会出现一次。每次添加供应商时,都会在交叉点表中插入新记录,其中包含供应商关心的城市的城市代码。将供应商城市代码转换为您的内部城市代码只需在交叉点表中进行简单的查找

考虑一下这样的情况:

CREATE TABLE [dbo].[WSSupplier](
[SupplierID] [smallint] NOT NULL,
[SupplierName] [varchar](100) NOT NULL
)

CREATE TABLE [dbo].[City](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[CityCode] [varchar](20) NULL,
[CityName] [varchar](150) NULL,
[CountryCode] [varchar](10) NULL
)

CREATE TABLE [dbo].[SupplierCityCode](
[CityID] [int] NOT NULL,
[WSSupplierID] [smallint] NULL,
[WSCityCode] [varchar](20) NULL,
[WSCityName] [varchar](150) NULL,
FOREIGN KEY [fk_city] [CityID] REFERENCES [dbo].[City],
FOREIGN KEY [fk_supplier] [WSSupplierID] REFERENCES [dbo].[WSSupplier]
)

您的问题是关于应用程序和数据库设计的。从应用程序设计的角度来看,尝试从数据库设计中抽象出来,并将其视为业务对象的某种存储。从数据库设计的角度来看,您的问题是关于数据库规范化的——从数据库设计的大门开始。至于我:

创建表[dbo]。[供应商](
[SupplierID][smallint]不为空,
[供应商名称][varchar](100)不为空
)
创建表[dbo]。[AppCity](
[CityID][int]标识(1,1)不为空,
[CityCode][varchar](20)空,
[CityName][varchar](150)空,
[CountryCode][varchar](10)空,
)
创建表[dbo]。[SupplierCity](
[CityID][int]标识(1,1)不为空,
[SupplierID][smallint]不为空,
[CityCode][varchar](20)空,
[CityName][varchar](150)空
)

我想问的另一个问题是,我在城市(App)表中添加了10个城市。当我从供应商那里得到城市列表时,他们大约有100个城市。。。因此90个城市不同,10个城市与我的应用程序city相同。我从supplier city xml中提取了数据,并加载到一个包含两列CityCode和cityname的表中。现在我想将数据插入city表和SupplierCity表中。如何操作that@SQL006-如果定义了外键引用,则实际上无法首先将数据输入交叉点表,但不存在匹配的城市。如果您想找出交叉点表中哪些城市没有出现在父表中的方法,您应该用Google
SQL WHERE NOT in SUBSELECT
或查看以下知识库: