SQL表设计:多个外键列或“常规”;fkName";及;“价值”;柱

SQL表设计:多个外键列或“常规”;fkName";及;“价值”;柱,sql,sql-server,database-design,Sql,Sql Server,Database Design,给定一个表(联系人),该表可应用于数据库中存储在不同表中的不同项目(雇主、教堂、医院、政府团体等),最后利用此单一联系人表时,我发现将联系人关联回一个特定“项目”有两种选择 每个“项”类型有一列与外键关联,这将生成一个如下所示的表: 一列表示“项”的类型(fkName),一列表示对应于该类型项的值(fkValue)。这将生成一个如下所示的表: 第一个意味着在X个可能的外键中,X-1将为NULL,但我得到了硬关联外键的优势 第二种方法是,我可以将fkName和fkValue设置为NOTNU

给定一个表(联系人),该表可应用于数据库中存储在不同表中的不同项目(雇主、教堂、医院、政府团体等),最后利用此单一联系人表时,我发现将联系人关联回一个特定“项目”有两种选择

  • 每个“项”类型有一列与外键关联,这将生成一个如下所示的表:
  • 一列表示“项”的类型(fkName),一列表示对应于该类型项的值(fkValue)。这将生成一个如下所示的表:
第一个意味着在X个可能的外键中,X-1将为NULL,但我得到了硬关联外键的优势

第二种方法是,我可以将fkName和fkValue设置为NOTNULL,但我没有获得DB支持的外键的优点


最终,是否有一个“正确”的答案?是否还有其他我没有考虑过的优点/缺点(性能、安全性、增长/扩展)?

我认为第二个选项更好,因为它允许您使用内置SQL功能(外键)维护数据库的引用完整性,而不是依赖代码来维护它。

我认为第二个选项更好,因为它允许您使用内置SQL功能(外键)来维护数据库的引用完整性,而不是依赖代码来维护它。

我认为第二个选项更好,因为它允许您使用内置SQL功能(外键)来维护数据库的引用完整性,而不是依赖代码来维护它。

我认为第二个选项更好,因为它允许您使用内置SQL功能(外键)来维护数据库的引用完整性,而不是依赖代码来维护它。

这是您应该朝着的解决方案:

type ---------------- typeId name 1 hospital 2 church contact ----------------------------------------- contactId firstName LastName typeId (fk) 1 bob is 1 2 your uncle 2 类型 ---------------- 类型ID名称 1医院 2教堂 接触 ----------------------------------------- 联系人ID名字姓氏类型ID(fk) 1鲍勃是1 你叔叔
如果Bob可以是多种类型的联系人,则您将需要一个连接表。

这是您应该采用的解决方案:

type ---------------- typeId name 1 hospital 2 church contact ----------------------------------------- contactId firstName LastName typeId (fk) 1 bob is 1 2 your uncle 2 类型 ---------------- 类型ID名称 1医院 2教堂 接触 ----------------------------------------- 联系人ID名字姓氏类型ID(fk) 1鲍勃是1 你叔叔
如果Bob可以是多种类型的联系人,则您将需要一个连接表。

这是您应该采用的解决方案:

type ---------------- typeId name 1 hospital 2 church contact ----------------------------------------- contactId firstName LastName typeId (fk) 1 bob is 1 2 your uncle 2 类型 ---------------- 类型ID名称 1医院 2教堂 接触 ----------------------------------------- 联系人ID名字姓氏类型ID(fk) 1鲍勃是1 你叔叔
如果Bob可以是多种类型的联系人,则您将需要一个连接表。

这是您应该采用的解决方案:

type ---------------- typeId name 1 hospital 2 church contact ----------------------------------------- contactId firstName LastName typeId (fk) 1 bob is 1 2 your uncle 2 类型 ---------------- 类型ID名称 1医院 2教堂 接触 ----------------------------------------- 联系人ID名字姓氏类型ID(fk) 1鲍勃是1 你叔叔
如果Bob可以是多种类型的联系人,那么您将需要一个连接表。

第二种方法是反模式

您需要在每个实体(医院、教堂、雇主、政府团体等)和联系人之间建立多对多关系表


如果您想更容易地查询与联系人相关的所有实体,请考虑在多对多关系表的顶部创建视图。 第二种方法是反模式

您需要在每个实体(医院、教堂、雇主、政府团体等)和联系人之间建立多对多关系表


如果您想更容易地查询与联系人相关的所有实体,请考虑在多对多关系表的顶部创建视图。 第二种方法是反模式

您需要在每个实体(医院、教堂、雇主、政府团体等)和联系人之间建立多对多关系表


如果您想更容易地查询与联系人相关的所有实体,请考虑在多对多关系表的顶部创建视图。 第二种方法是反模式

您需要在每个实体(医院、教堂、雇主、政府团体等)和联系人之间建立多对多关系表


如果您想更容易地查询与联系人相关的所有实体,请考虑在多对多关系表的顶部创建视图。 你的第一个想法是否定的。如果你有一个类型列表,那么你的第二个想法是肯定的。“通用”(或“泛型”)方法不能真正保证引用的完整性,因此在我看来对你的第一个想法毫无用处。如果你有一个类型列表,那么你的第二个想法是肯定的。“通用”(或“泛型”)方法不能真正保证引用的完整性,因此在我看来对你的第一个想法毫无用处。如果你有一个类型列表,那么你的第二个想法是肯定的。“通用”(或“泛型”)方法不能真正保证引用的完整性,因此在我看来对你的第一个想法毫无用处。如果你有一个类型列表,那么你的第二个答案是肯定的。“通用”(或“泛型”)方法不能真正保证引用的完整性,因此在我看来是无用的