处理类别,子类别 - 分层数据的最佳方法是什么?

时间:2009-04-25 18:58:41

标签: sql tree rdbms hierarchical-data

重复:

  

SQL - how to store and navigate hierarchies


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

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

编辑:希望sql在可能的情况下将列表取回

谢谢。

5 个答案:

答案 0 :(得分:2)

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 *并在应用层中以算法方式组装树。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

创建与自身关系的表是执行相同操作的最佳方式。它的容易性和灵活性在您希望的范围内没有任何限制。我不认为我需要重复你应该提出的结构,因为已经在第一个答案中提出了这个结构。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

你最终会做很多不喜欢使用索引的Like或midstring查询。你最终解析了很多东西。