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

时间:2009-05-27 12:34:17

标签: database django django-models hierarchy hierarchical-data

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

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

非常感谢!

5 个答案:

答案 0 :(得分:4)

如果您不需要频繁更新或分层排序,

Nested sets会提高性能。

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

它可以在OracleSQL Server 2005+中轻松构建,而MySQL中不容易(但仍然可以)。

答案 1 :(得分:4)

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

幸运的是Django有一个很棒的库,django-mptt。我已经在许多项目中使用了这个并取得了很大的成功。还有django-treebeard提供了几种替代算法,但我还没有使用它(而且它似乎并不像mptt那样受欢迎)。

答案 2 :(得分:4)

根据这些文章:

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),嵌套集合模型显示出良好的性能,可以考虑存储分层数据。”

答案 3 :(得分:1)

答案 4 :(得分:0)

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

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

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

Hierarchies on Steroids #1: Convert an Adjacency List to Nested Sets

Hierarchies on Steroids #2: A Replacement for Nested Sets Calculations