彼此 FK 的表

Kro*_*owi 5 database-design sql-server

我正在研究一个存储地址信息的数据库。(与我发布的这个问题有关)

我有2张桌子:

CREATE TABLE [dbo].[Country] (
[Code]          CHAR (2)     NOT NULL,
[Code3]         CHAR (3)     NOT NULL,
[CodeNumeric]   CHAR (3)     NOT NULL,
[Name]          VARCHAR (50) NOT NULL,
[ContinentCode] CHAR (2)     NOT NULL,
[CurrencyCode]  CHAR (3)     NOT NULL,
PRIMARY KEY CLUSTERED ([Code] ASC),
CONSTRAINT [CountryContinentFK] FOREIGN KEY ([ContinentCode]) REFERENCES [dbo].[Continent] ([Code]),
CONSTRAINT [CountryCurrencyFK] FOREIGN KEY ([CurrencyCode]) REFERENCES [dbo].[Currency] ([Code])
);
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE [dbo].[City] (
[Id]          INT           IDENTITY (1, 1) NOT NULL,
[Code]        VARCHAR (10)  NOT NULL,
[Name]        NVARCHAR (50) NOT NULL,
[CountryCode] CHAR (2)      NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [CityCountryFK] FOREIGN KEY ([CountryCode]) REFERENCES [dbo].[Country] ([Code])
);
Run Code Online (Sandbox Code Playgroud)

现在我想使用City表中的 FK将Capital添加到我的Country表中。我知道这是不可能的,因为有限制(必须有一个带有首都 ID 的城市,但也必须有一个带有该城市国家代码的国家......如果这有意义的话)。

方法 1: 我将这个数据库与 C# 一起使用,并且正在考虑编写方法,该方法首先添加一个带有首都的国家/地区nullable,然后将城市添加到其表中,并使用添加的城市更新国家/地区首都。

方法 2: 我考虑的另一种方法不是将 Capital 添加到 Country 表中,而是创建一个新表 CountryCapital 并将 Country 和 City(Capital)链接在一起。

这两种方法中的哪一种是更好的方法?我认为如果数据库是通过 C# 维护的,方法 1 是一个很好的解决方案,但如果手动添加数据就很难跟上。另一方面,如果必须进行手动编辑(添加一个城市、添加一个国家并在 CountryCapital 表中添加一条记录,其中包含城市的 ID 和国家的代码),则方法 2 看起来更容易维护。

Dav*_*ett 4

对于国家/首都关系,我会选择选项 1,并允许首都用于NULL国家记录,而不是引入额外的表。在这两种情况下,您都允许在任何给定时间未定义资本,因此从完整性和引用完整性的角度来看,在选项之间没有任何选择。

如果您确实选择选项 2,并且国家/地区列不是您的 PK,请确保将其设置为UNIQUE否则您可能会意外地出现两个大写字母。通过额外的“关系类型”列,您可以通过允许定义“第二城市”和“宗教首都”(某些国家出于各种原因将其与政治首都分开)等内容来为该表提供额外的灵活性。