IT用語

データの正規化とは?第一・第二・第三正規形の違いを画像多めでわかりやすく解説

クマノくらげ

この記事でわかること

・データの正規化とは何か
・正規化をしないと何が困るのか
・第一正規形、第二正規形、第三正規形の違い
・試験で迷ったときの見分け方

正規化とは?

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

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

表を整理する?

そう。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商品名単価数量
1A001りんご1003
1B001みかん1202
2A001りんご1005

りんごが2回出てるね。

そう。
この表の主キーは「注文ID + 商品ID」だよね。

でも、商品名と単価は何で決まる?

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

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

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

その通り。
だから、商品名や単価は別の「商品テーブル」に分ける。

第二正規形にすると

注文ID商品ID数量
1A0013
1B0012
2A0015
商品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数量
1F0011
1F0021
商品テーブル
商品ID商品名価格
F001カレー800
F002サラダ300

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

第三正規形

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

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

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

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

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

この3つを見るといい。

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

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

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

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

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

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

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

まとめ

正規化とは、
データの重複や矛盾を減らすために、表を整理すること

代表的な違いはこれ。

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

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

その通り。
初心者向けに一言でまとめるなら、

正規化とは、データベースの表を片付けて、重複やミスを減らす考え方

だね。

ABOUT ME
クマノくらげ
クマノくらげ
難しいIT用語やビジネス用語を、できるだけ身近な例えで解説するブログです。 「専門用語を見ると眠くなる人」でも読めるように、画像や会話形式を多めにしています。 AWS12冠達成済み。
記事URLをコピーしました