在MySQL中检索具有分层结构的数据

时间:2010-05-06 16:02:17

标签: mysql hierarchical-data

给出下表

id    parentID   name      image
0     0                    default.jpg
1     0          Jason   
2     1          Beth      b.jpg
3     0          Layla     l.jpg
4     2          Hal     
5     4          Ben       

我想要做以下事情:

如果我搜索Ben,我想找到图像,如果没有图像,我想找到父母的图像,如果不存在,我想去祖父母的图像......直到我们点击默认图像。

最有效的方法是什么?我知道SQL并不是专为分层值设计的,但这是我需要做的。

干杯!

2 个答案:

答案 0 :(得分:12)

MySQL缺少递归查询,这是标准SQL的一部分。许多其他品牌的数据库都支持此功能,包括PostgreSQL(请参阅http://www.postgresql.org/docs/8.4/static/queries-with.html)。

在MySQL中有几种处理分层数据的技术。

  • 最简单的方法是添加一列来记录给定照片所属的层次结构。然后,您可以搜索属于同一层次结构的照片,将它们全部提取回您的应用程序并找出您需要的照片。这在带宽方面有点浪费,需要你编写更多的应用程序代码,如果你的树有很多节点就不好了。

还有一些聪明的技术可以存储分层数据,因此您可以查询它们:

  • Path Enumeration 存储每个节点的祖先列表。例如,示例中的照片5将存储“0-2-4-5”。您可以通过搜索与“%”连接的路径与带有LIKE谓词的5路径匹配的节点来搜索祖先。

  • 嵌套集是一种复杂但聪明的技巧,由Joe Celko在他的文章和他的着作“树和SQL中的分层结构中为聪明人”推广。有很多关于它的在线博客和文章。查询树很容易,但很难查询直接的孩子或父母,很难插入或删除节点。

  • 关闭表涉及将每个祖先/后代关系存储在单独的表中。如果添加 pathlength 列,查询树很容易,插入和删除都很容易,并且很容易查询直接父母或孩子。

您可以在我的演示文稿Practical Object-Oriented Models in SQL或即将出版的书籍SQL Antipatterns: Avoiding the Pitfalls of Database Programming中查看比较这些方法的更多信息。

答案 1 :(得分:1)