0

复制:

SQL - 如何存储和导航层次结构


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

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

编辑:如果可能的话,希望 sql 能够将列表重新显示出来

谢谢你。

4

5 回答 5

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 *在应用层做一个算法并组装树。

于 2009-04-25T19:00:08.223 回答
2

你可以看看 Joe Celko 的书,或者这个之前的问题

于 2009-04-25T19:01:49.780 回答
0

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

于 2009-04-25T19:03:41.600 回答
0

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

于 2009-04-25T19:16:38.010 回答
0

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

你最终会做很多 Like 或 midstring 查询,这些查询不能很好地使用索引。你最终会解析很多东西。

于 2009-04-26T15:21:15.557 回答