层次数据模型。邻接列表与嵌套集的比较

问题描述 投票:11回答:5

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

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

非常感谢!我有一个产品目录。

database django django-models hierarchy hierarchical-data
5个回答
5
投票

Nested sets 是更好的性能,如果你不需要频繁的更新或分级排序。

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

它很容易在 OracleSQL Server 2005+而不是那么容易(但仍有可能),在 MySQL.


4
投票

对于这种分层数据,我会使用修改后的预排序树遍历算法,MPTT。如果你不介意对结构的改变有一点惩罚的话,这可以让你在遍历树和寻找子代时有很好的表现。

幸运的是,Django有一个很好的库可用于此。django-mptt. 我在一些项目中使用了这个方法,取得了很大的成功。还有 django-treebeard 它提供了几种可供选择的算法,但我还没有用过它(反正它似乎没有mptt那么受欢迎)。


4
投票

根据这些文章。

http:/explainextended.com20090924adjacency-list-vs-nested-set-postgresql。http:/explainextended.com20090929adjacency-list-vs-nested-set-mysql。

"MySQL是四大系统(MySQL、Oracle、SQL Server、PostgreSQL)中唯一一个嵌套集模型表现出不错的性能,可以考虑存储分层数据的系统。"



1
投票

Adjacency List更容易维护,而Nested Sets的查询速度要快得多。

问题一直是,将Adjacency List转换为Nested Sets需要花费太长的时间,这要归功于一个非常讨厌的 "push stack "方法,该方法加载了RBAR。 所以人们最终在Nested Sets中做了一些非常困难的维护,或者不使用它们。

现在,你也可以吃到你的蛋糕了! 你可以在10万个节点上用不到4秒的时间进行转换,在100万行上用不到1分钟的时间进行转换! 顺便说一下,所有这些都是在T-SQL中完成的! 请看下面的文章。

Hierarchies on Steroids #1:将邻接列表转换为嵌套集。

层次结构#2:嵌套集计算的替代品

© www.soinside.com 2019 - 2024. All rights reserved.