正規化とは
正規化とは、関係データベース(RDB)を設計する際に、データの重複(むだ)を排除し、データの追加・更新・削除を行うときに不整合(矛盾)が発生しないようにテーブルを整理・分割する作業のことです。正規化には段階があり、テーブル内の1つのマス目に1つの値だけが入るようにする「第1正規形」、主キーの一部に従属するデータを別テーブルに分ける「第2正規形」、主キー以外の項目に従属するデータをさらに分ける「第3正規形」と進めることで、綺麗でエラーの起きにくいデータベース構造になります。
具体例
1つの「売上伝票テーブル」の中に『顧客の住所』や『商品の単価』をそのまま書き込んでいると、同じ顧客が何度も買い物をするたびに同じ住所が重複して登録され、無駄が生じます。また、顧客が引っ越して住所を変更する際、過去のすべての伝票データを書き換えなければならず、更新ミスが起きやすくなります。そこで『売上テーブル』『顧客テーブル』『商品テーブル』に分割して顧客IDで結びつけること、これが「正規化」の具体例です。
もう少し詳しく
正規化を理解する上で中心となるのが「関数従属(かんすうじゅうぞく)」という概念です。これは「ある列Aの値が決まると、別の列Bの値も自動的に1つに決まる」という関係を指します(A→Bと表します)。例えば、学籍番号が決まれば学生の名前や学部が決まるという関係です。正規化はこの関数従属を整理し、無駄のないテーブル配置を目指します。通常、以下の3つのフェーズを実行します。
・第1正規形(1NF):テーブル内のすべての項目(セル)の値が、これ以上分解できない単一の値(原子値)になっている状態です。1つのセルの中に複数の連絡先や、繰り返し項目(商品1、商品2、商品3...)が含まれるような「非正規形」の構造から、重複部分を行として独立させます。
・第2正規形(2NF):第1正規形を満たした上で、「主キーの一部」によって値が一意に定まる項目(部分関数従属)を別のテーブルに切り出します。主キーが「注文ID」と「商品ID」の2つからなる複合キーの場合、「商品名」は「商品ID」だけで決定できるため、これを別テーブル(商品マスタ)に分割します。
・第3正規形(3NF):第2正規形を満たした上で、主キーではない「他の項目」によって値が一意に定まる項目(推移的関数従属)をさらに別のテーブルに切り出します。例えば、主キーの「注文ID」→「顧客ID」が決まり、さらにその「顧客ID」→「顧客名」が決まるという関係がある場合、顧客IDと顧客名を「顧客テーブル」として独立させます。
正規化を行うことで、データを追加した際の登録漏れや、削除した際に関連情報まで消えてしまうといった「更新アノマリー(更新の不整合)」を防ぐことができます。ただし、正規化を進めてテーブルを細かく分割しすぎると、データを検索する際に「結合(JOIN)」処理を多く実行しなければならず、検索パフォーマンスが低下することがあります。そのため、アクセス頻度の高いシステムでは、あえて正規化を崩す「非正規化(逆正規化)」を行うこともあります。
試験でのポイント
IT試験(基本情報技術者や応用情報技術者試験)では、正規化の手順や各正規形の定義に関する選択問題、または実際に未整理のテーブルを第3正規形まで分割する計算・論理問題が頻出します。
試験対策としての重要ポイントは以下の通りです。
・関数従属の種類の分類:
- 主キーの一部に依存する関係を排除する → 「第2正規化(部分関数従属の排除)」
- 主キー以外の非キー項目に依存する関係を排除する → 「第3正規化(推移的関数従属の排除)」
・各段階の識別:
- 繰り返し部分を排除し、各セルを原子値にする → 第1正規形
- 複合主キーから一部のキーに対する依存を排除する → 第2正規形
- 主キー経由の間接的な依存(A→B→C)を排除する → 第3正規形
問題で与えられたデータ構造を見て、「このテーブルを第2正規化すると、どのテーブルに分割されるか」を判断できるよう、主キーを特定し関数従属の矢印を描いて整理する練習を重ねておくことが大切です。
関連する用語
正規化の対象となる「関係データベース(RDB)」や、行を特定するための基準である「主キー(プライマリキー)」、関連を繋ぐための「外部キー」が最重要の関連用語です。また、テーブルを分割する判断基準となる「関数従属」や、正規化したデータを人が見やすい形に復元する「結合(JOIN)」も深い繋がりを持ちます。