web-dev-qa-db-ja.com

カスケード削除を避けるべき時期はありますか?

SQL Server 2008には、1対多の関係で他の3つの子テーブルにリンクされているプラ​​イマリテーブルがあります。したがって、プライマリテーブルでカスケード削除を使用して、プライマリテーブルのレコードが削除されると子テーブルのすべてのレコードが削除されるようにすることを検討しています。

  1. では、カスケードは正しい選択をここで削除しますか?
  2. カスケードdeteleを使用すべきでない場合は?
11
Ramesh

トリガーまたはON <something> CASCADEを介したカスケード削除(およびデータを削除/損傷する可能性のある他の自動アクション)には、通常、注意が必要です。このような設備は非常に強力ですが、潜在的に危険です。

  • では、カスケードは正しい選択をここで削除しますか?

親レコードが削除されたときに関連レコードを削除します。他のロジックを実装して子が最初に削除されるようにする必要がないため、コードがより簡潔になります。すべてのアクションは暗黙的なトランザクションでラップされるため、何かが子をブロックすると、操作全体が削除され、参照の整合性が維持されます。

カスケード削除やその他の「舞台裏」アクションの使用が十分に文書化されていることを確認して、システムの将来の保守担当者がそれを完全に認識するようにします。

  • カスケードdeteleを使用すべきでない場合は?

あなたが私のように偏執的であるなら、それは使われるべきではありません!考慮すべき重要な点の1つは、現在または将来的にコード/データベースで作業する他の開発者です( "非表示"の動作の文書化に関する上記のコメントを参照してください)。

私の経験では、経験の浅い人々がDELETEを使用してから行を更新するためにre _INSERTを使用することは非常に一般的です。特に、本当に必要なものがMERGE/UPSERT操作(既存の行を更新し、指定されたキーを持つ行が存在しない新しい行を作成します)およびDBMSはマージ/アップサートをサポートしていません(またはそれらはサポートを認識していません)。カスケードされたアクションがなければこれは完全に安全です(またはデータの整合性を脅かすとエラーになります)が、参照しているFKがON DELETE CASCADEが設定されている親テーブルの行に対してこれを行うと、初期の結果として関連データが削除されます削除して置換されない-データが失われる(削除と後続の挿入が明示的なトランザクションでラップされている場合でも、カスケードは削除操作で発生する-トランザクションが親テーブルの行を置き換えるかどうかを確認するのを待ちませんその後のステートメント)そしてカスケードは他の関係船を通じて継続することができます(例:上級監督者の削除、彼のチームはカスケードによって削除され、彼のチームのチームはカスケードによって削除され、それらすべての人々のすべての追跡されたレコードはカスケードによって削除されます、 ...)。カスケードを有効にしないと、データが静かに失われる代わりに、ここでエラーが発生します。

17
David Spillett

答えは、あなたの状況に意味があるかどうかに要約されると思います場合によります。あなたの状況では、対応する「プライマリ」行が移動した場合に「子」テーブルの行が残ることが理にかなっていますか。親がなければ、子テーブルのデータは無意味ですか?その場合、連鎖削除により参照整合性が適用されます。子行をレコード、過去のアクティビティのアーカイブとして保持したい場合があります(ただし、この目的のために、これらの行を別のテーブルに書き込む可能性もあります)。

この点を説明するために使用した例は、医師と患者の関係でした。 1人の医師が多くの患者を持つことができます。医師がいる場合、患者は患者になることができます。医者が行く(練習をやめる)場合、残りの患者にsomethingが発生する必要があります。 1つの可能性は、それらがパージされることであり、もう1つは、デフォルト値がdoc参照を置き換えるか、メインテーブルから削除されて別の場所に配置される可能性があることです。あるいは、活動は発生せず、患者はドキュメントがまだ存在しているかのように、手つかずのままです。何をしたいかによります。

個人的な経験から、データベースの設計について慎重に検討してください。今週私は、どこも指さず、文字通りスペースを占有していたテーブルで孤立したレコードのパージを実行する必要がありました。

お役に立てれば。

4
the_good_pony

カスケード削除の使用は、テーブルに複数の名前を付けるかどうか(顧客と顧客)など、個人的な好みの問題です。

カスケード削除は絶対に使用しないほうがよいでしょう。一部のデータベース設計では、削除をまったく回避しています。ディスク容量が非常に少ない場合に、データベースからデータを削除する理由はほとんどありません。一部のデータベース設計では、データを物理的に削除するのではなく、追加フィールド「IsDeleted」を設定しています。

データを削除する必要がある場合は、ストアドプロシージャを使用してこれを管理すると、透過性と制御が向上します。アプリケーションは、子から親を削除するストアドプロシージャを実行できます。ビジネス要件が時間の経過とともにどのように変化するかがわからないため、spはより多様性を提供します。それは私の2cです。

3
sa555