我如何在多对多 table 和它的父 table 之间强制引用完整性

how do I enforce referential integrity between a many to many table and its parent tables

我有 4 个 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_CodeAirport_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