SQL Server 数据库中的表具有互斥外键的最佳实践

2024-05-09

在这里,我正在寻找针对以下问题的优缺点的最佳解决方案:-

Entity1(E1(pk)) 与其他不同的列
Entity2(E2(pk)) 与其他不同的列
Entity3(E3(pk)) 与其他不同的列

我需要创建之间的关系Entity1 and Entity3(E1 应该作为 FKEntity3,也想在之间建立关系Entity2 and Entity3(E2 应该作为 FKEntity3)

但是有两个外键E1 and E2必须是互斥的 - 所以每条记录Entity3表可以连接到Entity1 or Entity2,但不能同时进行。

解决方案1:- 在 Entity3 中,我将有两列 E1 和 E2,但在此情况下,E1 或 E2 始终为空。

解决方案2:- 我可以在每个表中复制具有不同 FK 的 Entity3 表,但在此,我必须重复 Entity3 的架构。

解决方案3:- 我在 Entity3 表中只有一列,该列上没有 FK。另外,我将引入一列用于表示 Entity1 或 Entity2 表条目的类型,但在此情况下,我将无法遵循数据完整性。

请让我知道这种情况的最佳答案或任何其他可以克服我上述缺点的方法。


在您在问题中建议的解决方案之间,我绝对会选择解决方案1#- 为每个外键添加不同的列 - 还向外键添加检查约束Entity3表,确保每一行至少其中一列为空 - 如下所示:

ALTER TABLE Entity3
    ADD CONSTRAINT ck_MutuallyExclusiveFK 
    CHECK (FK1 IS NULL OR FK2 IS NULL)
GO

如果你想确保至少一列不为空,你可以这样做:

ALTER TABLE Entity3
    ADD CONSTRAINT ck_MutuallyExclusiveFK 
    CHECK ((FK1 IS NULL OR FK2 IS NULL) AND (FK1 IS NOT NULL OR FK2 IS NOT NULL))
GO

解决方案#3 是迄今为止最糟糕的。您不仅会失去数据完整性,还会增加类型列的复杂性。

解决方案#2也很糟糕,因为同一实体有多个表是一个糟糕的设计 - 不仅是因为处理重复项的维护问题,还因为它是同一实体这一事实意味着您可能需要将这些重复项视为同一个表整个数据库和应用程序代码,这可能会导致很多问题并跳过各种解决方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 数据库中的表具有互斥外键的最佳实践 的相关文章

随机推荐