如何在SQL中表示数据树?

我正在编写一个从Tree和TreeNode组合而成的数据树结构。 树将包含数据的根级和顶级操作。 我正在使用一个UI库在树形窗口中显示树,我可以将树绑定到TreeView。

我需要将这个树和节点保存在数据库中。 什么将是最好的方式来保存树,并获得以下功能:

  • 直观的实施。
  • 容易绑定。 将很容易从树移动到数据库结构并返回(如果有的话)
  • 我有两个想法。 首先是将数据序列化成表格中的单行数据。 第二个是保存在表中,但是当移动到数据实体时,我将丢失已更改节点上的表上的行状态。

    有任何想法吗?


    最简单的实现是邻接列表结构:

    id  parent_id  data
    

    但是,有些数据库,特别是MySQL ,在处理这个模型时有一些问题,因为它需要能够运行MySQL缺少的递归查询。

    另一个模型是嵌套集合

    id lft rgt data
    

    其中lftrgt是定义层次结构的任意值(任何孩子的lftrgt应在任何父母的lftrgt

    这不需要递归查询,但它更难以维护。

    但是,在MySQL这可以使用SPATIAL abitilies进行改进。

    在我的博客中查看这些文章:

  • 邻接列表与嵌套集:PostgreSQL
  • 邻接列表与嵌套集:SQL Server
  • 邻接列表与嵌套集:Oracle
  • 邻接列表与嵌套集:MySQL
  • 以获得更详细的解释。


    我已经为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?