データベースの正規化
データベースの正規化(英:normalization)とは、データを取り扱いやすいようにデータベース設計することで、データの一貫性を維持し、効率的なデータアクセスを可能にするための手法です。
正規化することにより、データの冗長性と不整合が起きる機会を減らすことができます。
※冗長:必要以上に物事が多く無駄なこと
スポンサーリンク
正規化の手順
正規化には、第1正規形~第5正規形、およびボイスコッド正規形などの種類がありますが、第1正規形~第3正規形までで、十分に正規化されたと考えることも多いです。
![](https://medium-company.com/wp-content/uploads/2019/06/081807-300x294.png)
正規化前
例えば、次のような注文があるとします。
鈴木一郎:A商品を1つとB商品を2つ注文
佐藤次郎:C商品を1つ注文
田中三郎:D商品を2つ、E商品を1つ、F商品を1つ
上記の注文をそのまま表に挿入すると次の通りです。各行の長さがバラバラで商品が繰り返されている状態です。
![非正規化](https://medium-company.com/wp-content/uploads/2021/01/regularization0-1024x247.png)
【第1正規形】繰り返しを整理
データベースでは、レコード単位でデータを扱うため、正規化前のようなデータはデータベースのテーブルに格納することすらできません。
まずは、繰り返し項目のそれぞれを別レコードとして独立させ、各レコードの長さを整えます。(正規化前は、各レコードの長さがバラバラで商品が繰り返されている状態)
![正規化 第1正規形](https://medium-company.com/wp-content/uploads/2021/01/regularization1.png)
上記が「第1正規形」の表(テーブル)です。背景色がついている行(レコード)が、正規化前では繰り返し項目になっていた部分です。
繰り返し項目を別レコードとして独立させることで、すべてのデータをテーブルに格納できました。
【第2正規形】部分関数従属している列を整理
第2正規形では、部分関数従属している列を整理します。
![](https://medium-company.com/wp-content/uploads/2019/05/092812.jpg)
![](https://medium-company.com/wp-content/uploads/2019/06/081807-300x294.png)
例えば、第1正規形で作られた表(テーブル)の主キーは「注文番号」と「商品ID」です。
「注文番号」と「商品ID」が決まれば、行(レコード)を一意に特定できますが、実は「注文番号」が決まるだけで「注文日」「ユーザID」「購入ユーザ名」は特定できます。このような状態が部分関数従属です。
そして、第1正規形の表(テーブル)から、部分関数従属している列(カラム)を切り出したものが「第2正規形」です。
次の表(テーブル)は部分関数従属のイメージ例です。
![部分関数従属](https://medium-company.com/wp-content/uploads/2021/01/regularization1-1.png)
オレンジ枠の部分は「注文番号」が決まれば特定できる項目、緑枠の部分は「商品ID」が決まれば特定できる項目です。
下記が「第2正規形」の表(テーブル)です。
![正規化の第2正規形](https://medium-company.com/wp-content/uploads/2021/01/regularization2.png)
オレンジ枠で囲んだ部分を「注文テーブル」、緑枠で囲んだ部分を「商品テーブル」として切り出しています。そして残った部分を「注文詳細テーブル」として3つの表(テーブル)に分けています。
【第3正規形】関数従属している列を整理
第3正規形では、主キー以外の列に関数従属している列を整理します。関数従属とは「○○が決まれば特定できる項目」のことです。
第2正規形の「注文テーブル」は「注文番号」が主キーです。そのため「注文番号」が決まれば行(レコード)を一意に特定できます。
しかし、よく見ると「注文番号」以外の列に関数従属している項目があります。それは「購入ユーザ名」です。「購入ユーザ名」は、「ユーザID」が決まれば特定できる項目です。
次の表(テーブル)は関数従属のイメージ例です。
![関数従属](https://medium-company.com/wp-content/uploads/2021/01/regularization2-1.png)
緑枠の部分は主キー以外である「ユーザID」が決まれば特定できる項目です。このように、第3正規形では、主キー以外の列に関数従属している列を整理します。
下記が「第3正規形」の表(テーブル)です。
![第3正規形](https://medium-company.com/wp-content/uploads/2021/01/regularization3-1024x616.png)
緑枠で囲んだ部分を「ユーザテーブル」として切り出しています。
![](https://medium-company.com/wp-content/uploads/2019/06/081807-300x294.png)