数据库设计:分层结构的最佳实践

Str*_*rae 4 postgresql database-design data-structures

我会尝试尽可能清楚地揭露;)

好吧,我需要存储一些可以链接到自己的数据作为父>子关系,没有限制深度.

我的第一次尝试是:

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
Run Code Online (Sandbox Code Playgroud)

..等等.

这种结构的工作原理,但它是不可能的(或至少,我不能去throught)找到所有的富孩子的和"子孩子的"只有1查询.这需要一个循环.

我的目标是为SELECT查询优化一个结构,它可以一次性给我所有关系,例如:

 SELECT "ALL SONS OF Bar"
Run Code Online (Sandbox Code Playgroud)

输出:

  entry_id | parent_id | value
     1     |   NULL    |  Bar
     4     |    2      |  Bho
     5     |    4      |  Som
Run Code Online (Sandbox Code Playgroud)

但这种结构似乎不允许我这样做.

任何的想法?

如果可以,我将在Postgresql上运行(我想使用数组字段类型,但查询不会太快)

编辑为菲利普评论:在我的具体的数据不应该过于频繁地改变,但我可能会需要使用这种结构用于其他任务相似-但不equal-其中数据可以很多很多次更新.

作为旁注,使用外键(或类似行为)将是最好的(删除一个'父亲'应该删除所有孩子 - 不允许孤儿)

jmz*_*jmz 11

我想你会从阅读MySQL中的管理层次数据中受益.它讲述了如何将平面表转换为只有几个属性和一些内务处理的层次结构.即使你不打算这样做,它也很有见地.

对于PostgreSQL,您可以使用WITH RECURSIVE查询来执行:WITH Queries(公用表表达式).
您至少需要8.4版才能使用它们.


Fra*_*ens 6

Bill Karwin对分层数据进行了精彩的幻灯片演示:

http://www.slideshare.net/billkarwin/models-for-hierarchical-data

正如jmz已经说过的那样,递归查询是一个真正的问题解决者.

  • 如果您观看幻灯片,请特别注意嵌套集模型.另请注意,邻接列表是您的设计. (2认同)