正規化とは
データベースにおける正規化とは、散らばった情報を綺麗に整理しておく作業のことです。
イメージとしては、部屋の片づけのようなものです。
例えば、机の上にある漫画の5巻があり、床に3巻がある、そして、本棚には2巻と4巻があるような状態で、友達にその漫画を全て貸す場合を考えてみましょう。
まず、1巻から最終巻まで見つけ出すことが大変ですよね。場合によっては、途中の巻が見つからないかもしれません。あらかじめ本棚に漫画を整理しておけば、このような状態を防ぐことができます。
このような整理をデータ単位で行うことを正規化と言います。データを正規化することで、データの更新漏れや矛盾を防ぐことを目的としています。
正規化されていないデータを非正規形と呼びます。
第一正規形
第一正規形とは、各データがシンプルになっている状態のことです。
Excelデータで考えてみましょう。
Excelで言えば、以下の状態になっていることです。
- 1セル(マス)あたり1つの情報のみになっている(1セル=1情報)
- セル結合がされていない
- 同じ情報が複数個所に載っていない
例えば、1つのセルに日付と名前と住所が入っていれば、日付、名前、住所にセルを分けます。
2つ以上のセルを大きな1つのセルに結合しているところがあれば、結合を解除して1セルごとに分解します。
複数の行や列に同じ情報が載っていない状態にします。ただし、見た目上同じでも意味合いが違えば、別の情報と考えます。例えば、同じ日付が入っていても、作業内容が違えば、数字的には同じ日付でも、違う意味合いでの情報なので、削除はしません。
データを最小単位に分解して管理するようなイメージです。もう分解できないというレベルに分ける意識を持ちましょう。
第二正規形
第二正規形とは、「主キーを全て使って」唯一の1行に特定できるように表が分けられた状態です。
※主キーとは、唯一の1行を特定・検索するために用いられる列のことです。
イメージとしては、マイナンバーのようなものです。
1つの表に複数の主キーが存在する場合もあります。
まず、主キーと表のイメージを具体例でみていきましょう。
例えば、本屋さんで漫画に関する表が作られたとします。
項目は「分類コード」「タイトル」「ジャンル」「ジャンルコード」「購入コード」「購入日」「購入者名」「購入数」の表をイメージしてください。
今回の表では、「行を特定するために」番号付けした「分類コード」「購入コード」が主キーになります。
この表をさらに細かく見ていくと、
「分類コード」だけで、「タイトル」「ジャンル」「ジャンルコード」は唯一に特定できます。
「購入コード」だけで、「購入日」「購入者名」は唯一に特定できます。
一方で、「購入数」は、1回の会計で複数の本を買っていた場合(Aの本を2冊、Bの本を4冊買っていた場合等)、「購入コード」だけでは、Aの2冊とBの4冊という2行が出てきてしまいます。
「購入数」を唯一の1行に特定するためには、「分類コード」と「購入コード」の両方が必要です。
第二正規形では、表の中にあるデータ(行)が主キーを「すべて使って」唯一の1行に特定できるようにしたい(一部の主キーだけで特定できるものは表を分けたい)ので、
- 「分類コード」だけで特定できるものは「分類コード」の表
- 「分類コード」「タイトル」「ジャンル」「ジャンルコード」
- 「購入コード」だけで特定できるものは「購入コード」の表
- 「購入コード」「購入日」「購入者名」
- 「分類コード」と「購入コード」で特定できるものは「分類コード」と「購入コード」の表
- 「分類コード」「購入コード」「購入数」
というように、表を分けていく作業を行います。
このように、主キーごとに分けた表が第二正規形です。
第三正規形
第三正規形とは、第二正規形から、さらに主キー以外で特定できる列を分離した状態です。
第二正規形の章で使った例を参考に見ていきましょう。
第二正規形では、本屋にある表を以下のように分けていきました。
- 「分類コード」を主キーとする表
- 「購入コード」を主キーとする表
- 「分類コード」と「購入コード」を主キーとする表
この中で、「分類コード」を主キーとする表に注目してみてみると、
項目は「分類コード」「タイトル」「ジャンル」「ジャンルコード」ですが、「ジャンル」は「分類コード」がなくても、「ジャンルコード」が分かれば、特定できますよね。
第二正規形の章で疑問に思っていた方もいるかもしれませんが、第二正規形では大きな単位で表を分離していましたが、もう少し細かい単位で考えると、「分類コード」を主キーとする表の中に「ジャンルコード」だけで特定できる表が隠れています。
第三正規形では、この隠れた主キーを分離します↓(★部分)
- 「分類コード」を主キーとする表
- 「分類コード」「タイトル」
- 「ジャンルコード」を主キーとする表 ★
- 「ジャンルコード」「ジャンル」
- 「購入コード」を主キーとする表
- 「購入コード」「購入日」「購入者名」
- 「分類コード」と「購入コード」を主キーとする表
- 「分類コード」「購入コード」「購入数」
これが第三正規形です。
「ジャンルコード」はジャンルごとに振り分けて、番号付けしたものとします。
「購入コード」は、本屋全体の購入履歴を順番に番号付けしたものとします。
(1回の会計ごとに購入コードが振られるものとします。
1回の会計で2種類のタイトルの本を買った場合、
その2種類とも同じ購入コードが振られるものとします。)