我有一个像这样的树结构表:
CREATE TABLE [dbo].[Nodes](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NOT NULL,
[ParentId] [bigint] NULL)
以最小连接查找节点路径作为父ID列表的有效方法是什么?
My Tree将不会有超过200个节点。
答案 0 :(得分:0)
如果您需要允许任何级别的嵌套,这是一个非常复杂的问题。
一个解决方案是“嵌套集”,它可以减少插入,更新和删除的复杂性,从而使查询树结构更加简单/高效。
见这里:http://www.codeproject.com/Articles/4155/Improve-hierarchy-performance-using-nested-sets
如果您以这种方式设置,则检索所需数据的查询就像
SELECT [Id]
FROM [dbo].[Nodes]
WHERE [LeftExtent] < @CurrentNodeLeftExtent
AND [RightExtent] > @CurrentNodeRightExtent
ORDER BY [LeftExtent]
如果有点太多,我看到人们将路径存储为表中的一个额外列,作为逗号分隔的ID列表。显然,这意味着无论何时插入,更新或删除节点,都必须注意更新这些内容。
答案 1 :(得分:0)
我在100,000条深度为30级的记录上测试了以下解决方案。 我得到了树的所有项目,然后一个方法递归地获取路径,直到。结束条件为null父ID。大约需要4-5秒。这个持续时间是可以接受的,而树表将存储最多400个记录。