邻接列表模型与MySQL分层数据的嵌套集模型?

时间:2015-07-26 20:17:04

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

two ways to work with hierarchy data in MySQL

  1. 邻接列表模型
  2. 嵌套集模型
  3. 邻接列表模型的一个主要问题是我们需要为每个节点运行一个查询以获取层次结构的路径。

    嵌套集模型中,此问题不存在,但是对于每个添加的节点,必须在所有其他节点上提供MySQL更新 left right < / em> value。

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

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

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

1 个答案:

答案 0 :(得分:24)

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

从1999年开始,标准SQL包括所谓的递归公用表表达式或递归CTE,它使得更简单(和标准化!)的查询能够使用任何编号遍历层次结构中的递归路径等级。

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

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

  1. 如果您仍然可以决定使用哪个DBMS,请强烈考虑一些替代方案:例如,如果您想坚持使用开放源数据库,请使用PostgreSQL,使用Adiacency List Model,并使用递归CTE你的疑问。
  2. 如果您无法更改DBMS,仍应使用Adiacency List Model,并使用参考文献中引用的存储过程。
  3. <强>更新

    这种情况正在发生变化,MySQL 8目前处于开发状态,will integrate Recursive CTEs,因此从该版本开始,Adiacency Set Model将更易于使用。