如何处理引用两个表的可为空的主键

时间:2019-10-25 19:47:39

标签: sql-server database-design

我有一个包含三个表的数据库,分别称为cql> show version; [cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4] foobarbaz的每个实例都引用bar的实例,尽管在baz表中可能没有引用baz的实例。在大多数情况下,bar的实例将引用foo的实例(因此可以映射到bar的实例。)但是在某些情况下,{{1}的实例}将直接引用baz表。

Possible ERD

在不存在foo-baz关系的简化版本中,我可以轻松地使foo成为baz表的主键的一部分,除了在barid偶尔为null之外,我想在这里做这件事。

因此,foo表中的示例可能如下所示:

barid

问题在于如何处理为foo表创建主键。我应该使用唯一索引而不是约束吗?为了连接foo和fooid barid bazid 1 1 NULL 2 2 NULL 3 NULL 9 4 17 NULL 表,我还可以创建foo的虚拟实例。在这种情况下,我可以添加一个bar字段,这样我就知道是什么情况。我敢肯定有人会告诉我为什么这是个坏主意。

1 个答案:

答案 0 :(得分:0)

在不了解应用程序和实现的情况下,无法直接回答该问题。请在下面查看为表之间的关系而创建的其他排列。

fooid    barid    bazid
    1        1     NULL
    2        2     NULL
    3     NULL        9
    4       17     NULL
    5       18     6
    6       14     6
    6       18     10

该问题的通用答案是请不要创建伪值,而bar id主键将仅是fooid。如果fooid,barid和bazid总是唯一的,则添加唯一约束。