23

在 MySQL中有两种处理层次结构数据的方法

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

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

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

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

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

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

4

1 回答 1

32

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

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

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

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

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

更新

MySQL 8 正在改变这种情况,它目前正在开发中,它将集成 Recursive CTEs,因此从那个版本开始,Adiacency List Model 将更易于使用。

于 2015-07-26T22:41:32.313 回答