この質問はタイトルにあります!
私の(本番)Webサイトからのデータを保存するために使用しているデータベースには、多くのON DELETE CASCADE
.
それが良いことなのか、それともすべての削除を手動でコーディングするのがより良い方法なのか、私はただ知りたい.
一方で、それはあまり明示的ではありません。削除は魔法によって行われ、他方では、開発が容易になります。データベースのスキーマ全体を頭に入れておく必要はありません。
参照整合性を維持することは良いことだと思います。データベース内の孤立した行は、最も避けたいことです。
参照整合性を使用しない場合の考慮事項については、MySQL のドキュメントを参照してください。
MySQL では、データベース開発者がどのアプローチを使用するかを選択できます。外部キーが不要で、参照整合性の適用に伴うオーバーヘッドを回避したい場合は、代わりに MyISAM などの別のストレージ エンジンを選択できます。(たとえば、MyISAM ストレージ エンジンは、INSERT および SELECT 操作のみを実行するアプリケーションに対して非常に高速なパフォーマンスを提供します。この場合、テーブルの中央に穴がなく、挿入と検索を同時に実行できます。セクション 8.10.3 を参照してください。 「同時挿入」。)
参照整合性チェックを利用しないことを選択した場合は、次の考慮事項に留意してください。
サーバー側の外部キー関係チェックがない場合、アプリケーション自体が関係の問題を処理する必要があります。たとえば、適切な順序で行をテーブルに挿入し、孤立した子レコードが作成されないように注意する必要があります。また、複数レコードの挿入操作の途中で発生したエラーから回復できなければなりません。
ON DELETE がアプリケーションに必要な唯一の参照整合性機能である場合、複数テーブルの DELETE ステートメントを使用して単一のステートメントで多くのテーブルから行を削除することにより、MySQL Server 4.0 と同様の効果を得ることができます。セクション13.2.2「DELETE 構文」を参照してください。
ON DELETE がない場合の回避策は、外部キーを持つテーブルからレコードを削除するときに、適切な DELETE ステートメントをアプリケーションに追加することです。実際には、これは多くの場合、外部キーを使用するのと同じくらい速く、移植性が高くなります。
外部キーを使用すると、問題が発生する場合があることに注意してください。
外部キーのサポートは多くの参照整合性の問題に対処しますが、キーの関係を慎重に設計して、循環規則やカスケード削除の不適切な組み合わせを回避する必要があります。
DBA が、バックアップから個々のテーブルを復元するのを困難にする関係のトポロジを作成することは珍しくありません。(MySQL は、他のテーブルに依存するテーブルをリロードするときに外部キー チェックを一時的に無効にできるようにすることで、この問題を軽減します。セクション14.3.5.4「外部キーの制約」を参照してください。この機能は、リロード時に自動的に解除されます)。
ソース: http://dev.mysql.com/doc/refman/5.5/en/ansi-diff-foreign-keys.html
カスケード削除は、使用するのが完全に理にかなっている場合にのみ使用することを確認する限り、使用するのに最適なツールです。
カスケード削除の使用を選択する主な状況は、別のテーブルの 1 つの (そして 1 つのみの) 行によって "所有" されているエンティティをモデル化するテーブルがある場合です。たとえば、人をモデル化するテーブルと電話番号をモデル化するテーブルがあるとします。ここで、電話番号テーブルには、ピープル テーブルへの外部キーがあります。アプリケーションで誰かを追跡する必要がなくなったと判断した場合 (「Douglas」など)、Douglas の電話番号も追跡したくないというのは理にかなっています。データベースに電話番号が浮かんでいるのに、それが誰なのかわからないというのは意味がありません。
しかし同時に、「people」テーブルから人を削除したい場合、最初にその人の電話番号があるかどうかを確認して削除するという面倒なことはしたくありません。人が削除されたときに電話番号もすべて削除されるというルールをデータベース構造にエンコードできるのに、なぜそれを行うのでしょうか? それがカスケード削除が行うことです。どのカスケード削除があるかを確認し、それらがすべて意味を成していることを確認してください。
注意。トリガーを使用する場合は、より注意する必要があります。MySQL はカスケード削除でトリガーを起動しません。