如何在SQL中表示数据树?
我正在编写一个从Tree和TreeNode组合而成的数据树结构。 树将包含数据的根级和顶级操作。 我正在使用一个UI库在树形窗口中显示树,我可以将树绑定到TreeView。
我需要将这个树和节点保存在数据库中。 什么将是最好的方式来保存树,并获得以下功能:
我有两个想法。 首先是将数据序列化成表格中的单行数据。 第二个是保存在表中,但是当移动到数据实体时,我将丢失已更改节点上的表上的行状态。
有任何想法吗?
最简单的实现是邻接列表结构:
id parent_id data
但是,有些数据库,特别是MySQL
,在处理这个模型时有一些问题,因为它需要能够运行MySQL
缺少的递归查询。
另一个模型是嵌套集合 :
id lft rgt data
其中lft
和rgt
是定义层次结构的任意值(任何孩子的lft
, rgt
应在任何父母的lft
, rgt
)
这不需要递归查询,但它更难以维护。
但是,在MySQL
这可以使用SPATIAL
abitilies进行改进。
在我的博客中查看这些文章:
以获得更详细的解释。
我已经为SQL-Antipatterns提供了这个slidshare的书签,它讨论了几种可选方案:http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back?src=embed
从那里的建议是使用闭合表(它在幻灯片中解释)。
这是总结(幻灯片77):
| Query Child | Query Subtree | Modify Tree | Ref. Integrity
Adjacency List | Easy | Hard | Easy | Yes
Path Enumeration | Easy | Easy | Hard | No
Nested Sets | Hard | Easy | Hard | No
Closure Table | Easy | Easy | Easy | Yes
我很惊讶没有人提到物化路径解决方案,这可能是在标准SQL中处理树木的最快方式。
在这种方法中,树中的每个节点都有一个列路径,其中存储从根节点到节点的完整路径。 这涉及非常简单和快速的查询。
看看示例表节点:
+---------+-------+
| node_id | path |
+---------+-------+
| 0 | |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 1.4 |
| 5 | 2.5 |
| 6 | 2.6 |
| 7 | 2.6.7 |
| 8 | 2.6.8 |
| 9 | 2.6.9 |
+---------+-------+
为了获得节点x的子节点,可以编写以下查询:
SELECT * FROM node WHERE path LIKE CONCAT((SELECT path FROM node WHERE node_id = x), '.%')
请记住,应该将列路径编入索引,以便使用LIKE子句快速执行。
链接地址: http://www.djcxy.com/p/93875.html上一篇: How to represent a data tree in SQL?
下一篇: What type of NoSQL database is best suited to store hierarchical data?