sql-server – 引用多个表的外键

前端之家收集整理的这篇文章主要介绍了sql-server – 引用多个表的外键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有uniqueidentifier的列,可以引用四个不同的表中的一个.我已经从两个方面看到了这一点,但两者似乎都是不好的做法.

首先,我看到了一个ObjectID列,没有明确地将其声明为特定表的外键.然后你可以推送你想要的任何uniqueidentifier.这意味着您可能会从不属于我想要的4个表的表中插入ID.

其次,因为数据可能来自四个不同的表,我也看到人们制作了4个不同的外键.并且在这样做时,系统依赖于具有非NULL值的ONE AND ONLY ONE列.

这样做有什么好办法?例如,我的表中的记录可能会引用医院(ID),诊所(ID),学校(ID)或大学(ID)……但仅限于那些表.

谢谢!

解决方法

您可能需要考虑Type / SubType数据模型.这非常类似于面向对象编程中的类/子类,但实现起来更加尴尬,并且没有RDBMS(我知道)本身支持它们.一般的想法是:

>您定义类型(建筑物),为其创建表格,为其指定主键
>您定义了两个或更多子类型(此处为Hospital,Clinic,School,University),为每个子类型创建表,生成主键…但主键也是引用Building表的外键
>现在可以使用外键在Building表上构建具有一个“ObjectType”列的表.您必须加入几张桌来确定它是什么类型的建筑物,但无论如何您都必须这样做.那,或存储冗余数据.

您已经注意到此型号的问题,对吧?什么阻止建筑物在两个或多个子类型表中输入?很高兴你问:

>向Building添加一个列,也许是“BuildingType”,比如char(1),允许值为{H,C,S,U},表示(duh)类型的建筑物.
>在BuildingID BuildingType上构建唯一约束
>在子表中有BulidingType列.对它进行检查约束,以便它只能设置为值(Hospitals表的H等).理论上,这可以是计算列;在实践中,由于以下步骤,这将无法工作:
>构建外键以使用两列关联表

Voila:给定一个类型为H的BUILDING行,SCHOOL表中的一个条目(类型S)不能设置为引用该Building

你会记得我确实说它很难实现.

事实上,最大的问题是:这值得做吗?如果有意义的是将四个(或更多,如时间)建筑类型实现为类型/子类型(进一步的规范化优势:一个地址用于地址和每个建筑物共有的其他属性,特定于建筑物的属性存储在子表中),构建和维护可能值得付出额外的努力.如果没有,那么你就回到原点:一个在现代普通RDBMS中难以实现的逻辑模型.

猜你在找的MsSQL相关文章