正規化を図解で説明
〜第1〜第3正規形の違い〜

「第2正規形」と「第3正規形」の違いを説明できますか?

部分関数従属や推移的関数従属など、言葉が難しくて手が止まってしまう人も多いと思います。

正規化の考え方について、具体的な表を使って説明していきます。

正規化とは?

正規化は、データの重複をなくして、矛盾が起きにくい表に分割することです。

同じデータが何度も出てくる表は、更新の時に問題が起きます。

例えば、同じ商品名が100行に入っていると、商品名が変わった時に100行すべてを直さないといけません。

1行でも直し忘れると、データに矛盾が生まれてしまいます。

正規化をして表を分けておけば、1か所を直すだけで済みます。

データベースの基本については、データベースの種類を図解で解説でも説明しています。

覚えておきたい用語

正規化の説明の前に、2つの用語を確認します。

主キーは、表の中の1行を特定できる項目です。社員番号のように、重複しない値を使います。

関数従属は、ある項目が決まると、別の項目が1つに決まる関係です。

例えば、社員番号が決まると社員名が1つに決まります。この時、「社員名は社員番号に関数従属している」といいます。

正規化の流れ

ここでは、次のような注文の表を例にして正規化していきます。

非正規形の表の図。1つの注文の中に商品の情報が繰り返し入っている

1つの注文の中に、商品の情報が繰り返し入っています。この状態を「非正規形」といいます。

正規化は、次の順番で進めます。

①第1正規形:繰り返しをなくす

②第2正規形:部分関数従属をなくす

③第3正規形:推移的関数従属をなくす

第1正規形

第1正規形は、繰り返しをなくして、1つの欄に1つの値が入るようにした形です。

1つの注文の中の商品を、1行ずつに分けます。

第1正規形の表の図。繰り返しをなくし、注文番号と商品番号を主キーにしている

この表では、注文番号だけでは1行を特定できません。

注文番号と商品番号の2つを合わせて、主キーにしています。

ただし、注文日や顧客名、商品名などが何度も出てきています。

第2正規形

第2正規形は、第1正規形から部分関数従属をなくした形です。

部分関数従属は、主キーの一部だけで決まる項目がある状態です。

先ほどの表の主キーは、注文番号と商品番号の2つでした。

ですが、次の項目は主キーの一部だけで決まります。

  • 注文日、顧客番号、顧客名:注文番号だけで決まる
  • 商品名、単価:商品番号だけで決まる

そこで、これらを別の表に分けます。

第2正規形の図。注文、商品、注文明細の3つの表に分けている

数量だけは、注文番号と商品番号の両方が決まらないと決まらないので、注文明細の表に残ります。

第3正規形

第3正規形は、第2正規形から推移的関数従属をなくした形です。

推移的関数従属は、主キー以外の項目で決まる項目がある状態です。

注文の表を見てください。

注文番号が決まると顧客番号が決まり、顧客番号が決まると顧客名が決まります。

つまり、顧客名は主キーではない顧客番号によって決まっています。これが推移的関数従属です。

そこで、顧客の情報を別の表に分けます。

第3正規形の図。注文、顧客、注文明細、商品の4つの表に分けている

これで、顧客名が変わっても顧客の表を1か所直すだけで済むようになりました。

第2正規形と第3正規形の見分け方

ここが試験で迷いやすいところです。

見分けるポイントは、何によって決まっているかです。

・主キーの一部で決まる → 部分関数従属 → 第2正規形で分ける

・主キー以外の項目で決まる → 推移的関数従属 → 第3正規形で分ける

また、主キーが1つの項目だけの表には、部分関数従属は起きません。

試験の問題では、まず主キーを確認してから、それぞれの項目が何で決まるのかを確認していくと解きやすくなります。

まとめ

今回は正規化の考え方と、第1〜第3正規形の違いについて説明しました。

正規化は、データの重複をなくして矛盾を防ぐために表を分割することです。

第1正規形で繰り返しをなくし、第2正規形で部分関数従属をなくし、第3正規形で推移的関数従属をなくします。

言葉は難しいですが、「この項目は何が決まれば決まるのか」を考えていけば整理できます。

基本情報技術者試験だけでなく、実際のテーブル設計でも使う考え方です。身近なデータで、一度自分で表を分けてみることをお勧めします。