1. はじめに外部キー制約を使用するかどうかという話題は、すでに決まり文句になっています。学校では、教師が教えることのほとんどが、外部キー制約を確立することです。しかし、実際の仕事では、外部キーを使用せず、コード ロジックを通じて外部キーを制御することがよくあります。 Alibaba の JAVA 仕様でも明確に規定されています: [必須] 外部キーとカスケードを使用してはならず、すべての外部キーの概念はアプリケーション層で解決する必要があります。 なぜこのような規制をする必要があるのでしょうか?外部キー制約を使用する必要がありますか?例を挙げて説明しましょう 2. 例これで、データベースに [product と project] という 2 つのテーブルが作成されました。[project] の この制約の存在により、テーブル内のデータ間の関係の整合性が確保されることがわかります。汚れたデータが存在する可能性は低くなります。これは外部キー制約の非常に明白な利点です。 要約すると、外部キー制約には次の利点があります。
しかし、無視できない欠点もあります。 パフォーマンスの問題 [project] と [product] の 2 つのテーブルを作成しました。[project] テーブルには、 このとき、[project] テーブルにデータを挿入するたびに、まず [product] に移動して、対応する関連データがあるかどうかを確認します。プログラムによって制御される場合は、このクエリを省略できます。ただし、外部キー制約が設定されている場合は、クエリは確実に実行されます。これは実際には冗長です。関連フィールドが少ない場合は影響がない可能性がありますが、関連フィールドが増えると、この影響は特に顕著になります。 デッドロック 外部キーによりクエリは他のテーブルに依存するため、InnoDB は親テーブル (または関連テーブル) 内の対応する値をチェックする必要があります。これにより、親テーブルの行もロックされ、トランザクションが完了する前に行が削除されないようにします。これにより、予期しないロック待機やデッドロックが発生する可能性があり、その原因を特定するのは困難です。 シャーディングの難しさ 制約のあるデータベースは、異なるデータベースやテーブルに分割する必要がある場合に特に使いにくくなります。 開発/テスト効率の低下 日常のテストプロセスでは、バグが見つかり、それを再現したりテストを容易にしたりしたいという状況に頻繁に遭遇します。テストを容易にするために、データベース テーブルのデータを直接変更します。 これは標準化されていませんが、実際のところ、効率を大幅に向上させることができます。これは疑いの余地がありません!ただし、このような操作では、実際にはプログラムのバグではないデータによってバグが発生したり、潜在的なバグが発見されなかったりするなどの問題が発生する可能性もあります。 結論現在、多くのインターネット企業、特に大規模な企業では、外部キーを無効にすることが義務付けられています。これはパフォーマンスの問題だけでなく、インターネットビジネスの変化が速いことが主な原因で、間接的にテーブル構造の変化につながります。外部キー制約の存在は予期しない問題を引き起こし、開発効率を低下させる可能性が非常に高くなります。したがって、変更をより適切に受け入れるために、重要でない状況や高い信頼性を必要としないビジネス シナリオでは外部キー制約を使用しないことをお勧めします。 これで、MySQL データベースで外部キー制約を使用する必要があるかどうかに関するこの記事は終了です。MySQL データベースの外部キー制約の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)
>>: レスポンシブフレームワークのテーブルヘッダーの自動改行問題に対する簡単な解決策
この記事の例では、メモ帳の小さな機能を実現するためのvueの具体的なコードを参考までに共有しています...
ブラウザのウェブページを最適化するためのいくつかのルールページの最適化静的リソース圧縮ビルド ツール...
ここでは、PHP、JSP、または .NET 環境については説明しません。アーキテクチャの観点から問題...
長い間ウェブサイトを作ってきましたが、入力時のnameとidの違いがまだわかりません。最近jQuer...
この記事では、配列フィルタリングを実装するためのJavaScriptの具体的なコードを参考までに紹介...
シナリオ会社のプロジェクトはDockerでデプロイされています。原因不明ですが、コンテナが時々停止し...
apk add ansible を使用して、alpine イメージに ansible サービスを追加...
データベースが同じデータ バッチを同時に追加、削除、および変更すると、ダーティ書き込み、ダーティ読み...
HTML を使用してコンテンツをマークアップする目的は、Web ページにセマンティクスを与えることで...
注記記事表示リストインターフェースを開発する場合、情報の基本的な概要を提供するために記事ヘッダーコン...
目次1. NFS の概要2. NFS構築1. NFSサーバーの構築2. NFSクライアントの構築3....
1. TypeScriptの紹介前回の記事ではTypeScriptのインストール、使い方、自動コンパ...
MySQL を使用してデータベースをクエリし、左結合を実行すると、関連付けられたフィールドの一部に...
1. 事前準備 (windows7+mysql-8.0.18-winx64) 1. ダウンロードアド...
0. 準備: • iTunesを閉じる• タスクマネージャーでiTunesから始まるサービスを終了し...