【问题标题】:Adjacency List Model vs Nested Set Model for MySQL hierarchical data?MySQL分层数据的邻接列表模型与嵌套集模型?
【发布时间】:2015-10-16 22:54:38
【问题描述】:

two ways to work with hierarchy data in MySQL:

  1. 邻接表模型
  2. 嵌套集模型

邻接列表模型的一个主要问题是我们需要对每个节点运行一个查询来获取层次结构的路径。

嵌套集模型中不存在这个问题,但是对于每个添加的节点都需要对所有其他节点进行 MySQL UPDATE leftright 值。

我的分层数据不是静态数据,比如电子商务的产品类别。是按层次顺序不断注册用户。

在我的应用程序中,虽然有很多常量用户注册,但我还需要获取层次结构路径,直到到达层次结构中的第一个节点。

分析我的情况,两种选择中哪一种最适合我的应用?

【问题讨论】:

    标签: mysql nested-set-model adjacency-list-model


    【解决方案1】:

    嵌套集模型现在在数据库中并不常用,因为它比 Adiacency 列表模型更复杂,因为它需要管理两个“指针”而不是一个。实际上,当复杂或不可能进行遍历层次结构的递归查询时,已在数据库中引入了嵌套集模型。

    从 1999 年开始,标准 SQL 包括所谓的递归公用表表达式或递归 CTE,这使得在具有 any 编号的层次结构中遍历递归路径的查询变得更加简单(和标准化!)级别。

    现在所有主要的 DBMS 系统都包含此功能,但有一个明显的例外:MySQL。但是在 MySQL 中,您可以通过使用存储过程来克服这个问题。例如,请参阅 this post on StackOverflowthis post on dba.stackexchange

    所以,总而言之,这些是我的建议:

    1. 如果您仍然可以决定使用哪个 DBMS,请考虑一些替代方案:例如,如果您想坚持使用开源数据库,请使用 PostgreSQL,使用 Adiacency 列表模型,并使用递归 CTE 进行查询.
    2. 如果您无法更改 DBMS,您仍然应该使用 Adiacency 列表模型,并使用参考文献中引用的存储过程。

    更新

    MySQL 8 正在改变这种情况,它目前正在开发中,will integrate Recursive CTEs,因此从那个版本开始,Adiacency 列表模型将更易于使用。

    【讨论】:

    • 不管怎样,目前正在开发的 MySQL 8 将支持递归 CTE 查询。
    • @BillKarwin,非常感谢您提供的信息,我更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多