ツリービューで表現されたリレーショナルデータベースに階層構造が格納されています。 各ノードはそのプロパティのためのさまざまなフィールドを持ち、その親をIDで知っています。 これは親子関係モデルです。SQL:nレベルの階層構造
ノードに子がある場合、ノード名の前に[+]が表示されます。 [+]をクリックすると、ノードを展開してノードの子を見ることができます。 最下位レベルまで子ノードがある場合、子ノード自体に[+]があります。
簡略化された例のツリービューは、次のようになります
[+] A Land
[+] A.1 Car
A.1.A Motor
A.1.B Wheels
[+] B Sea
B.1 Sailing ship
[+] B.2 Motorboat
B.2.A Motor
[+] C Air
[+] C.1 Plane
C.1.A Turbine
C.2.B Wheels
これは、例えば、様々なノードのプロパティ上の1つまたは複数のフィルタを設定することが可能です名前が「モーター」である子孫を持つすべてのノードを表示します。私はレベルの限られた数とノードの少量を持っているように、この構造は、(平凡なパフォーマンスで)私のニーズを満たす
[+] A Land
[+] A.1 Car
A.1.A Motor
[+] B Sea
[+] B.2 Motorboat
B.2.A Motor
: ツリービューは次のようになります。
ここで、ツリービューをnレベルの深さに拡張します。
ネストされたセットモデルがあり、フィルタリングしない限りパフォーマンスは優れています。ネストされたセットは、わかっている限り、フィルタリングをサポートしていないからです。また、パスモデル(SQL-Servers hierarchyid-datatype)も試しましたが、レベルが高い場合はフィルタリングが遅くなります。
私たちのパスモデルのアプローチ: あなたはhierarchyid型・データ型の列のパスを持っているtbale PMTableの各レベルにおけるノードの多い、と20個のレベルを持っている想像してみてください。次に、少なくとも1つの子孫(直接的な子孫でなくてはならず、descandantがすべての可能なレベルを持つことができなければならない)を持つトップレベルのノードをすべてクエリする(TreeViewを初期化する)ことは望ましくありません。 LIKE '%motor%' AND type = 3、名前とタイプは同じパスモデル表の列です)。また、クエリの簡素化のためにノードのゼロベースのレベルを保存しました。
クエリは次のようになります。
SELECT id, name
FROM PMTable WHERE level = 0
AND Path IN
(
SELECT Path WHERE Path.GetAncestor(Path.GetLevel() - 1)
FROM PMTable
WHERE name LIKE '%motor%' AND type = 3
)
ORDER BY name
このクエリは、おそらく平凡なパフォーマンスですが、あなたが見ることができるよう、また、トップレベルのクエリで使用すると、テーブルからすべてのノードを照会している高価なサブクエリを、持っていますその基準に一致する。
しかし、小さな[+]をクリックして1つの最上位ノードを展開すると、2番目のレベルのノードをすべて照会し、そのノードを祖先とし、そのフィルタ基準一致する)。ノード自体がそのフィルタ条件(タイプ3で名前に 'motor'を含む)と一致する場合、その子孫のすべてを表示する必要があります。
これらのクエリは、この例ではパフォーマンスが低下しています。
他にも好きなモデルがありますか、これを改善するためのアイデアはありますか?
ありがとうございます!
ネストセットモデルでフィルタリングできない理由の例がありますか?子孫によるフィルタリングは、実際にはそのモデルでは非常に簡単です。 –
私が知る限り、ノードに子孫があるかどうかを簡単に確認できます。 しかし、ノードにはいくつかのフィルタ条件に一致する偶然があるかどうかをチェックする必要があります。ネストされたセットモデルの左と右の値がデカンダントを含むかどうかについてのフィードバックを与える限り、私はいくつかの行をフィルタリングすると変更されませんが、方法はありません。私は正しい? –
もちろん、ネストされたセットとフィルタリングを使用できます。子孫を持つすべてのノードを選択します(つまり、ノードの左右に子孫のある/左にあるノードを意味する)か、フィルタの条件を満たすノードを選択します。 'select * from node where exists(select *あなたのノードのフィルタクリティアとnode.left <= n.leftおよびnode.right> = n.right)の '' n ''というノードから ' – Solarflare