厳密に言えば、FKを使用する必要はありません。注意深い索引付けとよく書かれたクエリで十分なように思われるかもしれません。ただし、FKおよび確かにFKの制約は、データの一貫性を確保する場合(たとえば、孤立したデータを回避する場合)に非常に役立ちます。
アプリケーションを作成し、すべてがテストされ、魅力のように機能するとします。素晴らしいですが、何かを変更する必要があるたびにあなたがいると誰が言いますか?コードを自分で保守する予定ですか、それとも他の誰かが簡単な修正/微調整を行ったり、将来的に別の機能を実装したりする可能性がありますか?実際には、コードを記述して保守するのはあなただけではありません。コードを保守しているのはあなただけだとしても、時間が経つにつれてほぼ確実にバグに遭遇するでしょう...
外部キーは両方に通知しますあなたの同僚とあなたのtbl1からのデータは、tbl2からのデータに依存し、その逆も同様です。コメントと同様に、これによりアプリケーションの保守が容易になります。
バグの検出は簡単です。tbl1からレコードを削除するメソッドを作成しますが、最初のtblに加えられた変更を反映するようにtbl2を更新するのを忘れます。これが発生すると、データが破損しますが、これを引き起こしたクエリでエラーが発生することはありません。SQLは構文的に正しく、実行するアクションは目的のアクションです。これらの種類のバグはかなり長い間隠されたままになる可能性があり、これが発見されるまでに、神はどれだけのデータが破損しているかを知っています...
最後に、これは非常に頻繁に使用される引数ですが、一連の更新/削除クエリの途中でDBへの接続が失われた場合はどうなりますか?FK制約を使用すると、特定のアクションをカスケードできます。私は実際にこれが起こるのを見たことがありませんが、そのようなシナリオから保護するためのコードを書かない人を知っています
いくつかのリレーショナルレコードを削除または更新しますが、途中でDBとの接続が何らかの理由で切断されます。tbl2を編集した可能性がありますが、tbl1へのクエリが送信される前に接続が失われました。繰り返しになりますが、データが破損することになります。
ここではFKCASCADE
が非常に便利です。tbl1から削除し、ON DELETE CASCADE
ルール。これにより、関連するレコードがtbl2から削除されるので安心できます。同じ状況でON DELETE RESTRICT
、、もかなり便利なルールになる可能性があります。
FKは、人生、宇宙、そしてすべて(42-私たち全員が知っているように)に対する究極の答えではありませんが、真のリレーショナルデータベース設計の重要な部分であることに注意してください。