说我有三个不同的表:ObjectA
,ObjectB
和ObjectC
。每个列都有一组几乎不同的列,因此在同一个表中对它们进行建模实际上并不起作用,但是我想对它们之间的父子树关系进行建模。
棘手的是,尽管每棵树的根都是ObjectA类型,但ObjectB和ObjectC可以将ObjectA,ObjectB或ObjectC中的任何一个作为父代。
所以一棵树的例子可能像这样:
此外,有可能在某个时候我可能想要添加和ObjectD表一起放在同一棵树中。
我将需要进行检索以获取孩子的父母的查询,还需要进行检索以获取父母的所有孩子的查询。
我最初计划使用postgresql继承来实现此目的,方法是使每个表都继承自Branch表,并将Branch表作为每个表的Parent列中的外键。但是this question中的一位评论者说服我,通过继承实现多态关系并不是解决此问题的好方法。
以下是我可以描述的其他解决方案:
在每个分支中都有三个外键列:objectA_parent int references objectA.id, objectB_parent int references objectB.id, objectC_parent int references objectC.id
,带有某种约束以确保其中只有一个不为null。这是最简单的解决方案,唯一的麻烦就是如果我必须添加另一种父母。
创建一个单独的Parent
表。父表将具有自己的id
列,并且是任何分支的Parent
列中的外键,并且将具有与上述相似的列集。这样做的好处是,如果我计划添加更多类型的父母,则只需更改此表。但是我不知道寻找父母和孩子会变得困难得多。制作Parent
表有两种方法:
parent
表和每个子对象之间一对一,parent
表和父对象之间一对多。parent
表和每个父对象之间parent
表之间一对多。然后,我还可以使每个父对象都有一个childref
列,该列将引用parent
表中的它的列,这可能会加快搜索速度。这些都是好主意吗?还有我没想到的更好的解决方案吗?