0

ツリー構造を表す ID と ParentID を持つデータベースに隣接リストがあります。

-a
--b
---c
-d
--e

もちろん、レコードでは ParentID が ID と同じであってはなりませんが、無限ループを防ぐために循環参照も防止する必要があります。これらの循環参照は、理論的には 2 つ以上のレコードを含む可能性があります。( a->b、b->c、c->a など)

レコードごとに、パスを次のような文字列列に保存します。

a    a
b    a/b
c    a/b/c
d    d
e    d/e

私の質問は次のとおりです。挿入/更新するときに、循環参照が発生するかどうかを確認する方法はありますか?

ネストされたセットモデルなどについてすべて知っていることを付け加えておく必要があります。保存されたパスを使用した隣接方法を選択したのは、はるかに直感的だからです。トリガーと別のパステーブルで動作するようになりました。循環参照の可能性を除いて、魅力的に動作します。

4

2 に答える 2

2

そのようなパスを保存している場合は、パスにIDが含まれていないことを確認できます。

于 2011-02-20T15:12:55.927 に答える
0

Oracle を使用している場合は、CONNECT BY 構文を使用してサイクルのチェックを実装できます。ノードの数は、ルート ノードからの子孫の数と等しくなければなりません。

CHECK (
(SELECT COUNT(*) Nodes
 FROM Tree) =
(SELECT COUNT(*) Decendents
 FROM Tree
 START WITH parent_node IS NULL -- Root Node
 CONNECT BY parent_node = PRIOR child_node))

ツリーを強制するには、他のチェックが必要になることに注意してください。IE

null を持つ単一のルート ノード。ノードは 1 つの親を持つことができます。

サブクエリでチェック制約を作成することはできないため、これはビューまたはトリガーに移動する必要があります。

于 2013-04-16T14:56:15.967 に答える