gpt4 book ai didi

sql-server - 外键引用多个表

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:05 25 4
gpt4 key购买 nike

我有一个带有唯一标识符的列,它可能引用四个不同表中的一个。我已经看到以两种方式完成此操作,但这两种方式似乎都是不好的做法。

首先,我看到了一个 ObjectID 列,但没有明确声明它是特定表的外键。然后你可以在其中插入任何你想要的唯一标识符。这意味着您可能会从不属于我想要的 4 个表的表中插入 ID。

其次,因为数据可以来自四个不同的表,所以我也看到有人制作了 4 个不同的外键。在这样做时,系统依赖于一个且只有一个具有非 NULL 值的列。

执行此操作的更好方法是什么?例如,我表中的记录可能会引用医院 (ID)、诊所 (ID)、学校 (ID) 或大学 (ID)...但仅限于这些表。

谢谢!

最佳答案

您可能需要考虑类型/子类型数据模型。这非常类似于面向对象编程中的类/子类,但实现起来要困难得多,并且没有 RDBMS(据我所知)原生支持它们。总体思路是:

  • 你定义了一个类型(建筑),为它创建一个表,给它一个主键
  • 您定义两个或多个子类型(这里是医院、诊所、学校、大学),为每个子类型创建表,创建主键……但主键也是引用建筑表的外键
  • 现在可以使用外键在 Building 表上构建具有一个“ObjectType”列的表。您必须连接几张表才能确定它是什么类型的建筑物,但无论如何您都必须这样做。那,或者存储冗余数据。

你已经注意到这个模型的问题了,对吧?是什么阻止建筑物在两个或多个子类型表中有条目?很高兴你问:

  1. 向 Building 添加一列,也许是“BuildingType”,例如 char(1),允许值为 {H, C, S, U} 指示(duh)建筑物类型。
  2. 对 BuildingID + BuildingType 建立唯一约束
  3. 子表中有 BulidingType 列。对其设置检查约束,以便它只能设置为值(H 表示医院表等)。理论上,这可能是一个计算列;实际上,由于以下步骤,这是行不通的:
  4. 构建外键以使用两列关联表

瞧:给定一个类型为 H 的 BUILDING 行集,不能将 SCHOOL 表(类型为 S)中的条目设置为引用该建筑物

你会记得我说过很难实现。

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

关于sql-server - 外键引用多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com