我有不同的层次结构
请找下面的结构。
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**
现在看看上面的树,这里的孩子也可以有子孩子作为父母。
那么我怎样才能实现这一目标,请记住,我希望每个循环都没有整个树。
提前致谢。
答案 0 :(得分:0)
通常,两种方法可能符合您的需求。
版本#1:最明显(但很慢)的尝试是简单地创建一个表,将每个节点和一个引用(外键)保存到其父节点。 NULL的父表示/根节点。
这种尝试的缺点是你需要一个循环(你想要避免的)或一个可以定义和执行递归查询的RDBMS(通常使用CTE)。
版本#2:第二次尝试将是现实世界中的选择。虽然第一种解决方案能够存储无限深度,但这些场景通常不会出现在层次树中。
再次创建一个每个节点有一行的表,但是对父节点有一个引用,你可以在树中存储该节点的绝对路径。一个VarChar
列,就像文件系统中文件的绝对路径一样。这里,'目录名'对应于例如节点的ID。
版本#1具有非常紧凑的优点,但是需要花费相当大的努力来修剪树或使用它们的绝对路径检索所有节点的列表(RDBMS在递归结构中不是很好)。另一方面,很多UI组件都希望这个结构能够在屏幕上显示树。诸如“哪些节点是节点X的间接子节点”之类的问题既缓慢又难以回答。
版本#2的优点是可以很容易地实现树操作(删除,修剪,移动节点和子树)。此外,您需要的列表很简单SELECT
。 “显示节点X的所有直接或间接子节点”的问题也用简单的SELECT
来回答。
需要注意的是,由于冗余的路径保存以及可能保存的树的深度有限,因此增加了大小。