MySQL 分层数据的邻接表模型与嵌套集模型?
Adjacency List Model vs Nested Set Model for MySQL hierarchical data?
有two ways to work with hierarchy data in MySQL:
- 邻接表模型
- 嵌套集模型
邻接表模型的一个主要问题是我们需要运行对每个节点进行一次查询以获得层次结构的路径。
在嵌套集模型中不存在这个问题,但是对于每个添加的节点都需要对所有其他节点进行MySQL更新左和右值。
我的分层数据不是静态数据,比如电商的产品分类。用户按等级顺序不断注册。
在我的应用程序中,虽然有很多常量用户注册,但我还需要获取层次结构路径,直到到达层次结构中的第一个节点。
分析我的情况,两种选择中哪一种最适合我的申请?
嵌套集模型现在在数据库中并不常用,因为它比邻接列表模型更复杂,因为它需要管理两个“指针”而不是一个。实际上,当遍历层次结构的递归查询很复杂或不可能时,数据库中就引入了嵌套集模型。
从 1999 年开始,标准 SQL 包括所谓的递归通用 Table 表达式或递归 CTE,这使得在层次结构中遍历递归路径的查询变得更加简单(并且标准化!)具有 任意 个级别。
所有主要的 DBMS 系统现在都包含此功能,但有一个明显的例外:MySQL。但是在 MySQL 中,您可以使用存储过程来克服这个问题。参见,例如,this post on Whosebug, or this post on dba.stackexchange.
所以,总而言之,这些是我的建议:
- 如果您仍然可以决定使用哪个 DBMS,请认真考虑一些替代方案:例如,如果您想坚持使用开源数据库,请使用 PostgreSQL,使用 Adiacency List 模型,然后使用 Recursive针对您的查询的 CTE。
- 如果您不能更改 DBMS,您仍然应该使用 Adiacency List 模型,并使用参考文献中引用的存储过程。
更新
这种情况正在随着 MySQL 8 的出现而改变,它目前正在开发中 will integrate Recursive CTEs,因此从那个版本开始,Adiacency List 模型将更易于使用。
有two ways to work with hierarchy data in MySQL:
- 邻接表模型
- 嵌套集模型
邻接表模型的一个主要问题是我们需要运行对每个节点进行一次查询以获得层次结构的路径。
在嵌套集模型中不存在这个问题,但是对于每个添加的节点都需要对所有其他节点进行MySQL更新左和右值。
我的分层数据不是静态数据,比如电商的产品分类。用户按等级顺序不断注册。
在我的应用程序中,虽然有很多常量用户注册,但我还需要获取层次结构路径,直到到达层次结构中的第一个节点。
分析我的情况,两种选择中哪一种最适合我的申请?
嵌套集模型现在在数据库中并不常用,因为它比邻接列表模型更复杂,因为它需要管理两个“指针”而不是一个。实际上,当遍历层次结构的递归查询很复杂或不可能时,数据库中就引入了嵌套集模型。
从 1999 年开始,标准 SQL 包括所谓的递归通用 Table 表达式或递归 CTE,这使得在层次结构中遍历递归路径的查询变得更加简单(并且标准化!)具有 任意 个级别。
所有主要的 DBMS 系统现在都包含此功能,但有一个明显的例外:MySQL。但是在 MySQL 中,您可以使用存储过程来克服这个问题。参见,例如,this post on Whosebug, or this post on dba.stackexchange.
所以,总而言之,这些是我的建议:
- 如果您仍然可以决定使用哪个 DBMS,请认真考虑一些替代方案:例如,如果您想坚持使用开源数据库,请使用 PostgreSQL,使用 Adiacency List 模型,然后使用 Recursive针对您的查询的 CTE。
- 如果您不能更改 DBMS,您仍然应该使用 Adiacency List 模型,并使用参考文献中引用的存储过程。
更新
这种情况正在随着 MySQL 8 的出现而改变,它目前正在开发中 will integrate Recursive CTEs,因此从那个版本开始,Adiacency List 模型将更易于使用。