• ベストアンサー

SQL の主キーについて

次のページで・・・ https://rfs.jp/sb/sql/s03/03_3.html "各テーブル間のリレーション"というところに図がありますが、商品テーブル、顧客テーブルの商品ID、顧客IDはそれぞれ主キーである必要はあるのでしょうか? ユニークであることは前提ですが。 Access, SQL Serverで考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.3

システムの設計によって考え方は違ってくると思います。 商品IDや顧客IDは人間が目で見ることがあるのか否か。 そのIDが変更されることがあるのか否か。 変更された際にリレーションを破棄してもいいのか否か。 削除されたIDを別データとして再利用させてもいいのか否か。 リレーショナルデータベースの理想の姿としては、こうあるべきとか、こうあってはいけないとかあると思うので、それに対しての正解はあるかも知れません。 ですがシステムへの要望によっては理想の姿とはちょっとだけずれたりすることもあると思います。それはシステム設計者の問題なのかも知れないこともあるでしょうし。 何を主キーとするかはそんなこんなで決まるとして、JOINする項目として使うものが主キーであるべきかについては、主キーでなくても構わないですがインデックスであった方がいいと、私は思います。 ユニーク指定で自動的にインデックスとして扱われるデータベースもあるのかも知れませんが、ユニークとインデックスが別々の概念であるとするなら、インデックスであった方が検索(探索、走査)が早くなるはずなので、このパフォーマンスのためにインデックスにした方がいいと考えます。 データベースのアルゴリズムがどのようなものかによって違ってくるのかも知れませんが、SQL Serverではユニーク(制約)とインデックスは別々のものなのでそんな風に私は思っています。

ebaeba2
質問者

お礼

主キーに対する、考え方がわかりました。 とりあえず、JOINは主キーでなくてもよさそうなので現状変更なしで進めたいと思っております。 JOINに使う項目ですのでいったん、設定されれば更新、削除されることはありません。 ありがとうございました。

その他の回答 (2)

回答No.2

すみません、言い方を間違えました。 >>主キーは1つで充分です ではなく、主キーは1つでないといけません。 また、そのレコードのその他のフィールドの中身が 全く同じであっても、主キーが違えば別のレコードです。 失礼しました。

回答No.1

主キーは1つで充分です。 他のテーブルから参照される際に、レコード全体で重複する値がなければよいのです。 それが不可能なら「正規化されていない」だけのことです。 また、他のテーブルをそれより他のテーブルが参照する際も、 共通の主キーを使用するように、設計するべきです。 難しい場合も参照元の「新」主キーは一意でなければなりません。

ebaeba2
質問者

補足

ご回答ありがとうございます。 例のテーブルを元に追加説明させていただきますと、別にIDカラムがあってオートナンバーで主キーになっています。そして商品ID、顧客IDカラムがあって値は採番テーブルを元に取得していて値はユニークです。 ただ、JOINする際に後者の主キーでない方を採っています。 JOINする場合、照合元は主キーである必要があるのかな?って思いまして。 よろしくお願いいたします。

関連するQ&A