5

ここで説明されているマテリアライズド パス モデルを使用してツリーのような構造を実装しようとしています: http://www.dbazine.com/oracle/or-articles/tropashko4

[path] フィールドに参照整合性を適用することは可能ですか? SQL でそれを行う方法がわかりません。DAL で手動で行う必要がありますか?

4

4 に答える 4

3

その記事で Vadim Tropashko によって提示された「実体化されたパス」は、順序の概念を関係に導入します (「Jones は 2 番目のメンバーです」)。

「実体化されたパス」は、推移閉包の「何らかの形式の実体化されたビュー」にすぎないため、他の「実体化されたビュー」とまったく同じ問題を抱えています。 .

クロージャに対する制約が機能している場合、SQL はほぼ完全に無力です。(意味: はい、SQL では、すべてを自分で行う必要があります。) これは、RM がほぼ無限の力を最大限に発揮する領域の 1 つですが、SQL はひどく失敗し、大多数の人が SQL を間違えるのは非常に残念なことです。関係があるからです。

(@Bill Karwin : ツリーの深さとパフォーマンスの結果との関係についてのあなたのコメントに +1 を付けたいと思います。これはアルゴリズムの問​​題であり、SQL やリレーショナルの問題ではありません。)

編集

はい、RM = リレーショナル モデル

于 2009-08-07T20:20:41.353 に答える
3

はい、階層データに具体化されたパスまたはネストされたセットのソリューションを使用する場合、DAL でデータの整合性を自分で適用する必要があります。

隣接リストは参照整合性をサポートしており、これは私が「クロージャ テーブル」と呼ぶ設計にも当てはまります (Tropashko はこの設計を「推移的閉包関係」と呼んでいます)。

于 2009-08-07T05:36:40.903 に答える
1

マテリアライズド パス モデルでは、"xyz" 形式の特別な文字列の代わりに、任意の文字列 (256 を超える子を許可するために Unicode 文字列など) を使用できます。親の ID は、最後の文字が削除された直接の子の ID です。これは、次のようなチェック制約を使用して簡単に強制できます (私の例は PostgreSQL で動作します)。

check(parent_id = substring(id from 1 for char_length(id)-1)),

create table コマンド内。「xyz」の形式の文字列に固執する場合は、正規表現をいじる必要がありますが、対応するチェック制約を見つけることは可能だと思います。

于 2009-08-07T12:05:01.447 に答える
-1

はい、「[パス] フィールドに参照整合性を強制する」ことができます。ここで説明するように、私は数年前にそれを行いました:

構成設定を階層としてデータベースに保存する

于 2010-03-03T21:55:09.363 に答える