如何在多对多表及其父表之间强制实施参照完整性

时间:2015-03-07 10:20:52

标签: sql-server-express

我有4张桌子。

  • 表1存储航空公司的数据
  • 表2存储了目的地的数据
  • 表3列出了唯一的路线(每条路线是航空公司和目的地的唯一组合)。
  • 表4记录了表3中路线上所有航班的价格。这是多对多表,因为每个航空公司有许多航班飞往多个目的地。

表1 = Airlines

    Airline_ICAO_Code varchar(3) Not NULL Primary key,
    Airline varchar(22) NULL

表2 = Destinations

    Airport_ICAO_Code varchar(4) Not NULL Primary key,
    Destination varchar(30) NULL

表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 

表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

我的问题是如何在表3和表4之间强制执行参照完整性。这是必要的,因为表4中输入的路由必须出现在表3中。我需要建议在表上设置主键的方法3和表4将使我能够做到这一点。

我正在考虑在表3中使用复合键,如下所示:

Primary Key(Airport_ICAO_Code,Airline_ICAO_Code)

或将Airport_ICAO_CodeAirport_ICAO_Code列连接到新列并删除ID列。

如果我使用Identity列作为两个表的主键,则无法保证表4中路由的ID与表3中的路由ID相匹配。

由于所有这些选择,我不确定前进的最佳方式。如果有人可以花时间来帮助解决这个问题,那将非常感激。

感谢您提供的任何帮助

编辑: 在收到Marc在下面的帖子中的建议后,我按如下方式设置了表4。但是这张桌子上没有主键。 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

1 个答案:

答案 0 :(得分:1)

基本上,如果表4中的任何一个条目总是属于表3中的单个条目,我只会将Airlines2Destiations.ID作为外键存储到表4中。

这样,表4的每个条目总是清晰且唯一地连接到​​表3中的单个条目。另外:从表4中删除所有减少 - 您只需要对表3的引用 - 您无需重复航空公司或机场代码和名称。

表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 

表4 = Airlines2DestinationsPrices

ID int IDENTITY(1,1) NOT NULL,
Airlines2DestinationsID INT NOT NULL
    FOREIGN KEY REFERENCES dbo.Airlines2Destiations(ID),
Departure smalldatetime,
Price smallmoney