MySQLデータベースで外部キー制約を使用する必要があるかどうかの詳細な説明

MySQLデータベースで外部キー制約を使用する必要があるかどうかの詳細な説明

1. はじめに

外部キー制約を使用するかどうかという話題は、すでに決まり文句になっています。学校では、教師が教えることのほとんどが、外部キー制約を確立することです。しかし、実際の仕事では、外部キーを使用せず、コード ロジックを通じて外部キーを制御することがよくあります。 Alibaba の JAVA 仕様でも明確に規定されています: [必須] 外部キーとカスケードを使用してはならず、すべての外部キーの概念はアプリケーション層で解決する必要があります。

なぜこのような規制をする必要があるのでしょうか?外部キー制約を使用する必要がありますか?例を挙げて説明しましょう

2. 例

これで、データベースに [product と project] という 2 つのテーブルが作成されました。[project] のporductフィールドはProductに関連付けられています。次の図に示すように、それらの間には外部キー レコードがあります。

ここに画像の説明を挿入

project_id 1 のレコードを [project] テーブルに追加すると、[product] テーブルに対応するレコードがないため、エラーが報告されます。

ここに画像の説明を挿入

この制約の存在により、テーブル内のデータ間の関係の整合性が確保されることがわかります。汚れたデータが存在する可能性は低くなります。これは外部キー制約の非常に明白な利点です。

要約すると、外部キー制約には次の利点があります。

  • データの整合性と一貫性を確保する
  • 便利なカスケード操作
  • データの整合性判定はデータベースに委託され、プログラムコードの量を削減します。

しかし、無視できない欠点もあります。

パフォーマンスの問題

[project] と [product] の 2 つのテーブルを作成しました。[project] テーブルには、 project_idフィールドを介して [product] テーブルとの外部キー制約があります。

このとき、[project] テーブルにデータを挿入するたびに、まず [product] に移動して、対応する関連データがあるかどうかを確認します。プログラムによって制御される場合は、このクエリを省略できます。ただし、外部キー制約が設定されている場合は、クエリは確実に実行されます。これは実際には冗長です。関連フィールドが少ない場合は影響がない可能性がありますが、関連フィールドが増えると、この影響は特に顕著になります。

デッドロック

外部キーによりクエリは他のテーブルに依存するため、InnoDB は親テーブル (または関連テーブル) 内の対応する値をチェックする必要があります。これにより、親テーブルの行もロックされ、トランザクションが完了する前に行が削除されないようにします。これにより、予期しないロック待機やデッドロックが発生する可能性があり、その原因を特定するのは困難です。

シャーディングの難しさ

制約のあるデータベースは、異なるデータベースやテーブルに分割する必要がある場合に特に使いにくくなります。

開発/テスト効率の低下

日常のテストプロセスでは、バグが見つかり、それを再現したりテストを容易にしたりしたいという状況に頻繁に遭遇します。テストを容易にするために、データベース テーブルのデータを直接変更します。

これは標準化されていませんが、実際のところ、効率を大幅に向上させることができます。これは疑いの余地がありません!ただし、このような操作では、実際にはプログラムのバグではないデータによってバグが発生したり、潜在的なバグが発見されなかったりするなどの問題が発生する可能性もあります。

結論

現在、多くのインターネット企業、特に大規模な企業では、外部キーを無効にすることが義務付けられています。これはパフォーマンスの問題だけでなく、インターネットビジネスの変化が速いことが主な原因で、間接的にテーブル構造の変化につながります。外部キー制約の存在は予期しない問題を引き起こし、開発効率を低下させる可能性が非常に高くなります。したがって、変更をより適切に受け入れるために、重要でない状況や高い信頼性を必要としないビジネス シナリオでは外部キー制約を使用しないことをお勧めします。
しかし、政府関係、銀行、軍事産業など、高いデータ信頼性が求められる一部のビジネス シナリオでは、外部キー制約を使用する方が適しているため、これを単純に無視することはできません。したがって、私の提案は、ビジネスが比較的複雑な場合は、テスト環境では外部キー制約を使用できますが、実稼働環境では削除する必要があるということです。ビジネスが比較的単純な場合は、外部キー制約を完全に削除できます。ただし、データ エラーが許されず、高い信頼性が求められる銀行業界や軍事業界などのシナリオでは、外部キー制約を確立することをお勧めします。

これで、MySQL データベースで外部キー制約を使用する必要があるかどうかに関するこの記事は終了です。MySQL データベースの外部キー制約の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL で外部キー制約を作成および削除する方法
  • MySQL に外部キー制約を追加する具体的な方法
  • MySQL データベースの制約とデータ テーブルの設計原則
  • MySQL 学習: データベース テーブルの 5 つの主要な制約を初心者向けに詳しく説明します
  • MySQL の 6 つの一般的な制約タイプの詳細な説明
  • MYSQLの主キー制約とユニーク制約の違いについて簡単に説明します。
  • MySQL 制約の超詳細な説明
  • MySQL の null 制約のケースの説明
  • MySQLデータベースのテーブルに制約を設定する方法

<<:  CSS はモバイル互換性の問題を解決するために 0.5px の線を実装します (推奨)

>>:  レスポンシブフレームワークのテーブルヘッダーの自動改行問題に対する簡単な解決策

推薦する

MySQL コード実行構造例の分析 [シーケンス、分岐、ループ構造]

この記事では、例を使用して MySQL コード実行構造について説明します。ご参考までに、詳細は以下の...

Nginx における 2 つの現在の制限方法についての簡単な説明

負荷は通常、システム設計時に予測されます。システムがパブリック ネットワークに公開されている場合、悪...

html の img src="" で js 関数または js 変数を呼び出して、画像パスを動的に指定します。

この問題に関して、オンライン リソースをたくさん見つけました。ここにいくつかの方法を示します。コード...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

MySQL 8.0.11 MacOS 10.13 のインストールと設定方法のグラフィックチュートリアル

MacにMySQLデータベースをインストールし、環境変数を設定する手順を参考までに記録します。具体的...

ページのスクロールバーを無効にするには、overflow: hiddenを使用します。

コードをコピーコードは次のとおりです。 html {オーバーフロー: 非表示; }体{オーバーフロー...

MySQL の高可用性アーキテクチャの完全な説明: MHA アーキテクチャ

目次1. はじめに2. 構成3. 作業プロセス4. 建築5. 表示例MHA (Master HA) ...

require/import キーワードを使用して v-for ループでローカル画像をインポートするいくつかの方法

目次問題の説明方法 1 (バックエンドが画像 URL を返す)方法 2 (フロントエンドで requ...

Dockerのネットワークモードと設定方法

1. Dockerネットワークモードdocker run が Docker コンテナを作成するときに...

LinuxにPHP7をインストールする方法の詳細な説明

Linux に PHP7 をインストールするにはどうすればいいですか? 1. 依存パッケージをインス...

サイトマップをウェブページの下部に配置するメリットと例

以前は、ほとんどすべての Web サイトに、すべてのページをリストしたサイトマップ ページがありまし...

VM VirtualBox 仮想マシンのマウント共有フォルダ

一つの環境CentOS 7にVMware Toolsをインストールしてホストの共有フォルダへのアクセ...

Linuxサーバーのディスク容量を拡張する方法

目次序文ステップ序文今日、es ログが記録されていないことに気付きました。filebeat、elas...

HTML テーブルタグチュートリアル (11): 水平方向の配置属性 ALIGN

水平方向では、テーブルの配置を左、中央、右に設定できます。基本的な構文<テーブル配置=&quo...

MySQL5.7+ MySQL Workbenchのインストールと設定方法のグラフィックチュートリアル(MAC)

この記事では、主にMACオペレーティングシステムでのMySQL5.7とMySQLWorkbenchの...