【问题标题】:Hierarchical Data Models: Adjacency List vs. Nested Sets分层数据模型:邻接表与嵌套集
【发布时间】:2009-05-27 12:34:16
【问题描述】:

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

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

非常感谢!

【问题讨论】:

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


    【解决方案1】:

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

    问题一直在于将邻接列表转换为嵌套集花费了太长时间,这要归功于加载了 RBAR 的非常讨厌的“推送堆栈”方法。所以人们最终会在嵌套集合中进行一些非常困难的维护或不使用它们。

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

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

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

    【讨论】:

    • 非常感谢那些写得很好的文章,干得好!我不得不将邻接列表转换为 PostgreSQL 中的嵌套集表示,并在它们的帮助下很好地管理它。干杯
    • @VH-NZZ - 感谢您的反馈。很高兴看到该方法不仅限于 T-SQL。由于我工作的一个新方面,我将不得不学习 PostgreSQL,所以很高兴知道这样的事情确实有一条“迁移路径”。
    • 我想你会发现 PSQL 是一个非常棒的数据库系统。您绝对可以期待它将这项技能添加到您的工具集中。
    【解决方案2】:

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

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

    它在OracleSQL Server 2005+ 中很容易构建,而在MySQL 中则不那么容易(但仍然可能)。

    【讨论】:

      【解决方案3】:

      对于这种分层数据,我会使用改进的预序树遍历算法 MPTT。如果您不介意更改结构时会受到一点惩罚,那么这可以在遍历树和查找子节点时提供出色的性能。

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

      【讨论】:

      • 注意:MPTT 和“嵌套集”是同一概念的不同名称。
      【解决方案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)中唯一一个嵌套集模型表现出不错性能并且可以考虑存储分层数据的系统。”

      【讨论】:

      • 天哪...与什么相比?我发现 Nested Sets 几乎让竞争对手望而却步。例外情况是 Oracle 中的 CONNECT BY 功能。
      【解决方案5】:
      猜你喜欢
      • 2015-10-16
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多