外键通常采用以下形式:
A <━━ X
(意思是X引用A,一对多关系)
但现在,还有一件新东西也可以有X.
nieve表示可能看起来像这样:
A <━┳━ X
B <━┛
在这种情况下,X将有两个外键,其中一个为null。我个人讨厌空(每个人都应该这样?),所以这对我来说是不可接受的。
接下来最好的事情可能是这样的:
X
^
┣━━━━━━┓
┃ ┃
┃ ┃
A <━━ AX ┃
┃
B <━━━━━━━━━ BX
所以在这种情况下,AX和BX是两个关联表(IMO应该通过键引用X以使它们与X具有一对一的关系,以帮助实施与以前相同的约束)
虽然这种方法运行得很好,但是当我添加表C和D时它也会变得过于复杂。
所以我想出的下一个模型看起来像这样:
hX <━━ X
^
┃
┣━━━━━┳━━━━━┓
┃ ┃ ┃
┃ ┃ ┃
A B C
所以我真的很喜欢这个型号,但我真的不知道该怎么称呼它。这是标准模式吗?有没有更好的模式来解决这个问题?我在哪里可以阅读更多类似的内容?
如果它不是标准模式,我该怎么称呼&#34; hX&#34;表?关联表通常只将两个表名连接在一起,但在这种情况下,它不是关联表,部分原因是它有3个不同的引用。
我可以把它称为&#34; CanHaveX&#34;,但那有点罗嗦
&#34; XAnchor&#34;看起来很亲密,但我真正想要的是&#34; XAnchorPoint&#34;?
我个人喜欢&#34; XCleat&#34; (因为有一个cleat放在他们希望保留其他内容的东西上),因为这允许表A有一个X引用它,但这个术语有点奇怪。
答案 0 :(得分:0)
TL; DR 你对FK(外键)持有的原因没有任何意义,但似乎可能是A,B&amp; C值/实体类型是hX的子类型。 Google SQL /数据库子类型/继承/多态。多个可空的FK是一种常见的反模式,通常也被描述为多个表的FK [原文如此]。其中一个名称是Class Table Inheritance。另一方面,只要 FK成立,我们就可以定义 这样的一种子类型,因此在业务/应用程序术语中不一定有任何重要因为你看到一棵FK树。目前还不清楚你认为你过度复杂的过程是什么?#34;是。表格代表n-ary业务/应用程序关系(船舶)s / association,在您的情况下,某些值/实体是As,Bs和/或Cs,并且每个X都与其他值/实体相关。
这个答案的其余部分解释了如何从一个像你的原始反模式这样的设计转移到可以为空的FK,而不是一般情况下。
SQL FK(外键)是一组列,其中非null子行值在其他位置显示为PK / UNIQUE。每个FK都应该声明或跟随FKs&amp;声明的其他约束。 (通常未声明的FK遵循传递性声明的FK。)
如果您不想要一个可以为空的列的表,那么您需要多个表。这与您的FK正交。一个表就像原始表一样,列被删除,原始投影在所有其他列上。其他表有一些原始表CK(候选键)列加上一些您不想要为空的列,保留原始子列不为空的列。请注意,第二个中的CK是引用第一个CK的FK。并且CK FK不是原始表中可以为空的。
约束遵循表的含义以及可能出现的业务/应用程序情况。只是碰巧两个具有相同CK值的表可以被它们的连接替换,反之亦然。此外,如果第一个具有CK值的超集,则可以用左连接替换它们,反之亦然。这恰好是CK从第二个到第一个的FK。这反转了上面的零消除。它与第二个获取空值的列本身是否为FK无关。当我们应该或不应该或不能或不能使用多个表时,他们的联接是标准化为更高NF的主题(正常形式)。
没有任何特定的设计模式可以通过专门消除可空的FK来实现。只需使用适当的信息建模和数据库设计原则,包括标准化,包括识别相关约束,查找记录您想要的表格/含义。然后确定进一步的约束然后写声明。
What to do with null values when modeling and normalizing?
What is the difference between an entity relationship model and a relational model?