我有一个产品目录。每个类别由不同数量(深度)的子类别组成。层次(深度)的数量是未知的,但我很确定它不会超过5,6层。数据的变化比读数要少得多。
问题是:什么样的分层数据模型更适合这种情况。这个项目是基于Django框架的,它的特殊性(管理i-face,模型处理......)应该被考虑。
非常感谢!我有一个产品目录。
Nested sets
是更好的性能,如果你不需要频繁的更新或分级排序。
如果你需要树状更新或分层排序,最好是使用 parent-child
数据模型。
它很容易在 Oracle
和 SQL Server 2005+
而不是那么容易(但仍有可能),在 MySQL
.
对于这种分层数据,我会使用修改后的预排序树遍历算法,MPTT。如果你不介意对结构的改变有一点惩罚的话,这可以让你在遍历树和寻找子代时有很好的表现。
幸运的是,Django有一个很好的库可用于此。django-mptt. 我在一些项目中使用了这个方法,取得了很大的成功。还有 django-treebeard 它提供了几种可供选择的算法,但我还没有用过它(反正它似乎没有mptt那么受欢迎)。
根据这些文章。
http:/explainextended.com20090924adjacency-list-vs-nested-set-postgresql。http:/explainextended.com20090929adjacency-list-vs-nested-set-mysql。
"MySQL是四大系统(MySQL、Oracle、SQL Server、PostgreSQL)中唯一一个嵌套集模型表现出不错的性能,可以考虑存储分层数据的系统。"
Adjacency List更容易维护,而Nested Sets的查询速度要快得多。
问题一直是,将Adjacency List转换为Nested Sets需要花费太长的时间,这要归功于一个非常讨厌的 "push stack "方法,该方法加载了RBAR。 所以人们最终在Nested Sets中做了一些非常困难的维护,或者不使用它们。
现在,你也可以吃到你的蛋糕了! 你可以在10万个节点上用不到4秒的时间进行转换,在100万行上用不到1分钟的时间进行转换! 顺便说一下,所有这些都是在T-SQL中完成的! 请看下面的文章。