2

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

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

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

我认为这是有道理的,但如果有必要我可以澄清一下。

4

4 回答 4

3

正如我在评论中所承诺的,我挖了一篇文章关于如何将层次结构存储在允许对任意子树进行恒定时间检索的数据库中。我认为它比当前标记为已接受的答案更适合您的需求,无论是在易用性还是访问速度方面。我可以发誓我最初在维基百科上看到过同样的概念,但我现在找不到了。它显然被称为“修改的前序树遍历”。它的要点是你对树中的每个节点进行两次编号,同时进行深度优先遍历,一次在向下的路上,一次在向上的路上(即,当你展开堆栈时,在递归实现中) . 这意味着给定节点的子节点的所有数字都在该节点的两个数字之间。在这些列上添加一个索引,您将获得非常快速的查找。我敢肯定这是一个糟糕的解释,

于 2009-05-06T21:14:14.907 回答
2

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

销售-欧洲-北部

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

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

这使它保持简单,没有递归,但以一定的灵活性为代价。

于 2009-05-06T19:41:52.600 回答
1

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

嵌套集是在关系数据库中存储树的有效方法。

于 2009-05-06T19:36:36.873 回答
0

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

于 2009-05-06T19:35:23.990 回答