6

MySQLデータベースに次のような2つのテーブルがあるとします。

テーブルの人々:

  primary key: PERSON_ID,
  NAME,
  SURNAME, etc.

TABLEアドレス:

  primary key: ADDRESS_ID,
  foreign key: PERSON_ID,
  addressLine1, etc.

(両方のテーブルでの)行の作成とPHPを介したデータの取得を管理する場合でも、データベースに物理的な関係を作成する必要がありますか?はいの場合、なぜですか?

4

4 に答える 4

9

はい、具体的な理由の1つは、テーブルを結合する場合に行の取得を高速化することです。外部キー制約を作成すると、列にインデックスが自動的に作成されます。

したがって、テーブルアドレスのスキーマは次のようになります(テーブルの主キーが)であると仮定しPeoplePERSON_IDます)

CREATE TABLE Address
(
    Address_ID INT,
    Person_ID INT,
    ......,
    CONSTRAINT tb_pk PRIMARY KEY (Address_ID),
    CONTRRAINT tb_fk FOREIGN KEY (Person_ID) 
        REFERENCES People(Person_ID)
)
于 2012-10-26T11:39:10.297 に答える
5

厳密に言えば、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-私たち全員が知っているように)に対する究極の答えではありませんが、真のリレーショナルデータベース設計の重要な部分であることに注意してください。

于 2012-10-26T12:39:27.473 に答える
2

参照整合性は、読んで理解する必要のある記事です。

于 2012-10-26T11:39:29.807 に答える
1

2つの方法があります

-最初の1つは、コーディングですべてを処理し、レコードの削除または更新で管理しますが、外部キーを使用する場合は、関係を強制し、Dbでは、特に外部キー制約のあるレコードを削除することはできません。それに関連するレコードを削除したくない場合は、この種のタスクを実行する必要がある状況が発生します。

-2番目の方法は、Db側で物事を管理することです。データベースに1対多または多対多の関係がある場合、外部キーは非常に便利です。また、彼らはいくつかの良い行動を持っています-制限、カスケード、設定ヌル、行動なしそれらはあなたのためにいくつかの仕事をすることができます

于 2014-03-01T09:24:41.453 に答える