对于其他3个表具有FK的表的推荐结构

时间:2011-03-31 06:21:18

标签: sql sql-server foreign-keys

我有一个表格,其中包含3个其他表格的信息。我的设计是这个表将有一个列,它将告诉对象的ID,另一列将告诉对象的类型(以及该行引用的表)。

两个问题:
a)这是最好的设计还是其他更广泛接受的东西?
b)确保ID对给定对象的类型有效的建议程序是什么?

3 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,那么表格中的每一行都会链接到其他三个表格中的一个

您的方法(类型字段+一个外键字段)是一个有效的设计,如果您想要创建一个包含有关您的数据的元信息的通用表,它会很有用(例如应该重新传输以进行复制的记录列表。

另一种可能更适合真正的应用程序级数据的方法,就是有三列,每列都是三个表之一的外键,并添加一个约束,要求这些字段中只有两个为空。具有以下优点:

  • 三个FK不需要具有相同的数据类型。
  • JOIN语法变得更自然(不涉及类型字段)。
  • 您可以在这些FK列上添加参照完整性约束。
  • 您不需要确保类型字段的正确性 - 事实上,您根本不需要类型字段。该类型由一个非空的FK列隐式确定。

答案 1 :(得分:0)

数据库架构设计的基础很简单,但更复杂的情况可能真的很难找出什么是最好的。这里可以发挥很多个人主观性,甚至性能也可能是设计非规范化的一个因素。

除了免责声明之外,我个人建议永远不要使用列来存储多种FK,即FK列应存储仅指向单个表的FK。如果不这样做,则必须将该列数据的级联映射到代码中的多个子选择查询,并且它可能开始变得比预期的更混乱。您给出的“问题2,确保类型和FK之间的有效性”只是整个源代码中整个痛苦世界的开始

假设您将设计更改为每个FK引用使用一个字段,我还会检查主“信息保存表”中的每个FK字段是否对每个记录完全有效。如果没有,我会移出仅在某些时候适用于单独表格的FK列。

答案 2 :(得分:0)

a)我假设你在对象和对象类型之间有一对多的关系。在通常的设计中,你有一个从对象表中的objecttype列到对象类型表的主键的引用

b)我会在关系属性中强制执行引用完整性(这取决于您使用的dbms)。您还可以在更新和删除时使用级联。这样,对象类型表上主键的更新或删除将反映在对象1上,更新其外键列(对象类型列)或删除具有该对象类型的寄存器。