我觉得这可能是一个常见的问题,但是从我的谷歌搜索中我找不到一个解决问题的方法。

我的数据库中有一个组织列表(表),我需要能够根据它们的层次结构运行查询。例如,如果您查询最高组织,我希望返回该组织下列出的所有组织的ID。此外,如果我查询组织中间范围,我只想要在该组织下列出的组织ID。

a)设置数据库模式和b)查询的最佳方法是什么?我只想发送最顶层的组织ID,然后获得该组织下的Id。

我认为这是有道理的,但我可以在必要时澄清。

有帮助吗?

解决方案

一种简单的方法是将组织的父母身份存储在文本字段中,例如:

SALES-EUROPE-NORTH

要搜索每个销售组织,您可以查询SALES-%。对于每个欧洲销售组织,查询SALES-EUROPE - %。

如果您重命名组织,请注意更新其子组织。

这样可以保持简单,无需递归,但代价是有一定的灵活性。

其他提示

正如我在评论中所承诺的,我挖出了一个文章关于如何在数据库中存储层次结构,允许对任意子树进行恒定时间检索。我认为它将比目前被接受的答案更好地满足您的需求,包括易用性和访问速度。我发誓我最初在维基百科上看到了同样的概念,但我现在找不到它。它显然被称为“修改的预订树遍历”。它的要点是你对树中的每个节点进行两次编号,同时进行深度优先遍历,一次向下进行,一次进行备份(即,当你展开堆栈时,在递归实现中) 。这意味着给定节点的子节点的所有数字都在该节点的两个数字之间。在这些列上抛出一个索引,你就可以快速查找。我确信这是一个可怕的解释,请阅读文章,该文章更深入,包括图片。

简单的方法是拥有一个ParentID列,它是同一个表中ID列的外键,对于根节点是NULL。但这种方法有一些缺点。

嵌套集是存储树木的有效方式关系数据库。

您可以让组织具有id PK和父ID对id的引用。然后对于查询,使用(如果您的数据库后端支持它们)递归查询,即公用表表达式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top