この記事は自分用の備忘録です。
昨日のつづき
正規化とは?
正規化には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 |
感想
まだ理解が浅いので、もう少し後で深ぼって編集する。