データベースの正規化
PMに「正規化わかります〜?」って言われて「???」となったので調べてまとめてみた。正規化とは🌀
Wikipediaさん曰く、「関係(リレーション)を正規形と呼ばれる形式に準拠させることにより、データの一貫性の維持と効率的なデータアクセスを可能にする関係設計を導くための方法である。」 だそうです。
言っている意味はなんとなくわかるけど、なんかシックリこないな・・・
自分はざっくり、こう解釈しました。
テーブルを各項目(会社ごと、社員ごと、チームごと)に分けることで、データ管理しやすくなる。
例を示します。こんなテーブルがあったとします。
■会社社員情報マスタ
| 会社ID | 会社名 | 社員ID | 社員名 |
| 0001 | シアトル | 0001 | 社員A |
| 0001 | シアトル | 0002 | 社員B |
| 0001 | シアトル | 0003 | 社員C |
| 0002 | BP | 0004 | 社員D |
これだと社員IDだけでなく会社IDも消えます。
会社情報は残しておいても問題なさそうですよね。 では、会社情報切り出してみます。
これなら社員Dさんが辞めても会社情報は消えません。
■会社マスタ
| 会社ID | 会社名 |
| 0001 | シアトル |
| 0002 | BP |
■社員マスタ
| 社員ID | 社員名 |
| 0001 | 社員A |
| 0002 | 社員B |
| 0003 | 社員C |
| 0004 | 社員D |
第一正規系🌀
テーブルに格納できる状態に整理します。社員Aさんが沢山のチームに所属していたとします。
■第一正規化前
| 会社ID | 会社名 | 社員ID | 社員名 | チームID |
| 0001 | シアトル | 0001 | 社員A | 0001 0002 0003 |
| 0001 | シアトル | 0002 | 社員B | 0001 |
| 0001 | シアトル | 0003 | 社員C | 0001 |
| 0002 | シアトル | 0004 | 社員D | 0001 |
■第一正規化後
| 会社ID | 会社名 | 社員ID | 社員名 | チームID |
| 0001 | シアトル | 0001 | 社員A | 0001 |
| 0001 | シアトル | 0001 | 社員A | 0002 |
| 0001 | シアトル | 0001 | 社員A | 0003 |
| 0001 | シアトル | 0002 | 社員B | 0001 |
| 0001 | シアトル | 0003 | 社員C | 0001 |
| 0002 | シアトル | 0004 | 社員D | 0001 |
第二正規系🌀
「テーブルの各候補キーに従属する部分関数従属性が整理された状態」候補キーはレコードを一意に特定するための属性(=カラム)のこと。要は主キーみたいなもんだと思っています。
部分従属とは、Xが決まるとYが決まる関係のことです。X→Yとかって書いたりします。
■第二正規化前
| 会社ID | 会社名 | 部署ID | 部署名 | 社員ID | 社員名 | チームID | チーム名 |
| 0001 | シアトル | 0001 | テクノロジー | 0001 | 社員A | 0001 | A |
| 0001 | シアトル | 0001 | テクノロジー | 0001 | 社員A | 0002 | B |
| 0001 | シアトル | 0001 | テクノロジー | 0001 | 社員A | 0003 | C |
| 0001 | シアトル | 0001 | テクノロジー | 0002 | 社員B | 0001 | A |
| 0001 | シアトル | 0001 | テクノロジー | 0003 | 社員C | 0001 | A |
| 0002 | BP | 0002 | コーポレート | 0004 | 社員D | 0001 | A |
| 0002 | BP | 0002 | コーポレート | 0005 | 社員E | 0001 | A |
部分関数従属を探します。
会社IDが決まると、会社名、所属ID、所属名が決まります。
社員IDが決まると、社員名が決まります。
チームIDが決まると、チーム名が決まります。 なので以下の形にマスタを分けます。
■第二正規化
会社マスタ
| 会社ID | 会社名 | 所属ID | 所属名 |
| 0001 | シアトル | 0001 | テクノロジー |
| 0002 | BP | 0002 | コーポレート |
社員マスタ
| 社員ID | 社員名 |
| 0001 | 社員A |
| 0002 | 社員B |
| 0003 | 社員C |
| 0004 | 社員D |
| 0005 | 社員E |
チームマスタ
| チームID | チーム名 |
| 0001 | A |
| 0002 | B |
| 0003 | C |
第三正規系🌀
「候補キー以外の列に関数従属している列が存在しない状態」第二正規化のマスタを見ると、
候補キー「会社ID」に「会社名、所属ID、所属名」が関数従属しています。
それと同時に、候補キーではない「所属ID」に対して、「所属名」が関数従属しています。
そこで候補キーではない「所属ID」に従属している「所属名」を別表に写すのが第三正規化です。
■正規化前
| 会社ID | 会社名 | 部署ID | 部署名 | 社員ID | 社員名 | チームID | チーム名 |
| 0001 | シアトル | 0001 | テクノロジー | 0001 | 社員A | 0001 | A |
| 0001 | シアトル | 0001 | テクノロジー | 0001 | 社員A | 0002 | B |
| 0001 | シアトル | 0001 | テクノロジー | 0001 | 社員A | 0003 | C |
| 0001 | シアトル | 0001 | テクノロジー | 0002 | 社員B | 0001 | A |
| 0001 | シアトル | 0001 | テクノロジー | 0003 | 社員C | 0001 | A |
| 0002 | BP | 0002 | コーポレート | 0004 | 社員D | 0001 | A |
| 0002 | BP | 0002 | コーポレート | 0005 | 社員E | 0001 | A |
■第三正規化
会社マスタ
| 会社ID | 会社名 |
| 0001 | シアトル |
| 0002 | BP |
部署マスタ
| 部署ID | 部署名 |
| 0001 | テクノロジー |
| 0002 | コーポレート |
社員マスタ
| 社員ID | 社員名 |
| 0001 | 社員A |
| 0002 | 社員B |
| 0003 | 社員C |
| 0004 | 社員D |
| 0005 | 社員E |
チームマスタ
| チームID | チーム名 |
| 0001 | A |
| 0002 | B |
| 0003 | C |
これが第三正規化です。🍺🍺🍺