1

リレーショナルデータベース設計では、問題を引き起こす1つ(またはそれ以上)の「循環グラフ」について心配する必要がありますか?リレーショナルデータベース設計 - 「循環」グラフ

(簡体字)、例えば、テーブル

T1(T1_Id、...)
T2(T2_Id、T1_Id_Fk、...)
T3(T1_Id_Fk、T2_Id_Fk、.. )

主キーは太字です。

T1の行には2つの役割があります。 T1行r1はT2の行r2との関係T3にあることができますが、T2の(おそらく同じ)行r2 'の親行でもあります。これらの2つの関係は直交しています。

私はこのような何かを思い付いた:

T1_Base(T1_Id、...)
T1_Child1(T1_C1_Id、...)
T1_Child2(T1_C2_Id、...)
T2(T2_Id、T1_C1_Id_Fk、...)
T3(T1_C2_Id_Fk、T2_Id_Fk、...)

ここでは、Relational database design cycleで説明されている可能性のあるカスケード問題のいくつかを解消するために、それぞれT1_BaseとT1_Child1およびT1_Child2の間に1対1の関係がありますが、まだ周期があります。

すべてのFKがON CASCADE NO ACTIONで定義されている状況でこれについて心配する必要がありますか?

+0

これらのデザインにはどのようなサイクルがあると思いますか? – philipxy

+1

@cloud元のテーブルにはサイクルがありません。関数の依存関係と外部キー制約はどちらも指向性ですが、どちらのセットもあなたのケースではサイクルを形成しません。また、リレーショナルデータベースでは、行を他の行(これは古いネットワークデータモデル)に関連付けるのではなく、値やドメインを関連付けることに注意してください。だからこそ表が関係を表していると言えます。 – reaanb

+0

FKは複数の列を持つことができます。あなたはあなたのFKが何であるかを明確にしません。あなたの質問を編集してください。何を参照しているかについてDDLのようなステートメントを与えるだけの方がいいです。 (他のチェーンの連鎖の結果である直接参照を宣言する必要はありませんが)ここでPS "orthogonal"は不明です。あなたが意味することを書き留めてください。 – philipxy

答えて

1

FK(Foreign Key)制約はです。 FK宣言は、表&列リストのサブロー値が、他の「参照済み」表&列リストのサブロー値として表示されるという文です。人々がFKの「サイクル」について話すときには、FKの参照のサイクルが全て先頭から末尾に向かうことを意味します。

このようなサイクルはありません。

は、アプリケーション関係/アソシエーションを表しています。実際には、すべてのデータベース状態で真である表に関する文ですが、FK制約は「関係」と呼ばれることがあります。関連する関係/関連)

このようなサイクルには論理的な問題はありません。それが起こると、テーブルはすべてスーパーキー/ユニーク列リストのサブロー値のセットとまったく同じです。すべてのFK列リストが同じ(同じ名前、同じ順序)、すべての非FK列が異なる単純なケースでは、代わりに別々のテーブルを使用することができます。それ以外の場合は、適切な列の名前を変更した後でも、1つの表しか使用できません。

しかし、多くのDBMSでは、FK宣言が宣言されているので、FK宣言が処理されません。なぜなら、DBMSデザイナーは、カスケードの更新時に二重の義務を負うからです。サイクルがあります。だから、もしあなたが1つのテーブルの設計を望まないなら、宣言的なFK制約の1つを落とすことによってサイクルを強制的に落とします。ただし、SQL DBMSで使用できる唯一の一般的な制約機能であるトリガーを使用して制約を適用することはできますが、

PS最初のデザインはおそらくT3 (T1_Id_Fk, T2_Id_Fk) references T2 (T1_Id_Fk, T2_Id)T2 (T1_Id_Fk) references T1(T1_Id)であるため、2番目のデザインはおそらく適切に拘束されていません。

+0

非常に便利です!ありがとう! –

関連する問題