代码之家  ›  专栏  ›  技术社区  ›  Strae

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

  •  4
  • Strae  · 技术社区  · 16 年前

    好吧,我需要存储一些可以作为父级链接到自己的数据>孩子的关系,无限深。

    我的第一次尝试是:

    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
    

    ……等等。

    这个结构可以工作,但是它不可能(或者至少,我不可能)用一个查询找到所有的Foo childs和'sub childs'。。这需要一个循环。

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

     SELECT "ALL SONS OF Bar"
    

    输出:

      entry_id | parent_id | value
         1     |   NULL    |  Bar
         4     |    2      |  Bho
         5     |    4      |  Som
    

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

    对于philip的评论:在我的特定情况下,数据不应该经常更改,但是我可能需要将此结构用于其他类似的任务(但不是相同的任务),在这些任务中,数据可以多次更新。

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

    2 回复  |  直到 16 年前
        1
  •  11
  •   PaÅ­lo Ebermann    15 年前

    我想你会从阅读中受益的 Managing Hierarchical Data in MySQL

    对于PostgreSQL,您可以使用 WITH RECURSIVE 查询: WITH Queries (Common Table Expressions)
    您至少需要8.4版才能使用它们。

        2
  •  6
  •   Frank Heikens    16 年前

    Bill Karwin制作了一个关于分层数据的幻灯片:

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

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