多个表之间的Postgresql树关系

时间:2019-11-23 20:47:41

标签: postgresql tree

说我有三个不同的表:ObjectAObjectBObjectC。每个列都有一组几乎不同的列,因此在同一个表中对它们进行建模实际上并不起作用,但是我想对它们之间的父子树关系进行建模。

棘手的是,尽管每棵树的根都是ObjectA类型,但ObjectB和ObjectC可以将ObjectA,ObjectB或ObjectC中的任何一个作为父代。

所以一棵树的例子可能像这样:

enter image description here

此外,有可能在某个时候我可能想要添加和ObjectD表一起放在同一棵树中。

我将需要进行检索以获取孩子的父母的查询,还需要进行检索以获取父母的所有孩子的查询。

我最初计划使用postgresql继承来实现此目的,方法是使每个表都继承自Branch表,并将Branch表作为每个表的Parent列中的外键。但是this question中的一位评论者说服我,通过继承实现多态关系并不是解决此问题的好方法。

以下是我可以描述的其他解决方案:

  1. 在每个分支中都有三个外键列:objectA_parent int references objectA.id, objectB_parent int references objectB.id, objectC_parent int references objectC.id,带有某种约束以确保其中只有一个不为null。这是最简单的解决方案,唯一的麻烦就是如果我必须添加另一种父母。

  2. 创建一个单独的Parent表。父表将具有自己的id列,并且是任何分支的Parent列中的外键,并且将具有与上述相似的列集。这样做的好处是,如果我计划添加更多类型的父母,则只需更改此表。但是我不知道寻找父母和孩子会变得困难得多。制作Parent表有两种方法:

    • parent表和每个子对象之间一对一,parent表和父对象之间一对多。
    • parent表和每个父对象之间
    • 一对一,在子项和parent表之间一对多。然后,我还可以使每个父对象都有一个childref列,该列将引用parent表中的它的列,这可能会加快搜索速度。

这些都是好主意吗?还有我没想到的更好的解决方案吗?

0 个答案:

没有答案