主キーを理解していないと、データベース設計で行う正規化を理解することができないので、自分なりに学習して理解したことをまとめた。
アイデンティファイアとは
- アイデンティファイア(ID)とは、「このレコードは他のレコードとは違う」と、識別するためのもの。
- 例えば、社員に関するデータが登録されているテーブルがあり、そこにたくさんの社員のレコードが登録されていたとする。 この時、社員を個人一人に特定できるようなカラム(列)がアイデンティファイアになる。この例なら、社員番号などがアイデンティファイアとなる。
- キーはこのアイデンティファイアの中から選ばれる。
主キーとは
そのテーブルのレコードを一つに特定できる組み合わせのこと。 詳しくは以下。
主キーを満たす条件
- レコード(タプル)を一つに特定できること
- そのカラムのレコードがNULLにならないこと
- 最低限の数の組み合わせであること
カラム一つではレコードを一つに特定できないが、カラムが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 |
- まず、取引先名,商品名,数量はアイデンティファイア(ID)ではないため、候補から除外する。
- 主キーの候補となる伝票番号,取引先番号,商品コード を順番に見ていく。
- 伝票番号:1が2つのレコードに登録されているなど、同じ番号が複数あるため不適切
- お得意先番号:101が4つのレコードに登録されているなど、同じ番号が複数あるため不適切
- 商品番号:1が2つのレコードに登録されているなど、同じ番号が複数あるため不適切
→このことから、一つのカラムでは主キーになることができないことが分かる。
- カラム2つの組み合わせで主キーにできないか見ていく。
- 伝票番号とお得意先番号:伝票番号1でお得意先番号が101のレコードが2つあるので、主キーではない - お得意先番号と商品番号:お得意先番号101と商品番号1002のレコードが2つある(2行目と6行目)ので、主キーではない - 伝票番号と商品番号:伝票番号は1で商品番号が1のレコードは一つしかない
→伝票番号と商品番号の2つのカラムを組み合わせたら、一つのレコードを特定できる。
- よって、このテーブルの主キーは伝票番号と商品番号
参考書籍/参考記事
- 『達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ』(ミック 著,翔泳社,2012年出版,全360ページ)
- YouTube動画:主キー(わくわくアカデミー,2013/11/29投稿)
- うさぎでもわかるデータベースの正規化・正規系判定(基本情報・応用情報)
- データベースの正規化とは?