この記事は自分用の備忘録です。
昨日のつづき
正規化とは?
正規化には3つの形があるそうな。
第1正規形(1NF):データの「原子性」を保証する
データを「最小単位」に分解し、繰り返しデータ(重複するカラム)を排除。
例:冗長なデータ
ポケモン情報
ID | 名前 | タイプ1 | タイプ2 | トレーナー名 |
---|---|---|---|---|
1 | ピカチュウ | でんき | NULL | サトシ |
2 | フシギダネ | くさ | どく | サトシ |
3 | ニャース | ノーマル | あく | ロケット団 |
正規化後(1NF)
ID | 名前 | タイプ | トレーナー名 |
---|---|---|---|
1 | ピカチュウ | でんき | サトシ |
2 | フシギダネ | くさ | サトシ |
3 | フシギダネ | どく | サトシ |
4 | ニャース | ノーマル | ロケット団 |
5 | ニャース | あく | ロケット団 |
第2正規形(2NF):部分従属の排除
主キー(PK)に対して、すべての非キー属性を「完全従属」させる。
例:冗長なデータ
ポケモン情報
ポケモンID | トレーナーID | 名前 | 重さ | 高さ | トレーナー名 |
---|---|---|---|---|---|
1 | 1 | ピカチュウ | 6.0kg | 0.4m | サトシ |
2 | 1 | フシギダネ | 6.9kg | 0.7m | サトシ |
3 | 2 | ニャース | 4.2kg | 0.5m | ロケット団 |
正規化後(2NF)
トレーナーテーブル
トレーナーID | トレーナー名 |
---|---|
1 | サトシ |
2 | ロケット団 |
ポケモンテーブル
ポケモンID | トレーナーID | 名前 | 重さ | 高さ |
---|---|---|---|---|
1 | 1 | ピカチュウ | 6.0kg | 0.4m |
2 | 1 | フシギダネ | 6.9kg | 0.7m |
3 | 2 | ニャース | 4.2kg | 0.5m |
第3正規形(3NF):推移従属の排除
主キーに直接関係しない列(非キー属性)を別テーブルに分ける。
例:冗長なデータ
ポケモン情報
ポケモンID | トレーナーID | 名前 | 重さ | 高さ | トレーナー町 |
---|---|---|---|---|---|
1 | 1 | ピカチュウ | 6.0kg | 0.4m | マサラタウン |
2 | 1 | フシギダネ | 6.9kg | 0.7m | マサラタウン |
3 | 2 | ニャース | 4.2kg | 0.5m | ハナダタウン |
正規化後(3NF)
トレーナーテーブル
トレーナーID | トレーナー名 | トレーナー町 |
---|---|---|
1 | サトシ | マサラタウン |
2 | ロケット団 | ハナダタウン |
ポケモンテーブル
ポケモンID | トレーナーID | 名前 | 重さ | 高さ |
---|---|---|---|---|
1 | 1 | ピカチュウ | 6.0kg | 0.4m |
2 | 1 | フシギダネ | 6.9kg | 0.7m |
3 | 2 | ニャース | 4.2kg | 0.5m |
感想
まだ理解が浅いので、もう少し後で深ぼって編集する。