PHPz2017-04-17 16:10:22
外部キーは制約であるため、確実に追加のオーバーヘッドが発生します。たとえば、本書によくある例である学生コース選択システム、学生テーブル、コーススケジュールでは、真ん中に学生コース関連付けテーブルが必ず存在します。外部キー制約を追加すると、コースを削除するときに、必ず学生がそのコースを選択したかどうかが必ず確認されます。そうしないと、削除後に学生が選択したコースが見つからず、エラーが発生します。
なぜアンチパターンがあるのかわかりません。外部キー制約を省略すると、データベースの設計がよりシンプルで柔軟になり、より効率的に実行できるようになりますが、それでも他の面で相応の代償を支払わなければなりません。参照整合性を手動で維持するにはコードを追加する必要があります 。元々はデータベース内の制約キーで問題を解決できましたが、現在はそれを維持するコードを作成する必要があります。さらに、判断を維持するために手動でコードを記述することも制約となり、パフォーマンスの低下も発生しますが、それは論理レベルでの話であり、データベースよりもそれほど高速になるわけではありません。
伊谢尔伦2017-04-17 16:10:22
外部キーやパラダイムのようなものは、教科書の中にのみ存在するべきです。外部キーと非正規化を禁止する必要があります。外部キーとクエリ効率の間には関連性はありません。機能はデータ接続を確立することだけですが、なぜデータ接続がロジックによって制限されないのでしょうか?
PHPz2017-04-17 16:10:22
私は仕事を始めて以来、外部キーを追加したことがありません:D 依存関係が多すぎると面倒ですが、パフォーマンスに影響を与えることはありません。効率を向上させるために外部キーを追加することに関するドキュメントは見たことがありません。 私は新人です、私を批判しないでください、はは、怪我をするわけにはいきません。通り過ぎ 通り過ぎ
大家讲道理2017-04-17 16:10:22
外部 Jian は主にデータの整合性と一貫性を維持することを目的としています。たとえば、user テーブルと user order テーブルの間に外部キー関係がない場合、それを order テーブルに挿入できます。しかし、この注文書はそのユーザーのものです、どうしてわかりますか。そうなると、そのようなデータは孤独な幽霊になります。外部の健康との間には関係があります。挿入する場合は、ユーザー テーブル内の関連ユーザーに挿入を要求する必要があります。同様に、ユーザー テーブル内のデータを削除する場合、順序テーブルへの参照がある場合は削除できません。これにより、データの一貫性と完全性が保証されます。
大家讲道理2017-04-17 16:10:22
外部キー制約は主にデータベース レベルでのデータの一貫性を確保するためのものであり、データの挿入と更新には外部キーのチェックが必要なため、理論上のパフォーマンスは低下します。マスターとスレーブのテーブル内でのメイン テーブル ロックの競合は、パフォーマンスに悪影響を及ぼします。
実際のプロジェクトでは、外部キーの使用は推奨されません。一方で、外部キーを使用すると開発の複雑さが軽減されます (外部キーがある場合、マスター/スレーブ テーブルの操作は最初にマスター テーブルで実行される必要があります)。一方で、外部キーはデータを処理する際に非常に困難です。
アプリケーション レベルでデータの一貫性をチェックするのは通常の機能要件です。たとえば、学生がコースを選択するシナリオでは、コースは入力する必要はなく、ドロップダウンまたは検索方法を通じてシステムから選択する必要があります。 、など、これが合法的なコース ID であることを確認できるため、データベースの外部キーに依存してチェックする必要はありません。