😺
DBの正規化3段階
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