正規化を最短でまとめる
なぜかって?ちょっと復習をしようと思ったら、
難しい言葉で書かれていて理解するのに時間がかかったからだ。
正規化をする理由!
- 見やすくする!
- 修正があった場合に一箇所修正すれば全て反映されるようにする!
- 何箇所も修正する手間をなくす。(ミスが無くなる)
ぐちゃぐちゃ表(未正規化)
商品名 | 価格 | 仕入先 | 仕入先住所 | カテゴリー |
---|---|---|---|---|
りんご | 100円 | 青森農園, 長野農園 | 青森県xxx, 長野県yyy | 果物 |
みかん | 80円 | 愛媛農園 | 愛媛県zzz | 果物 |
キャベツ | 120円 | 群馬農園, 茨城農園 | 群馬県aaa, 茨城県bbb | 野菜 |
*1つのセルに複数の値が入っていて読みにくい!
第一正規化
1セル1データに分割
商品名 | 価格 | 仕入先 | 仕入先住所 | カテゴリー |
---|---|---|---|---|
りんご | 100円 | 青森農園 | 青森県xxx | 果物 |
りんご | 100円 | 長野農園 | 長野県yyy | 果物 |
みかん | 80円 | 愛媛農園 | 愛媛県zzz | 果物 |
キャベツ | 120円 | 群馬農園 | 群馬県aaa | 野菜 |
キャベツ | 120円 | 茨城農園 | 茨城県bbb | 野菜 |
*行を増やして 1行=1仕入れ先 に整理。
これで行の長さが統一されてRDBに入れられるようになった。
第二正規化
主キーとそれにつながるデータを別テーブルに分割
- 商品名が決まれば価格とカテゴリーが決まる
- 仕入先が決まれば住所が決まる
商品テーブル(products
)
商品名が決まれば価格とカテゴリーが決まる。
商品ID | 商品名 | 価格 | カテゴリーID |
---|---|---|---|
P1 | りんご | 100円 | 果物 |
P2 | みかん | 80円 | 果物 |
P3 | キャベツ | 120円 | 野菜 |
仕入先テーブル(suppliers
)
仕入先が決まれば住所が決まる。
仕入先ID | 仕入先名 | 住所 |
---|---|---|
S1 | 青森農園 | 青森県xxx |
S2 | 長野農園 | 長野県yyy |
S3 | 愛媛農園 | 愛媛県zzz |
S4 | 群馬農園 | 群馬県aaa |
S5 | 茨城農園 | 茨城県bbb |
これ以上はもう分割できない。
取引テーブル(product_supplier
)
分割した元のテーブルはこうなる
商品ID | 仕入先ID |
---|---|
P1 | S1 |
P1 | S2 |
P2 | S3 |
P3 | S4 |
P3 | S5 |
主である取引テーブルはもう分割できない。
第三正規化(無関係な情報もさらに分割)
第二正規化で分割したテーブルを確認して重複があるものを更に分割する。
商品テーブルがまだ正規化できる。
カテゴリーテーブル(categories
)
カテゴリーID | カテゴリー名 |
---|---|
C1 | 果物 |
C2 | 野菜 |
↑これ以上はもう分割できない。
更新後の商品テーブル
商品ID | 商品名 | 価格 | カテゴリーID |
---|---|---|---|
P1 | りんご | 100円 | C1 |
P2 | みかん | 80円 | C1 |
P3 | キャベツ | 120円 | C2 |
↑これ以上分割できない。
まとめ
-
第一正規化
- 1つのマスに1つのデータ
-
第二正規化
- レコードテーブルから主キーになるテーブルを作成して分ける。重複データを別テーブルへ
- レコードテーブルを分割できない状態にする
- レコードテーブルから主キーになるテーブルを作成して分ける。重複データを別テーブルへ
-
第三正規化
- 分割した先のテーブルで更に分割する