我有产品目录。每个类别由不同数量(深度)的子类别组成。等级(深层)的数量是未知的,但我确信它不会超过5,6等级。数据变化很少,然后读取。
问题是:什么类型的分层数据模型更适合这种情况。该项目基于Django框架,应该考虑它的特点(管理员i-face,模型处理......)。
非常感谢!
答案 0 :(得分:4)
Nested sets
会提高性能。
如果您需要树更新或分层排序,最好使用parent-child
数据模型。
它可以在Oracle
和SQL 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