はじめに
ミックさんの達人に学ぶDB設計の3章を読んだのでアウトプットとして記事の執筆を行いました。ここでは第三正規化までを紹介します。
誤った解釈や表現などがあれば指摘していただけると幸いです。
対象者
この記事は下記のような人を対象にしています。
- 駆け出しエンジニア
- プログラミング初学者
- DBの正規化について理解したい人
結論
正規化とは冗長なデータをなくすために行う処理である。
正規化のメリットとして
- 冗長性が排除されデータを一か所で持つため、誤りが発生した場合その箇所のみを修正すればよく不整合が発生しにくい
- 主キーの一部にしか依存しない情報を別テーブルに分離することで、それ単体でも登録・管理が可能な構造にできる
などが挙げられる。
第一正規化
第一正規化とは?
一つのマスに一つのカラムを入れること
第一正規化によるメリット
主キーで行を一意に特定できれば、その行の各列の値も対応して一意に定まる。
書籍テーブル
ISBN | 著者 | タイトル | 出版社 |
---|---|---|---|
111 | 村田沙也加 | コンビニ人間,信仰 | 文藝春秋 |
222 | 今村夏子 | こちらあみ子 | 筑摩書房 |
333 | 鹿島田真希 | 冥土めぐり | 河出書房 |
例として上のようなISBNが主キーの書籍テーブルが存在するとします。
仮に1つのセルに2つの値が存在するとISBNが111の書籍のタイトルを知りたいとき、コンビニ人間と信仰の2つのタイトルがヒットしてしまいます。
そのため主キーによって行を特定することができても列の値を一に特定することができません。
ですが、ISBNが222の行のように1つのセルにつき1つの情報のみを許容すると行が特定された時点でその行の各列の値も特定することができるのです。これが第一正規形のメリットです。
第二正規化
第二正規化とは?
第二正規化とは主キーの一部に関数従属が存在する部分関数従属という関係を排除してあげることです。
第二正規化する前
貸出テーブル
ユーザid | ISBN | 著者 | タイトル | 出版社 |
---|---|---|---|---|
1 | 111 | 村田沙也加 | コンビニ人間 | ブンゲイ春秋 |
2 | 222 | 今村夏子 | こちらあみ子 | 筑摩書房 |
3 | 333 | 鹿島田真希 | 冥土めぐり | 河出書房 |
4 | 111 | 村田沙也加 | コンビニ人間 | ブンゲイ春秋 |
上の図は貸し出し履歴とその書籍の情報を管理するテーブルです。
この表はユーザーidとISBNの二つの列が主キーになっています。
しかし著者、タイトル、出版社の値はISBNの列のみに依存している部分関数従属の状態になっています。
このテーブルの問題点
- 貸出履歴にない書籍の情報を登録することができない
- 1つの書籍情報を誤ると、その書籍情報を用いているすべての行を修正する必要がある
第二正規化
ISBNの列のみに依存している著者、タイトル、出版社を貸出テーブルから切り出して新たなテーブルを作成することで第二正規化を達成することができます。
貸出テーブル
ユーザid | ISBN |
---|---|
1 | 111 |
2 | 222 |
3 | 333 |
4 | 444 |
書籍テーブル
ISBN | 著者 | タイトル | 出版社 |
---|---|---|---|
111 | 村田沙也加 | コンビニ人間,信仰 | ブンゲイ春秋 |
222 | 今村夏子 | こちらあみ子 | 筑摩書房 |
333 | 鹿島田真希 | 冥土めぐり | 河出書房 |
444 | 本谷由紀子 | 異類婚姻譚 | 福武書店 |
第二正規形のメリット
以上のようにすべての列を完全関数従属にしてあげることで、
1.書籍テーブルのISBNの値が444の行のように貸し出し履歴に存在しない書籍を登録することができる
2.先ほどのテーブルではISBNが111の書籍の出版社を誤ってブンゲイ春秋と登録してしまったが1行の変更で済む
といった二つのメリットがあります。
第三正規化
第三正規化とは?
主キーではないところでの関数従属性(推移的関数従属)を排除すること
第三正規化する前
書籍テーブル
ISBN | 著者 | タイトル | 出版社id | 出版社 |
---|---|---|---|---|
111 | 村田沙也加 | コンビニ人間,信仰 | 1 | 文藝春秋 |
222 | 今村夏子 | こちらあみ子 | 2 | 筑摩書房 |
333 | 鹿島田真希 | 冥土めぐり | 3 | 河出書房 |
444 | 本谷由紀子 | 異類婚姻譚 | 1 | ブンゲイ春秋 |
上の図は書籍の情報を管理するテーブルです。
このテーブルでは主キーがISBNであるが、出版社列は主キーではない
出版社idに依存しているため
ISBN→出版社id→出版社
という推移的関数従属になってしまっています
このテーブルの問題点
- 1冊も本を出版していない出版社の情報を登録できない
- 1つの出版社情報を誤ると、その出版社情報を用いているすべての行を修正する必要がある
推移的関数従属により発生する問題点は部分関数従属により発生する問題点と同じです。
第三正規化
推移的関数従属を解消するためには、出版社idを書籍テーブルから切り出します。
書籍テーブル
ISBN | 著者 | タイトル | 出版社id |
---|---|---|---|
111 | 村田沙也加 | コンビニ人間,信仰 | 1 |
222 | 今村夏子 | こちらあみ子 | 2 |
333 | 鹿島田真希 | 冥土めぐり | 3 |
444 | 本谷由紀子 | 異類婚姻譚 | 1 |
出版社テーブル
出版社id | 出版社 |
---|---|
1 | 文藝春秋 |
2 | 筑摩書房 |
3 | 河出書房 |
4 | 田中書店 |
第三正規化によるメリット
こうすることで1冊も本を出版していない田中書店の情報を載せることができました。
また、正規化前はブンゲイ春秋となっておりこの誤りを直すためには1行目と4行目を直す必要がありましたが、正規化後は出版社テーブルの出版社列の1行を直すだけで済みます。
おわりに
この記事では第一正規化から第三正規化までの方法について紹介しました。基本的には、これで十分ですが正規化はほかにも第五正規化まで存在します。
気が向いたらまた記事にまとめてたいと思います。