我如何在多对多 table 和它的父 table 之间强制引用完整性
how do I enforce referential integrity between a many to many table and its parent tables
我有 4 个 table。
- Table 1 存储航空公司的数据
- Table 2 存储目的地的数据
- Table 3 个存储独特的路线(每条路线是航空公司和目的地的独特组合)。
- Table 4记录了table3中航线上所有航班的价格,这是一个多对多table作为每家航空公司都有许多航班飞往许多目的地。
Table 1 = Airlines
Airline_ICAO_Code varchar(3) Not NULL Primary key,
Airline varchar(22) NULL
Table 2 = Destinations
Airport_ICAO_Code varchar(4) Not NULL Primary key,
Destination varchar(30) NULL
Table 3 = Airlines2Destinations
ID int IDENTITY(1,1) NOT NULL,
Airport_ICAO_Code varchar(4) Not NULL Foreign Key References Destinations(Airport_ICAO_Code),
Destination varchar(30) NULL,
Airline_ICAO_Code varchar(3) Not NULL Foreign Key References Airlines(Airline_ICAO_Code),
Airline varchar(22) NULL
Table 4 = Airlines2DestinationsPrices
ID int IDENTITY(1,1) NOT NULL,
Airport_ICAO_Code varchar(4) Not NULL Foreign Key References Destinations(Airport_ICAO_Code),
Destination varchar(30) NULL,
Airline varchar(22) NULL,
Airline_ICAO_Code varchar(3) Not NULL Foreign Key References Airlines(Airline_ICAO_Code),
Departure smalldatetime,
Price smallmoney
我的问题是如何在 tables 3 和 4 之间实施引用完整性。这是必要的,因为在 table 4 中输入的路由必须存在于 table 3 中。我需要关于如何在 Table 3 和 Table 4 上设置主键的建议,这将使我能够做到这一点。
我正在考虑像这样在 table 3 上使用复合键:
Primary Key(Airport_ICAO_Code,Airline_ICAO_Code)
或将 Airport_ICAO_Code
和 Airport_ICAO_Code
列连接成一个新列并删除 ID 列。
如果我使用 Identity
列作为两个 table 的主键,则无法保证 Table 4 中路由的 ID 与Table 3.
中的路线
由于所有这些选项,我不确定前进的最佳方式。如果有人能花时间帮助解决这个问题,我们将不胜感激。
感谢您提供的任何帮助
编辑:
在收到下面 post 中 Marc 的建议后,我按如下方式设置了 Table 4。但是 table 上没有主键。 ID 列是否更适合主键,或者我可以使用这样的复合键 Primary Key (Airlines2DestinationsID,Departure).
Table 4 = Airlines2DestinationsPrices
ID int IDENTITY(1,1) NOT NULL,
Airlines2DestinationsID INT NOT NULL
FOREIGN KEY REFERENCES dbo.Airlines2Destiations(ID),
Departure smalldatetime,
Price smallmoney
基本上,如果 table 4 中的任何一个条目始终属于 table 3 中的一个条目,我将把 Airlines2Destiations.ID
作为外键存储到 table 4.
这样,table 4 的每个条目总是清楚且唯一地连接到 table 3 中的单个条目。此外:删除所有 冗余 来自 table 4 - 您只需要参考 table 3 - 您不需要重复航空公司或机场代码和名称。
Table 3 = Airlines2Destinations
ID int IDENTITY(1,1) NOT NULL,
Airport_ICAO_Code CHAR(4) NOT NULL
Foreign Key References Destinations(Airport_ICAO_Code),
Destination VARCHAR(30) NULL,
Airline_ICAO_Code CHAR(3) NOT NULL
Foreign Key References Airlines(Airline_ICAO_Code),
Airline VARCHAR(22) NULL
Table 4 = Airlines2DestinationsPrices
ID int IDENTITY(1,1) NOT NULL,
Airlines2DestinationsID INT NOT NULL
FOREIGN KEY REFERENCES dbo.Airlines2Destiations(ID),
Departure smalldatetime,
Price smallmoney
我有 4 个 table。
- Table 1 存储航空公司的数据
- Table 2 存储目的地的数据
- Table 3 个存储独特的路线(每条路线是航空公司和目的地的独特组合)。
- Table 4记录了table3中航线上所有航班的价格,这是一个多对多table作为每家航空公司都有许多航班飞往许多目的地。
Table 1 = Airlines
Airline_ICAO_Code varchar(3) Not NULL Primary key,
Airline varchar(22) NULL
Table 2 = Destinations
Airport_ICAO_Code varchar(4) Not NULL Primary key,
Destination varchar(30) NULL
Table 3 = Airlines2Destinations
ID int IDENTITY(1,1) NOT NULL,
Airport_ICAO_Code varchar(4) Not NULL Foreign Key References Destinations(Airport_ICAO_Code),
Destination varchar(30) NULL,
Airline_ICAO_Code varchar(3) Not NULL Foreign Key References Airlines(Airline_ICAO_Code),
Airline varchar(22) NULL
Table 4 = Airlines2DestinationsPrices
ID int IDENTITY(1,1) NOT NULL,
Airport_ICAO_Code varchar(4) Not NULL Foreign Key References Destinations(Airport_ICAO_Code),
Destination varchar(30) NULL,
Airline varchar(22) NULL,
Airline_ICAO_Code varchar(3) Not NULL Foreign Key References Airlines(Airline_ICAO_Code),
Departure smalldatetime,
Price smallmoney
我的问题是如何在 tables 3 和 4 之间实施引用完整性。这是必要的,因为在 table 4 中输入的路由必须存在于 table 3 中。我需要关于如何在 Table 3 和 Table 4 上设置主键的建议,这将使我能够做到这一点。
我正在考虑像这样在 table 3 上使用复合键:
Primary Key(Airport_ICAO_Code,Airline_ICAO_Code)
或将 Airport_ICAO_Code
和 Airport_ICAO_Code
列连接成一个新列并删除 ID 列。
如果我使用 Identity
列作为两个 table 的主键,则无法保证 Table 4 中路由的 ID 与Table 3.
由于所有这些选项,我不确定前进的最佳方式。如果有人能花时间帮助解决这个问题,我们将不胜感激。
感谢您提供的任何帮助
编辑:
在收到下面 post 中 Marc 的建议后,我按如下方式设置了 Table 4。但是 table 上没有主键。 ID 列是否更适合主键,或者我可以使用这样的复合键 Primary Key (Airlines2DestinationsID,Departure).
Table 4 = Airlines2DestinationsPrices
ID int IDENTITY(1,1) NOT NULL,
Airlines2DestinationsID INT NOT NULL
FOREIGN KEY REFERENCES dbo.Airlines2Destiations(ID),
Departure smalldatetime,
Price smallmoney
基本上,如果 table 4 中的任何一个条目始终属于 table 3 中的一个条目,我将把 Airlines2Destiations.ID
作为外键存储到 table 4.
这样,table 4 的每个条目总是清楚且唯一地连接到 table 3 中的单个条目。此外:删除所有 冗余 来自 table 4 - 您只需要参考 table 3 - 您不需要重复航空公司或机场代码和名称。
Table 3 = Airlines2Destinations
ID int IDENTITY(1,1) NOT NULL,
Airport_ICAO_Code CHAR(4) NOT NULL
Foreign Key References Destinations(Airport_ICAO_Code),
Destination VARCHAR(30) NULL,
Airline_ICAO_Code CHAR(3) NOT NULL
Foreign Key References Airlines(Airline_ICAO_Code),
Airline VARCHAR(22) NULL
Table 4 = Airlines2DestinationsPrices
ID int IDENTITY(1,1) NOT NULL,
Airlines2DestinationsID INT NOT NULL
FOREIGN KEY REFERENCES dbo.Airlines2Destiations(ID),
Departure smalldatetime,
Price smallmoney