如何使用Python遍历存储在SQL数据库中的树?

时间:2014-05-29 17:32:45

标签: python sql tree tree-traversal

我使用物化路径存储在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: 吉尔

1 个答案:

答案 0 :(得分:1)

我不确定“物化路径”是否是最好的数据结构,因为它似乎非常冗余。也许您想要查找邻接列表(即,为每个条目存储idparent_id)或嵌套集(存储idleft和{{1}邻居ID)。 Here对两种结构都有很好的概述。你想要的是在你的树上执行depth-first search(DFS)。前一段时间,问题已在this thread中介绍,因此您可能会发现它很有用。有一种通过SQL查询执行DFS的方法,但实现可能取决于您使用的数据库软件。在任何情况下,您都可以使用stack来实现DFS,以存储您仍需要访问的元素的ID。每次访问后,您将节点的子节点推入堆栈并继续执行下一个弹出元素。 Here is a nice example