我正在尝试为公司设置层次结构。我使用SQL Server 2008并使用层次结构ID进行设置。但是现在我需要回到SQL Server 2005 ......并且“就这么做”......无论如何我想到了这个简单的方法 -
Id | ParentId | CompanyName | Desc
其中ParentId
是一个int字段,用于存储父项的id。我猜根将其ParentId
设为零。是否有更好的方法来设置层次结构?
我真的没有对层次结构的复杂要求......我想知道什么会让我觉得遍历层次结构更容易并且更有效地使用它。
答案 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
这篇文章应该有所帮助(例子来自这里):