一段时间以来,我一直在努力解决如何最好地处理SQL中的层次结构。由于邻接列表的限制和MPTT /嵌套集的复杂性而感到沮丧,我开始考虑简单地存储密钥路径,作为一个简单的node_key/node_key/...
字符串。我决定编译这三种技术的优点和缺点:
存储的路径技术使用与每个用例中的其他技术相同或更少的调用,除了一个。通过这种分析,存储路径是明显的赢家。更不用说,它实现起来要简单得多,人类可读等等。
所以问题是,不应该将存储路径视为比MPTT更强大的技术吗?为什么存储路径不是更常用的技术,为什么不在给定实例中使用MPTT?
另外,如果您认为此分析不完整,请告知我们。
至少有两件事MPTT可以开箱即用,存储的路径解决方案不会:
答案 0 :(得分:9)
您可能还会考虑我在What is the most efficient/elegant way to parse a flat table into a tree?
的回答中描述的闭包表设计还有其他一些注意事项:
我还在演示文稿Models for Hierarchical Data with SQL and PHP和我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中介绍了封闭表。
答案 1 :(得分:3)
您的结论存在的问题是,它忽略了使用树木时涉及的大多数问题。
通过将技术的有效性降低到“调用次数”,您可以有效地忽略所有理解数据结构和算法试图解决的问题;也就是说,执行速度最快,内存和资源占用率低。
SQL服务器的“调用次数”似乎是一个很好的度量标准(“少看代码”),但如果结果是一个永不完成的程序,运行缓慢,或占用太多空间,它实际上是一个无用的指标。
通过存储每个节点的路径,您不会创建树数据结构。相反,您正在创建一个列表。树的任何优化操作都会丢失。
使用小日期集可能很难看到(在很多小树的情况下,列表更好),尝试一些大小为500,1000,10k的数据集的示例 - 您将很快看到为什么存储整个路径不是一个好主意。