【Oracle設計】正規化と非正規化の違いとバランスの取り方

オラクルデータベースの基本

~現場で失敗しないための実践設計ガイド~


■ はじめに

Oracleデータベースの設計において、「正規化」と「非正規化」は必ず検討すべきテーマです。

  • 「正規化しすぎてSQLが書きづらい…」
  • 「非正規化したらデータが矛盾していた…」

このような失敗を避けるためには、両者の違いを正しく理解し、設計目的に応じて使い分けることが重要です。

この記事では、正規化と非正規化の違い・メリット・デメリット・判断基準をテキスト図でわかりやすく解説します。


■ 正規化とは?

“”正規化(Normalization)””とは、
データの重複を排除し、意味ごとにテーブルを分割することで、整合性と保守性を高める設計手法です。


📘 正規化の前後のイメージ

【正規化前】
members(会員情報)

┌────────┬──────┬──────────────┐
│ member_id │ name │ address │
├────────┼──────┼──────────────┤
│ 1 │ 山田 │ 東京都渋谷区〇〇1-2 │
│ 2 │ 鈴木 │ 東京都渋谷区〇〇1-2 │ ← 重複
└────────┴──────┴──────────────┘

【正規化後】
members(会員情報)

┌────────┬──────┬────────┐
│ member_id │ name │ address_id │
├────────┼──────┼────────┤
│ 1 │ 山田 │ A001 │
│ 2 │ 鈴木 │ A001 │
└────────┴──────┴────────┘

addresses(住所マスタ)

┌────────┬────────────────────┐
│ address_id │ address │
├────────┼────────────────────┤
│ A001 │ 東京都渋谷区〇〇1-2 │
└────────┴────────────────────┘

■ 正規化のメリット

  • データの一貫性が保てる
    → 住所の変更があっても1箇所直すだけでOK。
  • データ構造が明確になる
    → 再利用やマスタ化が容易。
  • 更新時のミスが減る
    → 複数箇所の更新忘れが起こらない。

■ 正規化のデメリット

  • SQLが複雑になる
    → JOINが必須になり、可読性が落ちる。
  • 性能劣化の可能性
    → JOINによるI/O増加、応答速度の低下。
  • 開発・設計が重くなることも
    → データ構造が理解しづらくなり、属人化のリスク。

■ 非正規化とは?

“非正規化(Denormalization)”とは、
あえて正規化のルールを緩めて、読み取り性能や実装の簡素化を重視した設計手法です。


📘 非正規化のイメージ

members(非正規化)

┌────────┬──────┬──────────────┐
│ member_id │ name │ address │
├────────┼──────┼──────────────┤
│ 1 │ 山田 │ 東京都渋谷区〇〇1-2 │
│ 2 │ 鈴木 │ 東京都渋谷区〇〇1-2 │ ← 重複してもOK
└────────┴──────┴──────────────┘

■ 非正規化のメリット

  • SQLがシンプル
    → JOINが不要。直感的で速いクエリが書ける。
  • 読み取り性能が向上
    → 特に検索主体のアプリケーションで効果大。
  • 画面やレポート向けに最適
    → 画面用に加工済みデータを即取得可能。

■ 非正規化のデメリット

  • データの整合性が崩れやすい
    → 同じ情報が複数箇所に存在。更新忘れのリスク。
  • 冗長なデータで容量を圧迫
    → ストレージ非効率。
  • マスタ連携や再利用がしづらい
    → データ構造が固定されている。

■ 正規化と非正規化の使い分け:判断基準

観点正規化すべき場合非正規化すべき場合
更新頻度が高い✅ 複数箇所の整合性を保ちたい❌ 更新漏れが発生しやすい
読み取りが主な用途❌ JOINによるパフォーマンス低下の恐れ✅ 高速にデータを取得できる
開発の簡素さ❌ SQLが複雑化しがち✅ シンプルで開発しやすい
データ品質が重要✅ データの一貫性が求められる❌ 不整合の発生リスクがある
再利用・マスタ化したい✅ 同じ情報を複数テーブルで利用したい❌ 重複データのまま使うことになる

■ Oracle実装の具体例

🔹 正規化モデル(JOINあり)

SELECT m.name, a.address
FROM members m
JOIN addresses a
ON m.address_id = a.address_id;
  • 保守性に優れるが、JOINの影響あり。

🔹 非正規化モデル(JOINなし)

SELECT name, address
FROM members
WHERE address LIKE '東京都%';
  • SQLはシンプル。データの整合性は別途ロジックで管理が必要。

■ 実務でのベストプラクティス

  • 設計段階では原則として正規化を行う
    → 長期的に保守しやすく、チーム開発でのトラブルを減らせる。
  • 非正規化は“目的を持って”行う
    → パフォーマンス要件や画面仕様が明確なときに限定。
  • ビューやマテリアライズドビューの活用
    → 正規化構造を保ったまま、非正規化ビューで見せる工夫も有効。

■ 補足:テキスト図で振り返る「違いのまとめ」

┌──────────────┬────────────┬────────────┐
│ 比較項目 │ 正規化 │ 非正規化 │
├──────────────┼────────────┼────────────┤
│ データ整合性 │ 高い(更新もれ防止) │ 低い(複数個所修正) │
│ SQLの書きやすさ │ 複雑(JOIN必要) │ 簡単(1テーブル) │
│ 読み取り性能 │ 条件により低下 │ 高速 │
│ データ再利用 │ マスタ管理しやすい │ 再利用しにくい │
│ 保守性 │ 高い(変更に強い) │ 低い(不整合の恐れ) │
└──────────────┴────────────┴────────────┘

■ まとめ

ポイント解説
✅ 正規化保守性・整合性を重視するなら基本形。JOIN前提で設計する。
✅ 非正規化高速処理・単純表示が目的なら必要に応じて導入。意図を明確にすること。
✅ バランスが大事「設計原則」と「現場要件」の両方を踏まえて判断する。
✅ VIEW活用正規化データに対して非正規化ビューを提供することで、両者の長所を両立できる。


[参考]
Oracle Database データベース開発ガイド 19c

コメント

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