我觉得这可能是一个常见的问题,但是从我的谷歌搜索中我找不到一个与我的问题相关的解决方案。
我的数据库中有一个组织列表(表),我需要能够根据它们的层次结构运行查询。例如,如果您查询最高组织,我希望返回该组织下列出的所有组织的ID。此外,如果我查询组织中间范围,我只想要在该组织下列出的组织ID。
a)设置数据库模式和b)查询的最佳方法是什么?我只想发送最顶层的组织ID,然后获得该组织下的Id。
我认为这是有道理的,但我可以在必要时澄清。
答案 0 :(得分:3)
正如我在评论中所承诺的那样,我挖出了article关于如何在数据库中存储层次结构的方法,该数据库允许对任意子树进行定时检索。我认为它将比目前被接受的答案更好地满足您的需求,包括易用性和访问速度。我发誓我最初在维基百科上看到了同样的概念,但我现在找不到它。它显然被称为“修改过的预订树遍历”。它的要点是对树中的每个节点进行两次编号,同时进行深度优先遍历,一次向下进行,一次进行备份(即,当您展开堆栈时,在递归实现中) 。这意味着给定节点的子节点的所有数字都在该节点的两个数字之间。在这些列上抛出一个索引,你就可以快速查找。我确信这是一个可怕的解释,请阅读文章,该文章更深入,包括图片。
答案 1 :(得分:2)
一种简单的方法是将组织的父母身份存储在文本字段中,例如:
SALES-EUROPE-NORTH
要搜索每个销售组织,您可以查询SALES-%。对于每个欧洲销售组织,查询SALES-EUROPE - %。
如果您重命名组织,请注意更新其子组织。
这样可以保持简单,无需递归,但代价是有一定的灵活性。
答案 2 :(得分:1)
简单的方法是拥有一个ParentID列,它是同一个表中ID列的外键,对于根节点是NULL。但这种方法有一些缺点。
Nested sets是在关系数据库中存储树的有效方法。
答案 3 :(得分:0)
您可以让组织具有id PK和父ID对id的引用。然后对于查询,使用(如果您的数据库后端支持它们)递归查询,即公用表表达式。