2014-01-31 122 views
-1

我有不同的分层结构分层数据库结构SQL Server

请看下面的结构。

1. Parent 1 

    1.1 Child 1 

    1.2 Child 2 

    1.3 Child 3 

      1.3.1 Child 4 


      **1.3.2 Parent 2** 

现在看看上面的树,这里的孩子也可以有子孩子作为父母。

那么我该如何做到这一点,请记住,我希望整个树没有每个循环。

在此先感谢。

+1

哪个RDMBS?多少个节点?什么是最大深度? – alzaimar

+0

1)它是否更好? 2)N个节点3)直到第n级。 –

+0

是的,这很重要。有些RDBMS支持递归查询,有些则不支持。 – alzaimar

回答

0

通常,两种方法可能适合您的需求。

版本#1:最明显的(但很慢)尝试是简单地创建一个表,其中包含每个节点和一个引用(外键)到它的父节点。 NULL的父亲表示/根节点。

这种尝试的缺点是你需要一个循环(你想避免的)或者一个RDBMS,可以定义和执行递归查询(通常用CTE)。

版本#2:第二次尝试将是现实世界中的选择。鉴于第一种解决方案能够存储无限深度,这些场景通常不会发生在流浪树木中。

您再次创建一个表,每个节点只有一行,但是具有对父级的引用,您可以在树中保存该节点的绝对路径。一个VarChar列,就像文件系统中文件的绝对路径一样。这里,“目录名称”对应于例如节点的ID。

版本#1具有非常紧凑的优势,但需要花很大力气修剪树或使用其绝对路径检索所有节点的列表(RDBMS在递归结构中不太好)。另一方面,很多UI组件都期望这种结构能够在屏幕上显示树。像'哪些节点是节点X的间接子节点'这样的问题既缓慢又很难回答。

版本#2的优点是可以非常容易地实现树操作(删除,修剪,移动节点和子树)。此外,你需要的清单是一个简单的SELECT。 “显示节点X的所有直接或间接孩子”的问题也用简单的SELECT来回答。 警告是由于路径的冗余保存和可能保存的树的深度有限而增加的大小。