talosのプログラミング教室

【基本・応用情報技術者】データベースの正規化

スポンサーリンク

こんにちは。たろすです。

今回はデータベースの正規化について説明します。

正規化とは

正規化とはデータの重複を排除し、関連性によってテーブルを分けることです。

正規化をすることにより、データを更新した際の不具合を防ぐことができます。

正規形には第1正規形、第2正規形、第3正規形、ボイス・コッド正規形、第4正規形、第5正規形がありますが、第3正規形までで充分なことがほとんどであり、試験でもほぼ出てこないので第3正規形までを説明します。

非正規形

下のテーブルでは1件の受注情報に対して複数の明細情報が含まれています。

f:id:talosta:20210612104837p:plain

このような繰り返し属性があると実装が難しいため、第1正規形に正規化します。

第1正規形

繰返し属性を持たない下のようなテーブルを第1正規形と呼びます。

f:id:talosta:20210612105326p:plain

第2正規形

第1正規形では以下のようなことが起こります。

・受注実績のない商品を登録できない
山田花子の受注情報を削除すると、ボールペンの情報がなくなってしまう

そのため、先程のテーブルを下のような第2正規形に正規化します。

f:id:talosta:20210612111156p:plain

これにより上記二つの不具合はなくなったことがわかります。


第2正規形へ正規化されたテーブルでは、すべての非キー属性が主キーに完全関数従属します。

完全関数従属とは非キー属性が主キーの一部によって決まらないということです。

第1正規形のテーブルでいうと、受注日、顧客番号、顧客名、金額は主キーの一部である受注番号のみで決まっています。

また商品名と単価は商品コードのみで決まります。

受注番号と商品コードの両方で特定されるのは数量のみです。

したがって、テーブルを上のように三つに分けることで第2正規形になります。

第3正規形

実は第2正規形にも以下のような不具合があります。

・受注実績のない顧客を登録できない
・受注テーブルの1行目の顧客名を変えると、顧客番号が同じで顧客名が異なる行が生まれる

そこで第3正規形に正規化します。

f:id:talosta:20210612112948p:plain

このように顧客情報を受注テーブルから切り離すことで、上記二つの不具合がなくなったことがわかります。


第3正規形はすべての非キー属性が主キーに対して推移的関数従属しません。

推移的関数従属とは主キー以外の属性に関数従属することです。

第2正規化では顧客名が非キー属性の顧客番号によって決まってしまっていました。

そこで顧客番号と顧客名を顧客番号を主キーとするテーブルに切り離すことによって推移的関数従属がなくなりました。

おわりに

今回はデータベースの正規化について説明しました。

直接問われることは少ないですが、データベースの問題を解くときには基礎となる知識なので覚えておきましょう。