我使用物化路径存储在SQL中的根树(存储每行的路径字符串)。
每次从root用户启动时访问每个节点节点的最佳方法是什么?物化路径是否适合我的方法?
Harry
├── Jane
│ ├── Mark
│ └── Diane
│ ├── Mary
│ └── George
│ └── Jill
└── Bill
我的期望是代码首先从Harry开始,然后访问Jane,Diane,George,Jill。为了访问玛丽,它需要从吉尔回到一个级别,并访问玛丽。玛丽没有孩子,我们已经访问过这个级别的每个节点(乔治,玛丽),所以我们回到另一个级别去拜访马克。没有更多的孩子留在这个级别,所以我们回到Jane的一个级别,但我们在这个级别上没有其他节点,所以我们再次返回。最后,我们只有这个级别的比尔,并访问他。当所有节点都被访问过后,我们就完成了。
我还想过将树的每个级别存储在单独的表中,并将这些表的引用存储在另一个表中,但这似乎有点低效,因为我必须存储遍历当前所处的级别,并且操纵这些数据。
Level_0_table: 哈利, 比尔
Level_1_table: 简
Level_2_table: 标记, 戴安
Level_3_table: 玛丽, 乔治
Level_4_table: 吉尔
答案 0 :(得分:1)
我不确定“物化路径”是否是最好的数据结构,因为它似乎非常冗余。也许您想要查找邻接列表(即,为每个条目存储id
,parent_id
)或嵌套集(存储id
,left
和{{1}邻居ID)。 Here对两种结构都有很好的概述。你想要的是在你的树上执行depth-first search(DFS)。前一段时间,问题已在this thread中介绍,因此您可能会发现它很有用。有一种通过SQL查询执行DFS的方法,但实现可能取决于您使用的数据库软件。在任何情况下,您都可以使用stack来实现DFS,以存储您仍需要访问的元素的ID。每次访问后,您将节点的子节点推入堆栈并继续执行下一个弹出元素。 Here is a nice example