27

私はプライマリキーuser_idとテーブル2を持っています。user_idは外部キーです。MySQL - プライマリキーとしての外部キーの使用

user_idごとに1つのレコードのみがテーブル2に存在することができ、レコードなしでは存在できません。

質問:表2のuser_idは同時に外部キーとプライマリキーの両方になることができます。はいの場合、それは良いアイデアですか、賛否両論ですか?

+0

類似した質問(重複はありません):[MySQLの主キーである外部キーを作成する方法](http://stackoverflow.com/questions/5575051/how-to-create-foreign-key -th-a-a-primary-key-in-mysql) – naXa

答えて

32

はい、これを行うことができます(また、データベース設計の観点から)。 user_idは表2に主キーである場合

しかし、あなたは表2の各行は、ユーザに対応していることを言って有効になっているが、あなたはすでに、各行は、ユーザーに対応するテーブルを持って、それが何を意味するのか考えてみます。これは、「なぜ表2のすべてのデータを表1のNULL可能な列に入れないのですか?」という疑問が生じます。結局のところ、2つのテーブルを持つことは、このデータを1つではなく2つのクエリで取得する必要があることを意味します。

  • あなたは表2に多くのユーザーが、数行しか持っている場合、おそらくテーブル2上のクエリはまれにしか行われません、:

    は今、この練習は良いアイデアかもしれないいくつかのシナリオがあります;同時に、表1の記憶域と変更速度を得る

  • 将来、表2の主キーが変更され、外部キーが残っている可能性があります。テーブル1にすべてのデータを置くと、この変更によってデータベースモデルが破損する可能性があります。

これは良い考えですが、アプリケーションの詳細によって異なります。

+2

ありがとうございます。私の場合は、あなたが言及した最初のシナリオに加えて、テーブル2には多くのカラムがあり、テーブル3,4と同様にテーブル1と同様の関係があるので、すべてのカラムを置くことは大変です。 – CodeVirtuoso

+5

これは、[クラステーブルの継承](http://stackoverflow.com/a/3579462/1709587)を使用している場合、表2が表1のサブクラスを表す場合です。これは特別なあなたの最初の箇条書きの場合。 –

+0

別の理由は、表Cの列を共有する表Aと表Bの2つの異なる表がある場合です。たとえば、「連絡先」という表、「従業員」と呼ばれる表、および「People」という表があります。人々は名字、姓などを持ち、連絡先と従業員は両方とも人を代表しています。 –

関連する問題