不幸的是,如果您无法更改数据模型,并且使用的是MySQL,则将陷入需要递归查询并且使用不支持递归查询的DBMS的局面。
Quassnoi写了一系列有趣的博客文章,展示了查询分层数据的技术。他的解决方案非常聪明,但是非常复杂。
http://explainextended.com/2009/03/17/hierarchical-queries-in-
mysql/
PostgreSQL是另一个开源RDBMS,它确实支持递归查询,因此您可以按照显示的方式获取整棵树。但是,如果您不能更改数据模型,则假定您无法切换到其他RDBMS。
有几种可供选择的数据模型,它们使得获取任意深的树变得更加容易:
- 封闭表
- 嵌套集又称为修改后的预序树遍历
- 路径枚举又称实体化路径
我将在我的演示文稿“ 使用SQL和PHP的层次数据模型”中以及在《SQL反模式:避免数据库编程的陷阱》一书中介绍这些内容。
最后,在Slashdot的代码中,我看到了另一个解决方案,用于它们的注释层次结构:它们像在“邻接表”中一样存储“
parent_id”,但它们还存储“
root_id”列。给定树的每个成员具有相同的root_id值,root_id是其树中的最高祖先节点。然后,很容易在一个查询中获取整棵树:
SELECt * FROM site WHERe root_id = 123;
然后,您的应用程序将所有节点从数据库中取回一个数组,并且您必须编写代码以遍历该数组,将节点插入内存中的树数据结构中。如果您有许多单独的树,并且每棵树都有相对较少的条目,那么这是一个很好的解决方案。这对Slashdot的案子很有好处。



