我有一个具有两个实体之间的父子关系的模式。它是一对多的,所以自然会实现为:
table Parents
id
table Children
id
parent_id
但是,我还需要将其中一个孩子视为特例(我们称其为“提升”孩子)。我可以想到几种方法来做到这一点,包括:
只需将属性放在Children
:
table Parents
id
table Children
id
parent_id
is_promoted
这显然是有缺陷的,因为数据库不能保证一致性(至少不能通过常规外键约束)
在表上创建外键Parents
:
table Parents
id
promoted_child_id
table Children
id
parent_id
这是我的第一个倾向,但它确实具有循环依赖的明显缺点,因此可能不是最优的。
Children
我能想到的另一种选择是在桌子上放第二个外键:
table Parents
id
table Children
id
parent_id
promoted_parent_id
这允许我放置一个唯一的索引,从而强制数据库的一致性。这样做的一个问题是,可能存在一种无意义的关系,其中父母 A 的孩子列为父母 B 的提升。
我能想到的最后一个选项是创建一个中间表,例如:
table Parents
id
table Children
id
table ParentChildRelationship
parent_id
child_id
is_promoted
parent_id
同样,我可以在+上声明一个唯一约束is_promoted
,强制一致性。我对此有点矛盾,因为将关系提升为一个完整的实体似乎有点矫枉过正,尽管我在它上面加上属性的那一刻(本质上is_promoted
是),我想这是有道理的。
我想知道您认为处理此问题的规范方法是什么。特别是,我使用的是 Rails,所以这可能会影响最实用的解决方案。