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

Gus*_*cco 18 mysql adjacency-list-model nested-set-model

在MySQL中使用层次结构数据两种方法:

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

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

嵌套集模型这个问题不存在,但是对于每个添加的节点有必要给一个MySQL更新所有其他值.

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

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

分析我的情况,两种替代方案中的哪一种最适合我的应用?

Ren*_*nzo 27

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

从1999年开始,标准SQL包括所谓的递归公用表表达式或递归CTE,它使得更简单(和标准化!)的查询能够在具有任意数量级别的层次结构中遍历递归路径.

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

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

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

UPDATE

这种情况正在发生变化,MySQL 8目前正处于开发阶段,它将集成递归CTE,因此从该版本开始,嵌套集模型将更易于使用.