表之间的SQL server实体引用

表之间的SQL server实体引用,sql,foreign-keys,azure-sql-database,Sql,Foreign Keys,Azure Sql Database,我是SQL server的新手,我正在努力学习SQL的威力:) 我需要帮助了解不同的表如何在同一数据库中相互作用。我知道一个实体可以有一个外键,该外键引用另一个表的属性。但是我怎么能有一个表引用了许多不同的表呢 让我们举个例子。我有一个简单的数据库,有汽车表、自行车表和船表。每个表都有Id、Make、Model和Year属性。现在,我想向数据库中添加一个属性为IdService和ServiceNote的服务表,我想让每个IdService从三个表中的一个表中引用特定的汽车、自行车或船 我该怎么做

我是SQL server的新手,我正在努力学习SQL的威力:)

我需要帮助了解不同的表如何在同一数据库中相互作用。我知道一个实体可以有一个外键,该外键引用另一个表的属性。但是我怎么能有一个表引用了许多不同的表呢

让我们举个例子。我有一个简单的数据库,有汽车表、自行车表和船表。每个表都有Id、Make、Model和Year属性。现在,我想向数据库中添加一个属性为IdService和ServiceNote的服务表,我想让每个IdService从三个表中的一个表中引用特定的汽车、自行车或船

我该怎么做?为了更好地理解,请参阅我随附的简单图表


只需包含所需的列即可。这里有一种方法:

create table services (
    servicesid int identity(1, 1) primary key,
    bikeid int references bikes(bikeid),
    boatid int references boats(boatid),
    carid int references cars(carid),
    servicenote nvarchar(max),
    check ((bikeid is not null and boatid is null and carid is null) or
           (bikeid is null and boatid is not null and carid is null) or
           (bikeid is null and boatid is null and carid is not null)
          )
);
此结构允许您正确声明外键关系。
检查
约束还确保每一行只与一个实体对话


有些数据库支持表中的继承。这将允许您为自行车、船只和汽车声明一个“超级”类型,所有这些都共享相同的id。虽然您可以不继承就这样做,但这有点麻烦。对于少数连接,显式引用通常是足够的(尽管空值确实会占用数据页上的空间,这是浪费)。

我可能会建议尝试将其放在一个表中,而不是将其放在自行车、船和汽车的单独表中,特别是因为这三个表包含相同的信息,或者几乎一样。可能是库存或车辆之类的东西。库存表将包含车辆类型(自行车、船、汽车)、品牌、型号、年份等。然后服务仅引用库存表的ID。