1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

テーブル正規化に関してまとめてみた

1
Last updated at Posted at 2022-10-29

データベースの正規化

PMに「正規化わかります〜?」って言われて「???」となったので調べてまとめてみた。

正規化とは🌀

Wikipediaさん曰く、
「関係(リレーション)を正規形と呼ばれる形式に準拠させることにより、データの一貫性の維持と効率的なデータアクセスを可能にする関係設計を導くための方法である。」 だそうです。

言っている意味はなんとなくわかるけど、なんかシックリこないな・・・
自分はざっくり、こう解釈しました。

テーブルを各項目(会社ごと、社員ごと、チームごと)に分けることで、データ管理しやすくなる。

例を示します。こんなテーブルがあったとします。

■会社社員情報マスタ

会社ID 会社名 社員ID 社員名
0001 シアトル 0001 社員A
0001 シアトル 0002 社員B
0001 シアトル 0003 社員C
0002 BP 0004 社員D
BPの社員Dさんが辞めた場合、会社ID=0002、社員ID=0004のレコードは削除されます。
これだと社員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が決まると、社員名が決まります。
チーム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

これが第三正規化です。🍺🍺🍺

まとめ

他にも第四正規化、第五正規などがあるらしいですが、一旦は第三正規化まで説明してみました。 間違い、不足などありましたらドシドシ連絡ください!!🙇
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?