データベース設計

非正規化 ひせいきか

冗長性パフォーマンスJOIN削減読み取り最適化トレードオフテーブル設計
非正規化について教えて

簡単に言うとこんな感じ!

非正規化は「わざと同じデータを重複させてJOINを減らす」設計手法だよ!正規化でスッキリ整理したDBは「書き込みの正確さ」は優れてるけど、複数テーブルをJOINしまくると読み取りが遅くなることがある。そこであえて同じ値をあちこちに持たせて、1テーブルだけで完結させるんだ!速さと整合性のトレードオフなんだよ!


非正規化とは

非正規化(Denormalization)とは、正規化されたデータベース設計において、意図的に冗長性(重複データ)を導入することで、クエリのパフォーマンスを向上させる設計手法です。正規化の「無駄をなくす」という原則とは逆方向のアプローチです。

正規化を徹底するとデータの重複がなく整合性は高まりますが、情報を取得するには多数のテーブルをJOINする必要があり、テーブルが増えるほど処理が遅くなります。特に「注文一覧に商品名・顧客名・担当者名を一度に表示」するような画面では、5〜10テーブルのJOINが発生することもあります。

非正規化では、よく一緒に使われるデータをあらかじめ1テーブルに格納したり、集計値をカラムとして追加したりします。これによりJOIN不要の高速な読み取りが可能になりますが、データが複数箇所に存在するため更新時に整合性を保つ責任がアプリケーション側に移ります。使いどころを見極めることが重要です。


非正規化の主なパターン

パターン内容メリットデメリット
カラムの複製他テーブルの値をコピーして保持JOIN不要更新漏れのリスク
集計値の事前計算合計・件数をカラムに保持集計クエリ不要更新のたびに再計算が必要
テーブルの結合頻繁にJOINするテーブルを統合クエリがシンプルスキーマが肥大化
派生テーブル集計・変換済みデータを別テーブルに分析が高速元テーブルとの二重管理
配列・JSON埋め込みレコードを親レコードに格納1回取得で完結部分更新が難しい
正規化 vs 非正規化:注文一覧の取得 正規化(第3正規形) orders(id, customer_id, date) order_items(id, order_id, product_id, qty) products(id, name, price, category_id) customers(id, name, address_id) addresses(id, zip, city) 取得クエリ(5テーブルJOIN) SELECT o.id, c.name, p.name, i.qty FROM orders o JOIN customers c ON o.customer_id=c.id JOIN order_items i ON o.id=i.order_id JOIN products p ON i.product_id=p.id ... 遅くなりやすい・JOINが多い 非正規化(読み取り最適化済み) order_summary(非正規化テーブル) - order_id - customer_name ← 複製 - product_name ← 複製 - total_amount ← 事前集計 - city ← 複製 取得クエリ(JOIN不要) SELECT order_id, customer_name, product_name, total_amount FROM order_summary WHERE date = today 高速・シンプル ただし顧客名変更時は両方更新が必要

歴史と背景

  • 1970〜80年代:コッドの正規化理論が主流。「正規化が正義」という設計思想が定着
  • 1990年代:大規模Webサービスの登場でJOIN多発による性能問題が顕在化
  • 2000年代データウェアハウス設計でスタースキーマ(非正規化テーブル)が普及
  • 2009年〜NoSQL(特にドキュメントDB)が登場し、非正規化を設計の前提とする思想が広まる
  • 2010年代マテリアライズドビュー・読み取り専用レプリカなど技術的解決策も充実
  • 現在:「正規化で整合性、非正規化で性能」を用途に応じて使い分けるのが標準的アプローチ

非正規化の適用判断基準

適用すべき状況適用を避けるべき状況
読み取りが書き込みより圧倒的に多いデータ更新が頻繁に発生する
JOIN数が5以上になる画面整合性が最優先(金融・在庫等)
レポート・集計専用テーブル開発初期(設計がまだ安定していない)
データウェアハウスの分析用テーブルチームの運用負荷が増えると困る場合

関連する規格・RFC

規格・RFC番号内容
Ralph Kimball『Data Warehouse Toolkit』スタースキーマ(非正規化DWH設計)の標準的手法書

関連用語