如果我的数据库中客户端需要类别,子类别,子子类别等,那么最好的方法是什么?如果他们只需要三个,并且总是知道他们需要三个,我可以创建三个表cat,subcat,subsubcat等。但如果他们想进一步深度呢?我不喜欢这三张桌子,但这是我知道怎么做的唯一方式。
我看过“sql adjacency list”,但不知道这是否是唯一可行的方法。我希望输入,以便客户可以有任何级别的类别和子类别。我相信这意味着分层数据。
编辑:希望sql在可能的情况下将列表取回
谢谢。
答案 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查询。你最终解析了很多东西。