2012-02-29 7 views
0

私はこのようなツリー構造のテーブルを持っている:ノードのすべての親をツリー構造で取得する方法は? (エンティティへのLINQ)

CREATE TABLE [dbo].[Nodes](
    [Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](max) NOT NULL, 
    [ParentId] [bigint] NULL) 

最小コネクションを持つ親IDのリストとしてノードのパスを見つけるための効率的な方法は何ですか?

私のツリーには200ノード以上はありません。

答えて

0

私は30レベルの深さの100,000レコードで次のようにテストしました。 私はツリーのすべての項目を取得し、その後メソッドは再帰的にパスをフェッチします。終了条件はNULLの親のIDです。それは約4-5秒かかります。ツリーテーブルは最大400レコードを格納するが、この期間は許容される。

+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のリストとして、パスを余分な列としてテーブルに格納します。明らかにこれもまた、ノードを挿入、更新、または削除するたびにこれらを更新する必要があることを意味します。

+0

バイナリツリー@Jamesについてではありませんか?私の木はバイナリではないので、左右の子供は適用されません。右? –

+0

ああ、 "left"と "right"という名前はやや混乱しますが、ネストされた集合理論はバイナリツリーだけではなく、任意の数の子を持つツリーに適用されます。 –

関連する問題