DBの正規化の説明はこれで決まり!〜テストの点数表を正規化してみた〜
「正規化って聞くけど、結局どういうときにやるの?何の意味があるの?」
新人時代、自分も同じ疑問を持っていました。
そこで今回は、学校のテストの点数表を題材に、1NF → 2NF → 3NF までの正規化を段階的にやってみます。
「正規化の目的」や「なぜやるべきなのか」が、実感ベースで理解できるように書いてみました。
まず、こんな「テスト点数管理テーブル」を作ってしまったとします。
ScoreTable
| student_id | student_name | math_score | english_score | science_score | total |
|------------|--------------|------------|----------------|----------------|--------|
| 1 | テストくん | 80 | 90 | 70 | 240 |
ダメポイント:
- 教科ごとに列が固定 → 教科が増えたら列を増やさないといけない
- 点数を「行」で扱えないため、集計や検索が面倒
- 教科の名前やIDが存在せず、拡張性がない
そこでまずは1NF(第1正規形)。繰り返しの列(教科)を排除します。
ScoreTable_1NF
| student_id | student_name | subject | score |
|------------|--------------|----------|-------|
| 1 | テストくん | math | 80 |
| 1 | テストくん | english | 90 |
| 1 | テストくん | science | 70 |
- 教科が何個でも対応可能に!
- 行単位での集計(平均点、最高点など)が簡単に
でも問題が…
→ student_name
が毎回出てくる
→ subject
はただの文字列で、正確な情報管理ができていない
次に2NF(第2正規形)。主キーの一部にしか依存していない情報を分離します。
student_name
は student_id
にだけ依存しているので、分けます。
Students
| student_id | student_name |
|------------|--------------|
| 1 | テストくん |
Scores
| student_id | subject | score |
|------------|----------|-------|
| 1 | math | 80 |
| 1 | english | 90 |
| 1 | science | 70 |
これで、生徒情報の冗長性がなくなりました!
でもまだ問題があります。
→ subject
がただの文字列。正式名称や配点など管理したい場合に困る
そこで3NF(第3正規形)。推移的従属を排除します。
教科(subject)情報は別で持たせて、正規化を完了させます。
Students
| student_id | student_name |
|------------|--------------|
| 1 | テストくん |
Subjects
| subject_id | subject_name |
|------------|---------------|
| 101 | math |
| 102 | english |
| 103 | science |
Scores
| student_id | subject_id | score |
|------------|------------|-------|
| 1 | 101 | 80 |
| 1 | 102 | 90 |
| 1 | 103 | 70 |
- 教科情報の一元管理が可能に!
- 教科名の表記ゆれ、削除・更新漏れのリスクを排除
- データ構造が拡張性と整合性を両立
正規化のビフォー・アフターまとめ
段階 | どう変わったか | メリット |
---|---|---|
非正規化 | 教科列が横に並んでいる | 拡張しづらい、冗長で集計が困難 |
第1正規形 | 教科を行として分離 | 可変教科に対応、扱いやすくなる |
第2正規形 | 生徒情報を別テーブルへ | 重複排除、名前変更が一括で済む |
第3正規形 | 教科情報をさらに分離 | 一元管理、整合性のあるデータ設計が可能になる |
正規化の考え方は、最初はとっつきにくく感じるかもしれません。
でも「何がどこに属しているのか?」「一貫性を保つにはどう分けるべきか?」という視点で見ていくと、だんだん見えてきます。
テストくんの点数表がスッキリ整理されていくように、
あなたのデータベース設計もスマートになるはずです!
この記事が、正規化でモヤモヤしていた人のヒントになれば嬉しいです!