2011-01-31 3 views
1

私はこの有する:FK質問

テーブル
テーブルB(AにFK)
表C(FK Bへ)
表D(FK Cまで)

テーブルDのInsert/Updates/Deletesを実行すると、テーブルCのFKをチェックすると仮定しますが、さらに親Aを確認したり、Cで停止したりしますか?良い例は 国 - >州 - >都市 - >近所です。すべてFKによってリンクされています。だから、私が近所のI/U/Dをどれだけ遠くまで調べるのですか?

これは、あまりにも多くの子テーブルに分割する前にデータを正規化することができるかどうかを判断するのに役立ちます。すべてのテーブルをチェックすると、システムが遅くなります。しかし、それは直接の親をチェックするだけなら、私は心配することなく何百ものサブチャイルドテーブルを持つことができます。

+0

どのエンジンを使用していますか? – yoda

+0

innoDB MySQL ... – heneryJ

答えて

2

いいえ、あなたの挿入/更新と削除はBとAに対してチェックされません。この文はCに対してのみチェックします。しかし、Cへの挿入は既にBでチェックされています。有効になります。 SQLServerのための

+0

本質的には、ネストされたレベルで何百ものサブ - 子テーブルを持つことができます。 – heneryJ

+1

はい、何百、何千、何百万。 –

0

回答:CIDが表Cに見つからない場合

あなたは、テーブルDにレコードを挿入

、dRecordにCID外部キーチェックが表C.で発見され、その後、dRecordは次のようになります孤立しており、挿入物は強制的に失敗します。

そのcIDを持つcRecordは、そのbIDが挿入されたときに先にチェックされていました。もう一度チェックする必要はありません。

"連鎖"の動作は、カスケード削除だけです。外部キーにカスケード削除動作がある場合、bRecordを削除すると、関連するすべてのcRecord(一致するbID)とそれらのcRecordに関連するすべてのdRecord(一致するcID)が削除されます。

+0

削除/更新でも同じですか? – heneryJ

+0

あなたは何を求めていますか? –

0

データベースでは、レコード(D)に外部キーがあることを確認する必要があります。Cでレコードを挿入/更新/削除すると、対応するレコードが参照されていることを確認する必要がありますB.レコードはCと比較して検証することなくCに変換することができないため、Dに挿入するときはCのみをチェックする必要があります。

物理データモデリングには、さまざまな懸念事項があります。 Data Modelingについては、たとえば、SnowflakeおよびStarのデータウェアハウジングのスキーマ設計を参照してください。