😺

DBの正規化3段階

2025/02/15に公開

Daily Blogging56日目

テーブル正規化の整理
本当は5段階あるらしいが、基本的には3段階を押さえられていれば良い

正規化とは

そもそも正規化とはどういう意味なのか
DBにおける正規形とは、DBにで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式のことを指す。
DBってデータを冗長的に持っていると更新が色々と大変になるので、そういうのを解決するための正規化しようねってお話

第1正規形

第一段階の定義は、1つのセルの中には1つの値しか含まない
要は、1つのカラムに対して配列とかカンマ区切りで値を格納すんなよって話
こういうのがよくない↓

id 名前 電話番号
1 田中 080-1234-5678, 090-9876-5432
2 鈴木 070-5555-6666

1つのセルに複数の値が格納された場合、何が問題なのか
それは、主キーがで一意の値を決めることができなくなるため

RDBでは、関数従属性が成り立つように設計されている。
{X}→{Y}
簡単にいうと、Xの列の値を決めればY列の値が1つに決まるという意味

第2正規形

部分関数従属を排除せよ
→主キーの一部にだけ依存するデータ(部分関数従属)をなくすこと

これは第1正規形
注文IDと商品IDが主キーとなる

注文ID 商品ID 商品名 価格 顧客ID
1001 A001 りんご 100 C001
1001 A002 バナナ 150 C001
1002 A003 みかん 200 C002

この状態だと、商品名と価格が商品IDに従属している状態であり、注文IDとはなんの関係もない状態になっている。
こういうのを部分関数従属という
逆に、主キーに対して全てのカラムが従属関係にあることを完全関数従属という

第3正規形

推移的関数従属を排除せよ
→主キーを介して間接的に依存しているデータ(推移的関数従属)をなくすこと

社員ID 氏名 部署ID 部署名
1001 田中 D001 営業部
1002 鈴木 D002 開発部
1003 佐藤 D001 営業部

この場合、「社員ID → 部署ID → 部署名」という状態が発生している。
→これが推移的関数従属

まとめ

整合性取るの大変なので、データの重複は避けようね

Discussion