Sakiのプログラミング学習ブログ

プログラミングについて学んだことや、学習の振返りを書いています。

【DB設計】 主キーとは

主キーを理解していないと、データベース設計で行う正規化を理解することができないので、自分なりに学習して理解したことをまとめた。

アイデンティファイアとは

  • アイデンティファイア(ID)とは、「このレコードは他のレコードとは違う」と、識別するためのもの。
  • 例えば、社員に関するデータが登録されているテーブルがあり、そこにたくさんの社員のレコードが登録されていたとする。 この時、社員を個人一人に特定できるようなカラム(列)がアイデンティファイアになる。この例なら、社員番号などがアイデンティファイアとなる。
  • キーはこのアイデンティファイアの中から選ばれる。

主キーとは

そのテーブルのレコードを一つに特定できる組み合わせのこと。 詳しくは以下。

主キーを満たす条件

  1. レコード(タプル)を一つに特定できること
  2. そのカラムのレコードがNULLにならないこと
  3. 最低限の数の組み合わせであること
    カラム一つではレコードを一つに特定できないが、カラムが2つだと特定できる、3つでも特定できるとなった場合、最低数である2つの組み合わせのカラムが主キーである。
    (極端に言えば、すべてのカラムを組み合わせれば、絶対に一つのレコードを特定できてしまう...)

私の失敗:主キーは一つのテーブルにつき、常に一つだけだと勘違いしていた

  • 主キーを満たす条件の3つめに、「最低限の数の組み合わせであること」という条件がある。
  • 私が最初に主キーを学んだのは、『達人に学ぶDB設計』(以下、『達人』と記載)という本なのだが、この本を読んだ時に主キーは一つのテーブルに常に一つしかないと勘違いしていた。ここを勘違いしていると、後に説明する、正規化の手順を理解できなくなってしまうので注意が必要。

  • 勘違いした理由は、 『達人』のp.73では、

    その値を指定すれば、必ず1行のレコードを特定できるような列の組み合わせ

と説明をしてくれている。

が、主キーを説明するための例えのテーブルが、主キーが一つのテーブルだったため主キーは一つのテーブルに一つだけと勘違いしてしまった。

以下がそのテーブル。「社員ID」というカラムが主キーのテーブル。

社員ID 社員名 年齢 部署
000A 加藤 40 開発
000B 藤本 32 人事
001F 三島 50 営業
001D 斉藤 47 営業
009F 田島 25 開発
010A 渋谷 33 総務

( 『達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ』(ミック 著,翔泳社,2012年出版,全360ページ)のp.73より引用)

  • 主キーは一行のレコードを特定できる“組み合わせ“という説明で、複数以上を連想させておいて、例えのテーブルが主キーが一つしかなかったのが、個人的に分かりづらかった。

「社員名」が主キーではいけない理由

上記のテーブルで、「社員名」も主キーにできるように見えるが、同姓同名がもし登録されたら、レコードを一つに特定できなくなるので、不適切。 他にも例えば、お店が商品に関するデータベースを持っていたら、商品名は主キーとして不適切。

主キーが複数の場合はどんなテーブルか

以下のテーブルを使って、それが主キーになるか説明する。

伝票番号 取引先番号 取引先名 商品コード 商品名 数量
1 101 A商事 1 プリン 50 
1 101 A商事 2 シュークリーム 10 
2 102 B建設 1 プリン 5
2 102 B建設 3 クッキー 100
2 102 B建設 4 アイス  20
3 101 A商事 2 シュークリーム 15
3 101 A商事 3 クッキー 40
4 103 C銀行 2 シュークリーム 30
  1. まず、取引先名,商品名,数量はアイデンティファイア(ID)ではないため、候補から除外する。
  2. 主キーの候補となる伝票番号,取引先番号,商品コード を順番に見ていく。
    • 伝票番号:1が2つのレコードに登録されているなど、同じ番号が複数あるため不適切
    • お得意先番号:101が4つのレコードに登録されているなど、同じ番号が複数あるため不適切
    • 商品番号:1が2つのレコードに登録されているなど、同じ番号が複数あるため不適切

→このことから、一つのカラムでは主キーになることができないことが分かる。

  1. カラム2つの組み合わせで主キーにできないか見ていく。
    - 伝票番号とお得意先番号:伝票番号1でお得意先番号が101のレコードが2つあるので、主キーではない  
    - お得意先番号と商品番号:お得意先番号101と商品番号1002のレコードが2つある(2行目と6行目)ので、主キーではない 
    - 伝票番号と商品番号:伝票番号は1で商品番号が1のレコードは一つしかない
    

    伝票番号と商品番号の2つのカラムを組み合わせたら、一つのレコードを特定できる。

  2. よって、このテーブルの主キーは伝票番号と商品番号

参考書籍/参考記事