2012-04-30 9 views
1

この質問はタイトルにあります!mysqlテーブルのカスケード削除についてどう思いますか?

私の(生産)ウェブサイトからのデータを保存するために使用しているデータベースには、多くのON DELETE CASCADEが含まれています。

私はそれが良いのかどうか、またはすべての削除を手作業でコードするより良い方法だと分かりました。

一方で、それはあまり明白ではありません。削除は魔法によって行われますが、開発が容易になります。データベースのスキーマ全体を念頭に置いておく必要はありません。

+0

個人的に私はそれをするためにMySQLを信頼しません。 –

+0

@ ta.speot.is:もしあなたがそのような不信を持っているなら、多分信頼できると思うRDBMSを使うべきです。 (おそらくそれはあなたが作っていた点ですが、分かりません)yor RDBMSの基本的なリレーショナルデータベース機能を使用しないと、必要以上に自分自身でより多くの作業をしている可能性があります。 – Hammerite

+0

@Hammerite MySQLを使用しないことがポイントでした。 –

答えて

1

私は、参照整合性を維持するのが良いことだと思います。あなたが望む最後のものは、データベース内の孤立した行です。

参照整合性を使用していないときに考慮すべき事柄でMySQLのマニュアルを参照してください:

MySQLは、データベース開発者は使用することが接近するの選択肢を提供します。外部キーが不要で、参照整合性の実施に伴うオーバーヘッドを避けたい場合は、代わりにMyISAMなどの別のストレージエンジンを選択できます。 (たとえば、MyISAMストレージエンジンは、INSERTおよびSELECT操作のみを実行するアプリケーションでは非常に高速なパフォーマンスを提供します。この場合、テーブルには穴が空いておらず、検索は挿入と並行して実行できます。 「同時挿入」)

あなたは次の点に注意してください、参照整合性チェックを利用しないことを選択した場合:。

サーバー側の外部キー関係チェックがない場合は、アプリケーション自体が処理しなければなりません関係の問題。たとえば、適切な順序でテーブルに行を挿入し、孤立した子レコードを作成しないように注意する必要があります。また、複数レコードの挿入操作の途中で発生するエラーからも回復できる必要があります。

ON DELETEがアプリケーションに必要な唯一の参照整合性機能である場合、複数のテーブルのDELETEステートメントを使用して単一のステートメントで多くのテーブルから行を削除することで、MySQL Server 4.0と同様の効果を得ることができます。項13.2.2。「DELETE構文」を参照してください。

ON DELETEの不具合を回避するには、外部キーを持つテーブルからレコードを削除するときに、アプリケーションに適切なDELETEステートメントを追加します。実際には、これは外来キーを使用する場合と同じくらい速く、ポータブルでもあります。

外部キーの使用は時々問題を引き起こす可能性があることに注意してください:

外部キーのサポートアドレス多くの参照整合性の問題が、円形のルールやカスケードの間違った組み合わせを避けるために、慎重にキー関係を設計することが必要です削除します。

DBAがリレーションシップのトポロジを作成して、バックアップから個々のテーブルを復元することを困難にすることは珍しくありません。 (MySQLは、他のテーブルに依存するテーブルをリロードする際に、外部キーチェックを一時的に無効にすることで、この難点を緩和します)項14.3.5.4。「FOREIGN KEY制約」MySQL 4.1.1以降、mysqldumpは、この機能の再読み込み時に自動的に実行されます。)

出典:http://dev.mysql.com/doc/refman/5.5/en/ansi-diff-foreign-keys.html

0

カスケード削除は、あなたがそれがそうする完璧な理にかなっているだけでそれらを使用することを確認して、使用するための素晴らしいツールです。

カスケード削除を使用する主な状況は、別のテーブルの1つの行だけが所有するエンティティをモデル化した表がある場合です。たとえば、人をモデル化したテーブルと電話番号をモデル化したテーブルがあるとします。ここであなたの電話番号テーブルにはあなたの人物テーブルへの外部キーがあります。 Douglasの電話番号を把握したくないということは、あなたのアプリケーションで誰かを追跡する必要がなくなったと判断した場合、つまり、「Douglas」と言います。あなたのデータベースに浮かんでいる電話番号を持っていて、それが誰であるかわからないことに意味がありません。

同時に、「人物」テーブルから人物を削除する場合は、その人物の電話番号があるかどうか厳重にチェックして削除する必要はありません。それは、人が削除されたときに電話番号もすべて変更できるというルールをデータベース構造にエンコードすることができるのはなぜですか?カスケード削除があなたのためにするものです。カスケード削除の内容を知っていることを確認してください。

NB。トリガーを使用する場合は、より注意する必要があります。 MySQLはカスケード削除のトリガを起動しません。

関連する問題