データの正規化とは?第一・第二・第三正規形の違いを画像多めでわかりやすく解説
この記事でわかること
・データの正規化とは何か
・正規化をしないと何が困るのか
・第一正規形、第二正規形、第三正規形の違い
・試験で迷ったときの見分け方
正規化とは?

データベースの「正規化」って出てきたんだけど、正直よく分からないんだよね。

正規化は、簡単に言うと、
データの重複やミスが起きにくいように、表を整理することだよ。

表を整理する?

そう。Excelの表をきれいに整えるイメージに近い。
たとえば、同じ名前や住所、商品名を何回も書いている表ってあるでしょ?

あるある。注文表とかで、同じお客さんの名前が何回も出てくるやつだね。

そういう表は、あとで修正するときにミスが起きやすいんだ。
だから、同じ情報を何度も書かなくていいように、表を分ける。
それが正規化。
正規化しないと何が困るか。

同じ情報が何回か出てくるくらいなら、別にいいのでは?

最初はいいんだけどね。データが増えると困るんだよね。

| 注文ID | 顧客名 | 住所 | 商品名 | 単価 |
|---|---|---|---|---|
| 1 | 田中さん | 東京 | りんご | 100 |
| 2 | 田中さん | 東京 | みかん | 120 |
| 3 | 鈴木さん | 大阪 | りんご | 100 |

この表だと、田中さんの名前や住所、りんごの単価が何度も出てくるよね。
この状態で田中さんが引っ越しをするとどうなる?

田中さんの住所を修正しないといけないね。ID1とID2どちらも直さないとダメだ。

そうだね。もし1か所だけ直し忘れたら?

同じ田中さんなのに、住所が2つあるみたいになっちゃう。

それが正規化で防ぎたい問題なんだ。

正規化で解決したい問題

正規化では、主にこういう問題を防ぎたいんだよ。

| 問題 | 内容 |
|---|---|
| 更新異常 | 変更するとき、複数箇所を直す必要がある |
| 挿入異常 | 登録したい情報が、他の情報がないと登録できない |
| 削除異常 | 消したくない情報まで一緒に消えてしまう |
| 重複 | 同じ情報を何度も書いてしまう |

あぁ、エクセルで似たようなミスをやったことあるなぁ

そう。正規化はそう言ったミスを防ぐためのもので、
初心者向けには、まずこう覚えるといいよ。
正規化は、同じ情報を何度も書かなくていいようにする整理術
第一正規形とは?

じゃあ、第一正規形って何?

第一正規形は、
1つのセルに複数の値を入れない形のことだよ。

1つのセルに複数の値?

たとえば、こういう表。

| 注文ID | 顧客名 | 商品 |
|---|---|---|
| 1 | 田中さん | りんご、みかん、バナナ |
| 2 | 鈴木さん | りんご |

あー、商品欄にまとめて入ってるね。

そう。
これだと「りんごを買った人だけ検索したい」とか、「商品ごとに集計したい」ときに面倒になる。

たしかに。文字列の中から探す感じになるね。

だから、1つの商品を1行ずつに分ける。

| 注文ID | 顧客名 | 商品 |
|---|---|---|
| 1 | 田中さん | りんご |
| 1 | 田中さん | みかん |
| 1 | 田中さん | バナナ |
| 2 | 鈴木さん | りんご |
第二正規形とは?

じゃあ、第二正規形は?

第二正規形は少し難しくなるけど、ざっくり言うと、
主キーの一部だけで決まる項目を、別の表に分けることだよ。

主キーの一部……?

まず、主キーっていうのは、1行を特定するための目印。
たとえば、注文の明細表では、1行を特定するのに、
注文ID + 商品ID
が必要になることがある。

注文IDだけだと、1つの注文に複数の商品があるかもしれないもんね。

そう。
商品IDだけでも、いろんな注文に同じ商品が出てくる。
だから、注文IDと商品IDの組み合わせで1行を決める。
第二正規形になっていない例

| 注文ID | 商品ID | 商品名 | 単価 | 数量 |
|---|---|---|---|---|
| 1 | A001 | りんご | 100 | 3 |
| 1 | B001 | みかん | 120 | 2 |
| 2 | A001 | りんご | 100 | 5 |

りんごが2回出てるね。

そう。
この表の主キーは「注文ID + 商品ID」だよね。
でも、商品名と単価は何で決まる?

商品IDで決まる。A001ならりんご、100円。

そう。
つまり、商品名と単価は「注文ID + 商品ID」全体ではなく、
商品IDだけで決まっている。

それが「主キーの一部だけで決まる」ってことか。

その通り。
だから、商品名や単価は別の「商品テーブル」に分ける。
第二正規形にすると

| 注文ID | 商品ID | 数量 |
|---|---|---|
| 1 | A001 | 3 |
| 1 | B001 | 2 |
| 2 | A001 | 5 |
| 商品ID | 商品名 | 単価 |
|---|---|---|
| A001 | りんご | 100 |
| B001 | みかん | 120 |

商品名と単価を商品テーブルに移したんだね。

そう。
これなら、りんごの単価が変わったときも、商品テーブルの1か所を直せばいい。

直し忘れが減るね。

第二正規形はこう覚えるといい。
第二正規形:複合キーの一部だけで決まるものを分ける

複合キーって、注文ID+商品IDみたいに、複数の項目を組み合わせたキーのことだよね。

そう。
第二正規形は、特に複合キーが出てきたときに意識するといい。
第三正規形とは?

じゃあ、第三正規形は?

第三正規形は、
主キー以外の項目で決まる項目を、別の表に分けることだよ。

第二正規形と似てない?

似てるけど、見るポイントが違うよ。
第二正規形は「主キーの一部だけで決まってない?」を見る。
第三正規形は「主キーじゃない項目で決まってない?」を見る。

うーん、例がほしい。
第三正規形になっていない例

| 顧客ID | 顧客名 | 郵便番号 | 住所 |
|---|---|---|---|
| C001 | 田中さん | 100-0001 | 東京都千代田区 |
| C002 | 鈴木さん | 530-0001 | 大阪府大阪市 |

普通の顧客情報に見えるけど。

ここで考えるのは、住所が何で決まるか。
住所は顧客IDで決まるというより、郵便番号で決まるよね。

たしかに。郵便番号が分かれば、ある程度住所が決まるね。

このとき、郵便番号は主キーじゃない。
でも、その郵便番号によって住所が決まっている。

それが「主キー以外の項目で決まる」ってことか。
第三正規形にすると

| 顧客ID | 顧客名 | 郵便番号 |
|---|---|---|
| C001 | 田中さん | 100-0001 |
| C002 | 鈴木さん | 530-0001 |
| 郵便番号 | 住所 |
|---|---|
| 100-0001 | 東京都千代田区 |
| 530-0001 | 大阪府大阪市 |

住所を郵便番号テーブルに分けたんだね。

そう。
これで、郵便番号と住所の対応を1か所で管理できる。
第三正規形はこう覚えるといいよ。
第三正規形:主キー以外で決まるものを分ける

第二は「主キーの一部」、第三は「主キー以外」か。
第一・第二・第三正規形の違い

3つをまとめると、どう違うの?

こんな感じ。

| 正規形 | 何を直す? | 一言でいうと |
|---|---|---|
| 第一正規形 | 1つのセルに複数の値がある | セルの中を1つずつにする |
| 第二正規形 | 主キーの一部だけで決まる項目がある | 複合キーの一部依存を分ける |
| 第三正規形 | 主キー以外で決まる項目がある | 主キー以外への依存を分ける |

第一はセルの中、第二は主キーの一部、第三は主キー以外。
こう見ると違いが分かりやすいね。

そうそう。
正規化は、だんだん細かい依存関係を整理していく感じだね。
レストランの注文表で考える

レストランの注文表で考えてみよう。

| 注文ID | 客名 | 注文商品 | 商品価格 |
|---|---|---|---|
| 1 | 田中さん | カレー、サラダ | 800、300 |

注文商品と商品価格に複数入ってるね。

そう。
これは第一正規形になっていない。
第一正規形

| 注文ID | 客名 | 商品 | 商品価格 |
|---|---|---|---|
| 1 | 田中さん | カレー | 800 |
| 1 | 田中さん | サラダ | 300 |

まず、1つのセルに1つの値だけ入れる。

商品ごとに行を分けたんだね。
第二正規形

次に、商品名や価格は商品IDだけで決まるから、商品テーブルに分ける。

注文明細テーブル
| 注文ID | 商品ID | 数量 |
|---|---|---|
| 1 | F001 | 1 |
| 1 | F002 | 1 |
商品テーブル
| 商品ID | 商品名 | 価格 |
|---|---|---|
| F001 | カレー | 800 |
| F002 | サラダ | 300 |

これならカレーの価格が変わっても、商品テーブルだけ直せばいいね。
第三正規形

さらに、もし顧客情報の中に郵便番号と住所があって、
住所が郵便番号で決まるなら、それも分ける。

顧客テーブル
| 顧客ID | 顧客名 | 郵便番号 |
|---|---|---|
| C001 | 田中さん | 100-0001 |
郵便番号テーブル
| 郵便番号 | 住所 |
|---|---|
| 100-0001 | 東京都千代田区 |

なるほど。
どんどん「それは本当にこの表に置くべき?」って見直していく感じだ。

試験で迷ったときの判断ポイント

試験で出たら、どこを見ればいい?

この3つを見るといい。

| 見るポイント | 該当する正規形 |
|---|---|
| 1つのセルに複数の値が入っていないか | 第一正規形 |
| 複合キーの一部だけで決まる項目がないか | 第二正規形 |
| 主キー以外の項目で決まる項目がないか | 第三正規形 |

まずセルを見る。次に主キーを見る。最後に主キー以外を見る。
この順番で考えればいいのか。

そう。
正規化は順番が大事だからね。

第一正規形:セルを分ける
第二正規形:主キーの一部依存を分ける
第三正規形:主キー以外への依存を分ける
って感じかな

第一:セルの中をスッキリ
第二:複合キーまわりをスッキリ
第三:主キー以外の依存をスッキリ
って感じでもっと簡単にしてもいいね。

正規化って、難しい数式とかじゃなくて、表の片付けなんだね。

そうそう。
データベースの片付け術だと思えばいい。
まとめ

正規化とは、
データの重複や矛盾を減らすために、表を整理すること。
代表的な違いはこれ。

| 正規形 | ポイント |
|---|---|
| 第一正規形 | 1つのセルに複数の値を入れない |
| 第二正規形 | 主キーの一部だけで決まる項目を分ける |
| 第三正規形 | 主キー以外で決まる項目を分ける |

つまり、正規化は「同じことを何度も書かないように、表をきれいに分けること」なんだね。

その通り。
初心者向けに一言でまとめるなら、
正規化とは、データベースの表を片付けて、重複やミスを減らす考え方
だね。

