在sql server 2005中设置层次结构的最佳方法是什么?

时间:2010-10-08 15:19:53

标签: sql-server-2005 hierarchy

我正在尝试为公司设置层次结构。我使用SQL Server 2008并使用层次结构ID进行设置。但是现在我需要回到SQL Server 2005 ......并且“就这么做”......无论如何我想到了这个简单的方法 -

Id | ParentId | CompanyName | Desc

其中ParentId是一个int字段,用于存储父项的id。我猜根将其ParentId设为零。是否有更好的方法来设置层次结构?

我真的没有对层次结构的复杂要求......我想知道什么会让我觉得遍历层次结构更容易并且更有效地使用它。

3 个答案:

答案 0 :(得分:1)

Joe Celko使用嵌套集的方法,其中你的表有一个“左”和“右”列引用层次结构是我通常看到它完成的方式

Joe Celko可能会比我更好地解释它 Nested sets

答案 1 :(得分:1)

“简单方法”很好,适用于CTE(Common Table Expression)。然而,正如凯夫所建议的那样,还有其他方式有其优点和缺点。

因此,最终它取决于您的确切要求,以及对数据进行多少插入与分层查询,因为不同方法的性能在这方面可能会有很大差异。

答案 2 :(得分:1)

不幸的是,据我所知,你设置它的方式是正确的方法。您现在无法轻松遍历链接,因为您丢失了GetAncestor和GetDescendant。一个不错的替代方法是使用CTE替换GetAncestor和GetDescendant,并以递归方式使用它们。

以下是一个示例(使用菜单层次结构):

WITH MenuCTE(MenuKey, ParentMenuKey, MenuName) AS
(
-- Anchor Query
SELECT MenuKey, ParentMenuKey, MenuName FROM Menu WHERE MenuKey = 1
UNION ALL
-- Recursive Query
SELECT m.MenuKey, m.ParentMenuKey, m.MenuName FROM Menu m
INNER JOIN MenuCTE r ON m.ParentMenuKey = r.MenuKey
)
SELECT MenuKey, ParentMenuKey, MenuName FROM MenuCTE

这篇文章应该有所帮助(例子来自这里):

http://www.infoq.com/news/2007/10/CTE