【问题标题】:What the best way to handle categories, sub-categories - hierachical data?处理类别、子类别 - 分层数据的最佳方式是什么?
【发布时间】:2009-04-25 18:58:40
【问题描述】:

复制:

SQL - how to store and navigate hierarchies


如果我有一个客户需要类别、子类别、子子类别等的数据库,那么最好的方法是什么?如果他们只需要三个,并且总是知道他们需要三个,我可以创建三个表 cat、subcat、subsubcat 等。但是,如果他们想要更深入怎么办?我不喜欢这三张桌子,但这是我知道的唯一方法。

我见过“sql adjacency list”,但不知道这是否是唯一可行的方法。我希望输入,以便客户可以拥有任何级别的类别和子类别。我相信这意味着分层数据。

编辑:如果可能的话,希望 sql 将列表恢复出来

谢谢。

【问题讨论】:

  • 你已经在这里呆了很长时间,知道这将是重复的。

标签: sql tree rdbms hierarchical-data


【解决方案1】:
table categories: id, title, parent_category_id


 id | title | parent_category_id
----+-------+-------------------
  1 |  food |              NULL
  2 | pizza |                 1
  3 | wines |              NULL
  4 |   red |                 3
  5 | white |                 3
  6 | bread |                 1

我通常会做一个select * 并在应用层通过算法组装树。

【讨论】:

  • 但是如果你将一个类别与两个父类别相关联呢? ;-)
  • @Patrik:树结构中的节点只有 1 个父节点。这是我在这里假设的。如果您需要多个父节点的可能性,那么您需要另一个表来将一个节点与多个父节点相关联。
【解决方案2】:

您可以看看 Joe Celko 的书,或 this previous question

【讨论】:

    【解决方案3】:

    创建一个与自身相关的表是最好的方法。它可以轻松灵活地达到您想要的程度,没有任何限制。我认为我不需要重复您应该放置的结构,因为在第一个答案中已经提出了建议。

    【讨论】:

      【解决方案4】:

      我使用了多种方法,但仍然坚持简单的"id, parent_id" 表内关系,其中根项目具有parent_id=0。如果您需要大量查询树中的项目,特别是当您只需要“分支”或一个节点的所有底层元素时,您可以使用第二张表:"id, path_id, level" 持有对 each 的引用each 节点的上行路径中的 em> 节点。这可能看起来像很多数据,但它在使用时极大地改进了分支查找,并且在触发器中呈现非常易于管理。

      【讨论】:

        【解决方案5】:

        不是推荐的方法,但我看到人们在数据上使用点符号。 Food.Pizza 或 Wines.Red.Cabernet

        您最终会执行大量的 Like 或 midstring 查询,这些查询并不能很好地使用索引。你最终会解析很多东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多