【初心者向け】データベース正規化とは?第1〜第3正規化をやさしく解説!

プログラミング・技術

「データベースを正しく設計したいけど、正規化って難しそう…」
そんなあなたのために、この記事では正規化の基礎〜第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学生名科目名
1101佐藤数学
1102佐藤英語
2101高橋数学

→ 主キーは(学生ID, 科目ID)だけど、「学生名」は学生IDだけに依存している!

✅ 正しい例(第2正規化)

学生テーブル

学生ID学生名
1佐藤
2高橋

科目テーブル

科目ID科目名
101数学
102英語

履修テーブル

学生ID科目ID
1101
1102
2101

→ 複合キーに完全に依存する情報だけを履修テーブルに残すことで、第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正規形 + 必要に応じて逆正規化」というバランスが大切!

まとめ

データベースの正規化は、「きれいで、壊れにくく、将来にも強い」設計をするための基本ルールです。

データを扱うエンジニアなら、正規化の考え方は避けて通れません。
ぜひこの記事で基礎を押さえて、実務で活かしていきましょう!

タイトルとURLをコピーしました