2011-10-19 10 views
8

これは具体的な質問ではなく、もっと一般的な疑問です。ジレンマ:カスケード削除または結合削除

1:M関係で複数のテーブルを削除する必要がある場合、カスケード削除でFK制約を作成するか、deleteステートメントでテーブルを結合する方がよいでしょうか。

私は、関連するテーブルに対して別々の削除ステートメントを持っていて、いくつかのステートメントが実行されず、データの完全性が損なわれた古いプロジェクトを持っていました。私はその2人の間で決定を下さなければならなかったので、もっと良い解決策を考えていました。

ストアドプロシージャまたはトランザクションを作成するオプションもあります。

だから私は意見やアドバイスを探しています...?

答えて

4

データベースに適切なRIが定義されている場合、データの完全性が損なわれることはありません。関連するすべてのテーブルには宣言的なRIが必要です。つまり、にはまだ子がありますが、削除することはできません。

また、いくつかの行を時々削除しているコードがあると、それはコーディングが貧弱でテストが貧弱です。この種のアクションは単一のトランザクションでなければなりません。ストアドプロシージャを使用することの提案は、その問題を解決するための優れたアプローチであり、かなり標準的です。

すでに説明したように、カスケードトリガーは、誰かが削除したくない行を削除する危険性があります。特にデータの問題を修正するときに、アプリケーションの外部からデータにアクセスしている人がいると考えてください。誰かが誤って間違った親を削除しようとしたときに、うまくいくRIエラーが発生したとき。彼らが間違った親を誤って削除しようとすると、その親を削除するだけでなく、5つの他のテーブルに20人の子供が削除されます。

また、カスケード削除は非常に隠されています。開発者が親の削除をコーディングしている場合、削除ストアドプロシージャを使用して子を処理する必要があることを知っておく必要があります。開発者に削除を投げさせることよりも、開発者にコードを付けさせずにエラーを取得し、彼のコードを修正すること(または、彼が本当に削除をすべて実行したくないことに気付くこと)が望ましいコードが公開されるまで子どもを殺していることは誰にも分かりません。

IMOでは、私の開発者にアプリケーションについての知識があり、アプリケーションを知らない方が簡単になるようにしたいと考えています。

7

カスケード削除を使用する方が安全だと思います。結合を使用する場合は、親テーブルから何かを削除するたびにそれらを使用する必要があります。あなたがそれを行うのに十分訓練されていても、あなたの同僚や将来あなたのソフトウェアをサポートする人たちについては確信が持てません。また、テーブル関係に関する知識を複数回符号化することはDRYの原則に違反します。

カスケード削除を使用する場合、誰も何も覚えておらず、子行は常に必要に応じて削除されます。

+0

完全に。偉大な答えとよく置く。データの整合性は常に注目を集めておらず、通常、数年後にはじまり、多くの企業を絞め殺してしまいます。 –

+0

カスケード削除には、手動でデータを削除する際の事故の可能性があるため、いくつかの汚点があるようです。個人的に私はそれに関していくつかの悪い経験をしてきましたが、厳密なデータの完全性を維持することがより安全な方法であることにはまだ同意します。一方、私はまだカスケードの使用を避けようとしています。 –

4

カスケード削除は多くの問題を引き起こすため、非常に危険です。私はその使用をお勧めしません。まず、数百万の子レコードを持つレコードを削除する必要があるとします。データベースをロックして、何時間も使用できなくなる可能性があります。カスケード削除をデータベースで使用できるようにするdbasの数はごくわずかです。

次に、FKを定義していれば、データの完全性には役立ちません。まだ子レコードが存在する削除は、良いものです失敗します。顧客が既存の注文を持っていれば、削除を失敗させたい無駄にカスケード削除を使用すると(通常は私の経験上)、実際に削除したくないものが削除される可能性があります。

0

両方を使用してください!

"結合された"手動削除は、通常、デッドロックやその他の競合の問題を回避するために、削除を小さな作業単位に分割することができます。もしあなたが競争しているなら、間違いなく紛争の原因を見つけることは簡単です。

「削除カスケード」は、参照整合性を絶対に保証します。

デッドロックやパフォーマンス上の問題を避けるために、結合されたsqlsの「子」の明示的な削除を両方とも使用してください。しかし、 "CASCADE DELETE"を有効にしておけば、あなたが忘れたものを捕まえることができます。親を削除するときに子供が残ってはならないので、あなたがあなたの削除を間違えた場合を除き、これはあなたに何の費用もかかりません。

+0

すべての外部キーが参照整合性を保証します。 –

関連する問題