データベース設計

正規化(第1〜第3正規形) せいきか

第1正規形第2正規形第3正規形関数従属冗長性テーブル設計
正規化(第1〜第3正規形)について教えて

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

正規化は「データをスッキリ整理するルール」だよ!1つのセルに複数の値を詰め込んだり、同じデータが何か所にも重複したりするのを段階的に解消していく手順なんだ。これをやると「一か所直せば全部直る」清潔なDB設計になるんだ!第1→第2→第3と段階を踏んで進めていくよ!


正規化とは

正規化(Normalization)とは、リレーショナルデータベースのテーブル設計において、データの重複(冗長性)を排除し、更新異常を防ぐための設計手法です。E.F.コッドが1970年代に提唱した理論に基づき、テーブルを段階的に整理していきます。

正規化が不十分なテーブルでは、更新異常と呼ばれる問題が発生します。たとえば「取引先の住所が5つのレコードに重複して入っている」場合、住所変更時に5箇所全部を更新しなければならず、1か所だけ更新すると矛盾が生じます(更新異常)。また新規に取引先を登録する際、発注がないと保存できない(挿入異常)、最後の発注を削除すると取引先情報も消える(削除異常)といった問題も生じます。

正規化は第1正規形(1NF)→第2正規形(2NF)→第3正規形(3NF)と段階的に進めます。実務では3NFまで適用するのが一般的です。さらに高度なBoyce-Codd正規形・第4・第5正規形もありますが、通常は3NFで十分な整合性が確保できます。


3段階の正規化

正規形条件解消される問題
第1正規形(1NF)各セルに1つの値のみ(繰り返しグループを排除)「商品1,商品2,商品3」を1セルに入れるのを禁止
第2正規形(2NF)1NF + 非キー属性が主キー全体に関数従属複合主キーの一部だけに依存するカラムを別テーブルへ
第3正規形(3NF)2NF + 非キー属性間の推移的関数従属を排除「郵便番号→住所」のような間接依存を別テーブルへ
正規化の段階的変換例(受注データ) 正規化前(非正規形) 受注ID 顧客名 商品リスト 1001 田中 商品A,商品B,商品C 1002 鈴木 商品B,商品D ✗ 1セルに複数値 ✗ 商品名が重複 ✗ 更新・集計が困難 第1正規形(1NF) 受注ID 商品ID 顧客名 単価 1001 A 田中 500 1001 B 田中 800 1002 B 鈴木 800 ✓ 1セル1値 △ 「田中」が重複 第2正規形(2NF) 受注ID 商品ID 数量 1001 A 2 1001 B 1 商品ID 単価 A 500 B 800 ✓ 主キー全体に依存 ✓ 単価の重複解消 第3正規形(3NF)— 推移的関数従属の排除 2NFの受注テーブルに「顧客郵便番号」と「顧客住所」がある場合: 受注ID → 顧客ID → 郵便番号 → 住所(推移的依存) 問題: 郵便番号が変わると受注テーブルの全行を更新が必要 受注テーブル 受注ID, 顧客ID, 日付, 金額 顧客テーブル 顧客ID, 名前, 郵便番号 住所マスタ 郵便番号, 都道府県, 市区町村

歴史と背景

  • 1970年:E.F.コッドが「大規模共有データバンクのデータのリレーショナルモデル」論文を発表
  • 1971年:コッドが第1・第2・第3正規形を定義。RDB設計の理論的基盤となる
  • 1974年:Boyce-Codd正規形(BCNF)がより厳密な正規形として定義
  • 1977年:第4正規形(多値従属の排除)が定義
  • 1979年:第5正規形(結合従属の排除)が定義
  • 1980年代〜現在:実務では第3正規形が標準として定着。過度な正規化は避けるトレードオフも認識

関連する規格・RFC

規格・RFC番号内容
E.F.コッド論文 (1970)リレーショナルモデルと正規化理論の原典
ISO/IEC 9075 (SQL標準)正規化されたテーブル設計を前提とするSQL仕様

関連用語

  • テーブル — 正規化の対象となるデータ格納単位
  • 主キー — 正規化において関数従属の基準となるキー
  • 外部キー — 正規化でテーブルを分割した後の参照整合性を保つ
  • 非正規化 — 正規化と逆方向の設計手法。性能とのトレードオフ
  • ER図 — 正規化されたテーブル設計を可視化するための図
  • データモデリング — 正規化を含むデータ設計全体のプロセス
  • 制約 — 正規化されたDB設計でデータ整合性を保つための仕組み