「データベースを正しく設計したいけど、正規化って難しそう…」
そんなあなたのために、この記事では正規化の基礎〜第1〜第3正規化までを、表や具体例を交えて解説します!
「なぜ必要なのか?」という観点から理解すると、業務でもすぐに活かせますよ。
正規化とは?
**正規化(Normalization)**とは、
データの重複や不整合を防ぎ、効率よく管理できるテーブル構造に整理することです。
✅ 正規化の目的
- データの整合性を保つ
- データの重複を減らす
- 更新・検索がしやすくなる
- 拡張性の高い設計になる
正規化は段階的にステップアップしていきます。代表的なのは以下の3つ:
正規形 | 主な目的 |
---|---|
第1正規形 | 繰り返しデータの排除 |
第2正規形 | 複合キーへの部分依存の排除 |
第3正規形 | 非キー列への依存(推移的関係)の排除 |
第1正規化(1NF)|繰り返しをなくす
📌 ポイント
1つの列に1つの値だけを入れる。繰り返しやリスト形式は禁止!
❌ 悪い例
顧客ID | 顧客名 | 購入商品 |
---|---|---|
1 | 田中 | ノート, 鉛筆, 消しゴム |
→ 「購入商品」列に複数の商品名がカンマ区切りで入っていて、管理しづらい…
✅ 正しい例(第1正規化)
顧客ID | 顧客名 | 購入商品 |
---|---|---|
1 | 田中 | ノート |
1 | 田中 | 鉛筆 |
1 | 田中 | 消しゴム |
→ 商品を1行1商品に分解し、1セル1データに!
第2正規化(2NF)|部分的な依存を排除
📌 ポイント
複合主キーの一部にしか依存しない列(部分関数従属)を排除!
❌ 悪い例
学生ID | 科目ID | 学生名 | 科目名 |
---|---|---|---|
1 | 101 | 佐藤 | 数学 |
1 | 102 | 佐藤 | 英語 |
2 | 101 | 高橋 | 数学 |
→ 主キーは(学生ID, 科目ID)だけど、「学生名」は学生IDだけに依存している!
✅ 正しい例(第2正規化)
学生テーブル
学生ID | 学生名 |
---|---|
1 | 佐藤 |
2 | 高橋 |
科目テーブル
科目ID | 科目名 |
---|---|
101 | 数学 |
102 | 英語 |
履修テーブル
学生ID | 科目ID |
---|---|
1 | 101 |
1 | 102 |
2 | 101 |
→ 複合キーに完全に依存する情報だけを履修テーブルに残すことで、第2正規形に。
第3正規化(3NF)|推移的な依存を排除
📌 ポイント
非キー列が、他の非キー列に依存していないか?(→「推移的関係」)
🎯 わかりやすい例:本と著者と出身地
❌ 悪い例(非正規)
本ID | タイトル | 著者名 | 出身地 |
---|---|---|---|
1 | 銀河鉄道の夜 | 宮沢賢治 | 岩手県 |
2 | 注文の多い料理店 | 宮沢賢治 | 岩手県 |
3 | 吾輩は猫である | 夏目漱石 | 東京 |
→ 「本ID」が主キーですが、「出身地」は著者名に依存している。
つまり:
本ID → 著者名 → 出身地 という 推移的関係がある!
✅ 正しい例(第3正規化)
本テーブル
本ID | タイトル | 著者ID |
---|---|---|
1 | 銀河鉄道の夜 | A1 |
2 | 注文の多い料理店 | A1 |
3 | 吾輩は猫である | A2 |
著者テーブル
著者ID | 著者名 | 出身地 |
---|---|---|
A1 | 宮沢賢治 | 岩手県 |
A2 | 夏目漱石 | 東京 |
→ 「出身地」は「著者ID」に直接ひもづけ!
これで推移的な依存が解消されて第3正規形に。
正規化のまとめと実務での注意点
正規形 | 主な目的 | やること |
---|---|---|
第1正規形 | 繰り返しの排除 | 1つのセルに1つの値を入れる |
第2正規形 | 複合キーの一部依存の排除 | 部分的に依存する列を別テーブルに分ける |
第3正規形 | 推移的な依存の排除 | 非キー列が他の非キー列に依存していないか確認 |
💡 正規化の注意点
- 正規化しすぎるとJOINが多くなりパフォーマンスが落ちることも
- 実務では「第3正規形 + 必要に応じて逆正規化」というバランスが大切!
まとめ
データベースの正規化は、「きれいで、壊れにくく、将来にも強い」設計をするための基本ルールです。
データを扱うエンジニアなら、正規化の考え方は避けて通れません。
ぜひこの記事で基礎を押さえて、実務で活かしていきましょう!