sql:如何存储树数据并进行递归遍历(通过查询)?

Posted

技术标签:

【中文标题】sql:如何存储树数据并进行递归遍历(通过查询)?【英文标题】:sql: how to store tree data and do recursive traversal (via query)? 【发布时间】:2014-07-15 19:22:58 【问题描述】:

我正在尝试存储这样的数据结构。当然这是一个简单的例子,但是其他树在同一级别会有多个节点。

(取自https://github.com/caesar0301/pyTree的树)

Harry
├── Jane
│   ├── Mark
│   └── Diane
│       ├── Mary
│       └── George
│           └── Jill
└── Bill

我想过为每个深度创建一个表格。

lvl 1 | lvl 2 | lvl 3 | lvl 4  | lvl 5 |
Harry | Jane  | Mark  | Mary   | Jill  |
      | Bill  | Diane | George |       |

我想做一个递归查询或者递归遍历来访问所有层级的所有叶子节点。

我应该为每个级别创建一个表吗?这似乎不太好。我应该有一个表,其中包含一个名为 parent 和 children 的列吗?

id | name  | parent
1  | Harry | 0
2  | Jane  | 1
3  | Bill  | 1
4  | Mark  | 2
5  | Diane | 2
6  | Mary  | 5
7  | Gerge | 5
8  | Jill  | 7

一天结束,我需要生成一个查询,该查询将一一生成以下系列。

Harry, Jane, Mark
Harry, Jane, Diane, Mary
Harry, Jane, Diane, George, Jill (mark Jill as done, because it is a leaf node)
Harry, Jane, Bill

叶节点在被读取一次时被标记为完成。

可能在任何时间(通过另一个进程)在任何级别添加其他节点,我需要一种方法来知道我何时“完成”(当所有叶节点都完成时)。包含叶节点的父节点只有在其所有后代节点都完成后才会被标记为完成。

一些伪代码(不太确定)

getChildren(1)

def getChildren(parent):
  while children.size > 0:
    children = getChildren(parent)
    for child in children:
      if isLeaf(child):
        markDone(child)
      else:
        getChildren(child)

  return children

每隔一段时间,我需要检查表以查看是否有任何未检查的节点。如果没有,那么我们就正式“完成”了。

我是否走在正确的轨道上,或者是否有其他最佳解决方案,甚至是已经完成此类工作的库?

【问题讨论】:

【参考方案1】:

在 sql 中有一种有趣的方法:

http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases

祝你考试顺利。

【讨论】:

以上是关于sql:如何存储树数据并进行递归遍历(通过查询)?的主要内容,如果未能解决你的问题,请参考以下文章

通过 PHP 使用 mysql 进行递归树遍历

SQL 树递归查询

SQL CTE树递归查询

sql server 递归查询

基于左序遍历的数据存储实践

基于左序遍历的数据存储实践