【RDB】データベースの正規形
データベースの正規形はDB設計の根幹となる知識です。
正規形は第一正規形〜第五正規形+ボイスコッド正規形があり、ここでは通常使用される第三正規形までを解説します。
正規化
正規化はデータの整合性を保ち、効率よく扱うためにデータの集合体を整理・整形することです。
データの重複を排除したり、格納するデータの種類を容易に変更できるように正規化することで、データの追加や取得、更新、削除等の操作における不整合の発生を防ぎます。
第一正規形〜第五正規形+ボイスコッド正規形とその正規化がありますが、一般的には第三正規形までが使われます。
非正規形
非正規形は正規化していないデータの集合体です。
例えば次のようなデータで、表データとしては直感的に分かりやすいですが、データベースで扱うには不十分な状態です。
購入ID | 購入日 | 購入者 | 購入者(電話番号) | 商品ID | 商品 | 価格 | 購入個数 |
---|---|---|---|---|---|---|---|
P0001 | 2024年03月24日 | 田中 太郎 | A9A-1234-5678 | I0001 | りんご | ¥150 | 5 |
I0002 | みかん | ¥80 | 10 | ||||
I0003 | メロン | ¥2,500 | 1 | ||||
P0002 | 2024年08月25日 | 佐藤 一葉 | B9B-1234-5678 | I0002 | みかん | ¥80 | 5 |
I0003 | メロン | ¥2,500 | 2 |
第一正規形
第一正規形は“データを単純な表形式に整形した状態”です。
単純な表形式とはセル結合のような複数列や複数行を対象とする表現がなく、各属性に1つの値を格納した状態です。
[PK] 購入ID | 購入日 | 購入者 | 購入者(電話番号) | [PK] 商品ID | 商品 | 価格 | 購入個数 |
---|---|---|---|---|---|---|---|
P0001 | 2024年03月24日 | 田中 太郎 | A9A-1234-5678 | I0001 | りんご | ¥150 | 5 |
P0001 | 2024年03月24日 | 田中 太郎 | A9A-1234-5678 | I0002 | みかん | ¥80 | 10 |
P0001 | 2024年03月24日 | 田中 太郎 | A9A-1234-5678 | I0003 | メロン | ¥2,500 | 1 |
P0002 | 2024年08月25日 | 佐藤 一葉 | B9B-1234-5678 | I0002 | みかん | ¥80 | 5 |
P0002 | 2024年08月25日 | 佐藤 一葉 | B9B-1234-5678 | I0003 | メロン | ¥2,500 | 2 |
この正規形にすることで、データベースで扱えるデータ形式になります。
しかし、まだ非効率なデータのため、実用的ではありません。
第二正規形
第二正規形は“部分関数従属性を排除した状態”です。
第一正規形では主キーは{ 購入ID , 商品ID }
となっており、次の部分関数従属性があります。
購入ID → 購入日
購入ID → 購入者
購入ID → 購入者(電話番号)
商品ID → 商品
商品ID → 価格
これらの部分関数従属性を排除し、重複データを整理すると次の3つに分割できます。
[PK] 購入ID | [PK] 商品ID | 購入個数 |
---|---|---|
P0001 | I0001 | 5 |
P0001 | I0002 | 10 |
P0001 | I0003 | 1 |
P0002 | I0002 | 5 |
P0002 | I0003 | 2 |
[PK] 購入ID | 購入日 | 購入者 | 購入者(電話番号) |
---|---|---|---|
P0001 | 2024年03月24日 | 田中 太郎 | A9A-1234-5678 |
P0002 | 2024年08月25日 | 佐藤 一葉 | B9B-1234-5678 |
[PK] 商品ID | 商品 | 価格 |
---|---|---|
I0001 | りんご | ¥150 |
I0002 | みかん | ¥80 |
I0003 | メロン | ¥2,500 |
この状態が第二正規形になります。
第三正規形
第三正規形は“推移的関数従属性を排除した状態”です。
上記の購入情報は次のように推移的関数従属が存在します。
購入ID → 購入者
購入者 → 購入者(電話番号)
この推移的関数従属性を排除し、必要に応じて属性を追加します。
[PK] 購入ID | [PK] 商品ID | 購入個数 |
---|---|---|
P0001 | I0001 | 5 |
P0001 | I0002 | 10 |
P0001 | I0003 | 1 |
P0002 | I0002 | 5 |
P0002 | I0003 | 2 |
[PK] 購入ID | 購入日 | 購入者ID |
---|---|---|
P0001 | 2024年03月24日 | U0001 |
P0002 | 2024年08月25日 | U0002 |
[PK] 購入者ID | 購入者 | 電話番号 |
---|---|---|
U0001 | 田中 太郎 | A9A-1234-5678 |
U0002 | 佐藤 一葉 | B9B-1234-5678 |
[PK] 商品ID | 商品 | 価格 |
---|---|---|
I0001 | りんご | ¥150 |
I0002 | みかん | ¥80 |
I0003 | メロン | ¥2,500 |
この各関係スキーマが完全関数従属になっており、推移的関数従属が排除された状態が第三正規形になります。