Sql 具有FK的表的推荐结构适用于其他3个表

Sql 具有FK的表的推荐结构适用于其他3个表,sql,sql-server,foreign-keys,Sql,Sql Server,Foreign Keys,我有一个表,其中将包含其他3个表的信息。我的设计是,这个表将有一列告诉对象的ID,另一列告诉对象的类型,从而该行所指的表 两个问题: a这是最好的设计还是有其他更广为接受的设计? b确保ID对给定对象的类型有效的建议步骤是什么?如果我正确理解了您的问题,那么表中的每一行正好链接到其他三个表中的一个 您的方法类型字段+一个外键字段是一种有效的设计,如果您想创建一个通用表,其中包含有关您的数据的元信息(例如,应重新传输以进行复制的记录列表),则该字段非常有用 另一种可能更适合实际应用程序级数据的方法

我有一个表,其中将包含其他3个表的信息。我的设计是,这个表将有一列告诉对象的ID,另一列告诉对象的类型,从而该行所指的表

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

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

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

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

三个FK不需要具有相同的数据类型。 联接语法变得更加自然,不涉及类型字段。 可以在这些FK列上添加引用完整性约束。 您不需要确保类型字段的正确性——事实上,您根本不需要类型字段。类型由一个不为null的FK列隐式确定。
DB模式设计的基础很简单,但更复杂的情况可能会非常复杂,以找出最佳方案。这里有很多个人主观性可以发挥作用,甚至性能也可以成为设计非规范化的一个因素

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


假设将设计更改为每个FK引用使用一个字段,我还将检查主信息保存表中的每个FK字段是否对每个记录完全有效。如果没有,我会将FK列移出一个单独的表。我假设对象和对象类型之间存在一对多关系。在普通设计中,可以从对象表中的objecttype列引用到对象类型表的主键


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

+1用于3列解决方案。实现一个约束,规定它们只有一个值,这已经被问到了,并且在这里已经成功了。但是这将有意识地使数据库去规范化。这不应该是一个设计问题吗?我知道消费应用程序没有问题。严格地说,是的,它会的,尽管只有引用会被反规范化。如果希望在应用程序级别对其进行规范化,则在服务器和应用程序之间传输数据时,必须在多个FK集和“对象类型+引用”模式之间进行转换,这需要一些开销。但这很容易实现,而且为了确保多个FK提供的数据的引用完整性,似乎价格很低,IMHO。另一个问题:如果这3个外键+第4个字段是主键,会发生什么?我不能将它们设置为可为空。@PedroC88:说得好。我想在这种情况下,您必须使用代理键作为主键,并在FK字段上单独定义唯一性约束。