我会尝试尽可能清楚地揭露;)
好吧,我需要存储一些可以链接到自己的数据作为父>儿童关系,无限制。
我的第一次尝试是:
entry_id | parent_id | value
1 | NULL | Foo //foo is the grand parent
2 | 1 | Bar //bar is child of Foo
3 | 1 | Baz //baz too
4 | 2 | Bho //bho is child of Bar
5 | 4 | Som //som is child of Bho
6 | NULL | Git //another grand parent
7 | 6 | Tim //Git's child
..等等。
这个结构有效,但是它是不可能的(或者至少,我不能完成)只用1个查询找到所有的Foo孩子和'子子'。这需要一个循环。
我的目标是为SELECT查询优化一个结构,可以一次性给我所有的关系,如:
SELECT "ALL SONS OF Bar"
输出:
entry_id | parent_id | value
1 | NULL | Bar
4 | 2 | Bho
5 | 4 | Som
但这种结构似乎不允许我这样做。
有什么想法吗?
如果可以,我会在Postgresql上运行(我想使用数组字段类型,但查询不会太快)
philip评论的编辑:根据我的具体情况,数据不应经常更改,但我可能需要将此结构用于其他类似的任务 - 但不等于 - 数据可以在哪里多次更新。
作为附注,使用外键(或类似行为)将是最好的(删除一个'父亲'应该删除所有孩子 - 不允许孤儿)
答案 0 :(得分:11)
我认为你会从阅读Managing Hierarchical Data in MySQL中受益。它讲述了如何将平面表转换为只有几个属性和一些内务处理的层次结构。即使你不会这样做,也很有见地。
对于PostgreSQL,您可以使用WITH RECURSIVE
个查询WITH Queries (Common Table Expressions)进行查询
您至少需要8.4版才能使用它们。
答案 1 :(得分:6)
Bill Karwin对分层数据进行了精彩的幻灯片演示:
http://www.slideshare.net/billkarwin/models-for-hierarchical-data
正如jmz已经说过的那样,递归查询是一个真正的问题解决者。