我对这个问题感到有点困惑,我已经考虑了一段时间了.我的数据库中有一个表可以执行任务.通过在parent_id字段中保存主键,每个任务都可以拥有父任务.我对这些任务的链接深度没有限制.
+-----------+-------+-----+
| Field | Type | Key |
+-----------+-------+-----+
| id | int | PRI |
| parent_id | int | MUL |
+-------------------+-----+
Run Code Online (Sandbox Code Playgroud)
没有parent_id的任务是"项目",并且可以通过共享父任务将所有任务分组到任务组中.我现在想用一个HTML选择框填充项目的所有后代.
Task 1
-Task 1.1
-Task 1.2
-Task 1.2.1
-Task 1.2.2
-Task 1.3
Task 2
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?我认为某种递归函数是有序的,但我似乎无法真正想出如何去做.
任何帮助都会有很大的帮助.:)
我强烈建议您阅读有关在数据库中存储分层数据的文章.这里讨论了两种算法,根据您的需要,其中一种算法可能是合适的.
邻接表模型
这就是你现在拥有的.树的每个节点都存储对其父级的引用,您可以通过选择树的每个级别并迭代节点来递归地确定节点的路径.这很容易实现,但缺点是要确定节点的特定路径,需要递归查询.如果您的树受到很多更改(即写入),这是一个很好的方法,因为动态查找每个节点可以很好地适应不断变化的树.如果它读得很重,那么你在递归中会有一些开销.
修改的预订树遍历
我最喜欢的,这是一个非常简洁的算法.您可以存储对每个给定节点的"左"和"右"节点的引用,而不是存储对父级的引用(为了方便起见,您可以执行此操作).可以在单个选择查询中确定节点的整个路径,或者相反,可以在节点的所有子节点中确定.该算法更难实现,但它对读取繁重的树具有性能优势.缺点是每次移动或添加节点时,必须重新计算树的整个分支,因此它可能不适合写入大量数据集.
无论如何,希望这篇文章能给你一些想法.这是一个很好的.