问题 分层数据模型:邻接列表与嵌套集


我有一个产品目录。每个类别由不同数量(深度)的子类别组成。等级(深层)的数量是未知的,但我确信它不会超过5,6等级。数据变化很少读取。

问题是:什么类型的分层数据模型更适合这种情况。该项目基于Django框架,应该考虑它的特点(管理员i-face,模型处理......)。

非常感谢!


12003
2018-05-27 12:34


起源



答案:


Nested sets 如果您不需要频繁更新或分层排序,则性能更佳。

如果您需要树更新或分层排序,最好使用 parent-child 数据模型。

它很容易构建 Oracle 和 SQL Server 2005+,并不是那么容易(但仍然可能) MySQL


4
2018-05-27 12:40





对于这种分层数据,我会使用Modified Preorder Tree Traversal算法MPTT。如果您不介意对结构的更改进行一些惩罚,这可以在遍历树和寻找子项时获得出色的性能。

幸运的是Django有一个很棒的图书馆, Django的MPTT。我已经在许多项目中使用了这个并取得了很大的成功。还有 Django的树胡 它提供了几种替代算法,但我没有使用它(并且它似乎并不像mptt那样流行)。


4
2018-05-27 13:46



注意:MPTT和“嵌套集”是同一概念的不同名称。 - jwfearn


答案:


Nested sets 如果您不需要频繁更新或分层排序,则性能更佳。

如果您需要树更新或分层排序,最好使用 parent-child 数据模型。

它很容易构建 Oracle 和 SQL Server 2005+,并不是那么容易(但仍然可能) MySQL


4
2018-05-27 12:40





对于这种分层数据,我会使用Modified Preorder Tree Traversal算法MPTT。如果您不介意对结构的更改进行一些惩罚,这可以在遍历树和寻找子项时获得出色的性能。

幸运的是Django有一个很棒的图书馆, Django的MPTT。我已经在许多项目中使用了这个并取得了很大的成功。还有 Django的树胡 它提供了几种替代算法,但我没有使用它(并且它似乎并不像mptt那样流行)。


4
2018-05-27 13:46



注意:MPTT和“嵌套集”是同一概念的不同名称。 - jwfearn


根据这些文章:

http://explainextended.com/2009/09/24/adjacency-list-vs-nested-sets-postgresql/ http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/

“MySQL是四大系统中的唯一系统(MySQL,Oracle,SQL Server,PostgreSQL),嵌套集模型显示出良好的性能,可以被认为是存储的分层数据。”


4
2017-08-15 05:23



天哪...比较什么?我发现Nested Sets几乎打破了比赛的大门。例外是Oracle中CONNECT BY的功能。 - Jeff Moden


http://www.sqlsummit.com/AdjacencyList.htm


1
2017-07-12 11:36





邻接列表更容易维护,嵌套集的查询速度要快得多。

问题一直是将邻接列表转换为嵌套集已经取得了很长的成功,这要归功于一个非常讨厌的“推送栈”方法,它加载了RBAR。因此,人们最终在嵌套集中进行一些非常困难的维护或不使用它们。

现在,你也可以吃蛋糕了!您可以在不到4秒的时间内在100,000个节点上进行转换,在不到一分钟的时间内完成100万行的转换!顺便说一句,全部都是T-SQL!请参阅以下文章。

类固醇的层次结构#1:将邻接列表转换为嵌套集

类固醇的层次结构#2:嵌套集计算的替换


0
2018-03-04 02:32