2009-05-06 62 views
2

我觉得这可能是一个普遍的问题,但从我的谷歌搜索我找不到解决方案,具体到我的问题。组织结构图的SQL查询?

我有我的数据库中的组织(表)的列表,我需要能够根据他们的层次结构运行查询。例如,如果您查询最高组织,我想要返回该组织下列出的所有组织的标识。此外,如果我查询组织类型的中档,我只需要在该组织下列出组织标识。

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

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

+0

对您的问题的相似答案: http://stackoverflow.com/questions/38801/sql-how-to-store-and-navigate-hierarchies http://stackoverflow.com/questions/378608/how- can-i-select-all-leaf-nodes-in-a-sql-hierarchy-under-a-given-node – Nick 2009-05-06 19:38:41

+0

如果mssql是什么版本/类型? 2005/2008你可以使用CTE很容易地回归数据 – u07ch 2009-05-06 19:45:10

+0

我很好奇你将如何显示这个。我知道你说图表,但是,怎么样,图书馆? – johnny 2009-05-06 20:52:52

回答

2

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

销售EUROPE-NORTH

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

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

这使得它简单,无需递归,代价是具有一定的灵活性。

0

你可以让一个组织有一个id PK和一个父FK引用id。然后,对于查询,请使用(如果您的数据库后端支持它们)递归查询,也就是Common Table Expressions。

1

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

Nested sets是将树存储在关系数据库中的有效方法。

3

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