0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DBの正規化を分かりやすく説明 〜テストの点数表を正規化してみた〜

Posted at

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_namestudent_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正規形 教科情報をさらに分離 一元管理、整合性のあるデータ設計が可能になる

正規化の考え方は、最初はとっつきにくく感じるかもしれません。
でも「何がどこに属しているのか?」「一貫性を保つにはどう分けるべきか?」という視点で見ていくと、だんだん見えてきます。

テストくんの点数表がスッキリ整理されていくように、
あなたのデータベース設計もスマートになるはずです!

この記事が、正規化でモヤモヤしていた人のヒントになれば嬉しいです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?