はじめに
主キー、候補キー、スーパーキー、外部キー
の違いについて具体例を使ってまとめました。
動画での解説もしているのでこちらも参考にしていただければと思います。
主キー、候補キー、スーパーキー、外部キーの違いとは
関係(テーブル)において、タプル(レコード)を一意に識別するための属性(カラム)をキーといい、
このキーについて説明していきます。
主キー(primary key)とは
主キーは関係(表)の中で一つだけ設定します。
一意制約(重複が認められない)と非ナル制約(NULLが認められない)を併せ持つもので、
候補キーの中から最もふさわしいものが選ばれます。
例えば、
商品を識別するために一意に振られるような商品番号とか、
社員を識別するために一意に振られるような社員番号などがあります。
候補キー(candidate key)とは
候補キーは関係(表)の中に複数存在することがあります。
主キーの候補となるキーが候補キーで、候補キーの条件は、
- タプル(行)を一意に識別できること
- 極小であること(スーパーキーの中で極小のもの)
主キーとは異なり、NULLを許可する属性を持つ(もしくは含む)ものも許可します。
スーパーキー(super key)とは
関係(表)の中に、候補キーの数以上に存在し、
タプル(行)を一つに特定できるという条件(極小でなくていい)さえ満たせばスーパーキーになります。
具体的には、
候補キーに、様々な組み合わせで他の属性を付け足したものになります。
(関係(表)の、全ての属性もスーパーキーの一つになります。)
主キー、候補キー、スーパーキーの違いの例
次の表のような1人の社員に対して複数のタプル(行)を管理しているテーブルがあります。
この表では、
社員番号と連番、もしくは、電話番号だけで一意になります。
この場合、主キー、候補キー、スーパーキーはそれぞれ以下のようになります。
◆主キー:{社員番号、連番}
◆候補キー:{社員番号、連番}
{電話番号}
◆スーパーキー:{社員番号、連番}
{社員番号、連番、氏名}
{社員番号、連番、氏名、性別}
・・・
{社員番号、連番、氏名、性別、電話番号、住所}
スーパーキーの中で、タプルを一意に識別できる極小の
{社員番号、連番}、{電話番号}が候補キーとなり、
さらに、
NULLを許可しない属性のみからなる候補キーの{社員番号、連番}が主キーになります。
また、主キー、候補キー、スーパーキーの関係を絵にするとこうなります。
外部キー(foreign key)とは
他の関係(表)の主キー(または候補キー)を参照する項目を外部キーといいます。
例えば、
次の例のようにエンティティA、B間の関係が1対1の場合、
片方の主キーをもう片方に入れて外部キーとすることがあります。
関連が1対多の場合、関係A(1側)の主キーを関係B(多側)に入れて外部キーとします。
関係が多対多の場合、新たに関連エンティティを設けます。
これをエンティティCとおき、関係A、Bのそれぞれの主キーを関係Cに入れて外部キーとします。
まとめ
今回はデータベースのいろいろなキーの違いについて具体例を使いながらまとめてみました。
テーブル設計をする上でキーを決めていく作業は重要なので押さえておく必要があります。
僕が9年間現場で働いてきて、
重要だと感じたデータベース周りの知識に関するまとめ記事を作ったので
興味がある方はこちら参照してみてください
合格、おめでとうございます。
あと、勉強になりました。
ありがとうございます。
候補キーの追加の条件について、質問があります(すでにおっしゃっていたら申し訳ありません)。
「候補キーはスーパーキーの中で最小のもの」とありました。
それをもう少し厳密にすると、「候補キーはスーパーキーの上位集合をすべて省いたもの」、となるのでしょうか?
最初の一文、「追加」ではなく、「厳密」の間違いでした。
ご質問ありがとうございます。
例のように社員番号と連番でテーブルのレコードが一意に特定できる場合、
{社員番号、連番}がテーブルのレコードを一意に特定できる最小の組み合わせ(候補キー)
で、スーパーキーと言うのはいくらでもあって。。。
{社員番号、連番、氏名}、{社員番号、連番、氏名、性別}とかとか。
つまり、本当は{社員番号、連番}の組み合わせで一意に特定できるけど、他の項目を追加で組み合わせても一意にさえなればスーパーキーです。
回答になってますでしょうか。。。
はじめまして。
TomoProgと申します。
疑問に思った点があったため、質問させていただきます。
候補キーについて質問なのですが、この記事の例の場合、
{ 電話番号 }
は候補キーにならないのでしょうか?
電話番号はすべてユニークなので、電話番号だけでもタプルを特定できるため、候補キーになるのではと思ったのですが、考え方が違うのでしょうか?
ご質問ありがとうございます。
仰る通り、考え方は合っています。
この例だと電話番号でも候補キーになります。
すみません。。。混乱させてしまいましたね。