カスケード削除 MSSQL Serverでは、単一のテーブルにのみカスケードできます。ディメンションテーブルに対して外部キー関係を持つ2つのテーブルがある場合、カスケード削除をカスケードできるのはそのうちの1つだけです。 (これは、削除が複数のパスを介してカスケードされ、競合が発生するのを防ぐためです。C++では多重継承が許可されていますが、C#では単一の継承のみが許可されています)
この場合、トリガーを使用するか、コードでケースを具体的に処理する必要があります。
このため、多くの人がすべての場合にトリガーを使用することを選択するのを見てきました。外国のテーブルが1つしかない場合でも。これにより一貫性が確保されるため、データベースを保守するときに何を探すべきかがわかります。
削除を複数のテーブルにカスケードできる場合は、それが最も望ましいオプションだと思います。ただし、この制限により水が濁り、私は現在、そのようなすべての動作を所有するトリガーを支持しています。カスケードされた削除と更新にトリガーを使用する際のオーバーヘッドは、コーディングの観点からはごくわずかですが、真に一般的な標準的な方法を可能にします。
編集:
「受け入れられた答え」を他の誰かに移したいと思うかもしれません。私は上記のことで間違っていたことがわかりました。
複数のファクトテーブルに、署名ディメンションテーブルへのONDELETECASCADE外部キー制約を設定できます。
できないことは、1つのファクトテーブルに複数のディメンションテーブルへのONDELETECASCADE外部キー制約があることです。
たとえば...
-ディメンションテーブル[Person](id INT IDENTITY、)
-ディメンションテーブル[Exam](id INT IDENTITY、)
-フェイステーブル[Exam_Score](person_id INT、exam_id INT、スコアINT)
PersonまたはExamのいずれかが削除された場合は、関連するExam_Scoreレコードも削除する必要があります。
これは、MSSQLServerでONDELETECASCADEを使用することはできないため、トリガーが必要です。
(これを私に説明しようとしたMehrdadに謝罪しましたが、私は彼の主張を完全に見逃しました。)