正規化(normalization)

分類
テクノロジ系 データベース
出る試験
基本情報応用情報
重要度
★★★★★

同じデータが重複しないように、表を分けて整理するデータベースの設計手法。

もう少し詳しい説明

正規化は、同じことを何度も書かずに済むよう、表を分けて整理する設計のしかたです。

通販の注文履歴を思い浮かべてください。1行ごとに「注文番号・商品番号・商品名・価格」を全部書いていくとします。同じ商品を100人が買えば、同じ商品名が100行ぶん書かれます。

ここで商品名が変わったらどうなるでしょうか。100行すべてを直さなければなりません。1行でも直し忘れれば、直した行と直し忘れた行で名前が食い違います。どちらが正しいのか、後から見ても分かりません。

そのため、注文の側には商品番号だけを持たせます。商品名は商品の一覧表に1回だけ書いておき、必要なときに番号で引く。名前が変わっても直すのは1か所で済みます。

「同じ事実は1か所にだけ書く」 — これが正規化の考え方のすべてです。

分ける前同じ商品名が100行に書かれている名前が変わると100行すべてを直す。1行でも忘れたら食い違う分けたあと商品名は一覧表に1回だけ。直すのも1か所目的重複をなくして矛盾を防ぐこと。速くするためではない
正規化の目的は、同じ事実を2か所に持たないことです。2か所にあると、片方だけ直したときにどちらが正しいのか決められなくなります。検索を速くするための作業ではありません(むしろ表が増えるぶん、結合が必要になります)。

段階に分けて進める

整理は一度にやるのではなく、段階を踏みます。試験では第3正規形までが範囲です。

繰り返しを取り除く一部だけで決まるものを取り除くほかの項目で決まるものを取り除く非正規形1つの行の中に、繰り返しの項目が入っている第1正規形繰り返しを別の行に分けた第2正規形主キーの一部だけで決まる項目を、別の表へ出した第3正規形主キー以外の項目で決まる項目を、別の表へ出した
上から順に、1段ごとに1つずつ取り除いていきます。第何正規形かを形で覚えるより、「何を取り除いた状態か」で覚えるほうが思い出せます。取り除く順番は決まっていて、飛ばして進むことはしません。

第1正規形は、1つのマス目に複数の値が入っている状態をなくし、表を平らにしたものです。「商品名:りんご、みかん、ぶどう」のように1マスに詰め込むのをやめ、1行1件に開きます。

第2正規形は、主キー(表の中の行を1つに決められる列)が複数の列でできているとき、その一部だけで決まる項目を別の表に切り出したものです。

たとえば、注文番号と商品番号の2つを組にして主キーにしている表を考えます。この表に商品名が入っていると、商品名は商品番号だけで決まります。主キーの片方だけで決まっているので、商品の表へ切り出します(部分関数従属の除去)。

第3正規形は、主キー以外の項目によって決まる項目を切り出したものです。

たとえば、社員番号を主キーにしている表に「部署番号」と「部署名」が入っているとします。部署名は部署番号で決まります。主キーではない項目で決まっているので、これも部署の表へ切り出します(推移的関数従属の除去)。

1つの例で、4段階を通してみる

通販の注文を、実際に分けていきます。表は増えますが、同じことを書く場所が減っていくのが見どころです。

正規化前

1回の注文を1行に書いた表です。1回の注文で2つの商品を買うと、1つのマスに2つぶん詰め込むことになります。

注文番号注文日顧客番号顧客名商品番号商品名数量
100110/01C01田中 けんS1、S2りんご、みかん2、3
100210/02C02佐藤 ゆうS1りんご1

1つのマスに複数の値が入っています。この形では、りんごが何個売れたかを数えることもできません。

第1正規形:1つのマスに1つの値にする

詰め込んでいた商品を、1行ずつに開きます。行は増えますが、どのマスも値は1つになります。

注文番号注文日顧客番号顧客名商品番号商品名数量
100110/01C01田中 けんS1りんご2
100110/01C01田中 けんS2みかん3
100210/02C02佐藤 ゆうS1りんご1

太字の注文番号と商品番号の2つで、1行が決まります。これがこの表の主キーです。

ただし、注文日と顧客名が、同じ注文の行の数だけ繰り返されています。

第2正規形:主キーの一部で決まる項目を出す

主キーは「注文番号+商品番号」の2つ組です。その片方だけで決まる項目を探します。

項目何で決まるかどうするか
注文日・顧客番号・顧客名注文番号だけで決まる切り出す
商品名商品番号だけで決まる切り出す
数量2つそろって決まる残す

3つの表に分かれます。

注文

注文番号注文日顧客番号顧客名
100110/01C01田中 けん
100210/02C02佐藤 ゆう

注文明細

注文番号商品番号数量
1001S12
1001S23
1002S11

商品

商品番号商品名
S1りんご
S2みかん

商品名を書く場所が、1つの商品につき1か所になりました。

第3正規形:主キー以外で決まる項目を出す

残っているのは注文の表です。顧客名は、主キーの注文番号ではなく顧客番号で決まります。主キー以外の項目で決まっているので、切り出します。

注文

注文番号注文日顧客番号
100110/01C01
100210/02C02

顧客

顧客番号顧客名
C01田中 けん
C02佐藤 ゆう

注文明細と商品の表は、そのままです。これで4つの表になりました。

4段階を並べて見る

表の数商品名を書く場所顧客名を書く場所
正規化前1つ買われた回数ぶん注文した回数ぶん
第1正規形1つ買われた回数ぶん注文した回数ぶん
第2正規形3つ1つの商品に1か所注文した回数ぶん
第3正規形4つ1つの商品に1か所1人に1か所

表は増えますが、直す場所は減ります。 商品名が変わったときに直すのは1か所だけで済み、食い違いが起きようがありません。これが、分ける手間をかける理由です。

「第何正規形か」の見分け方

判定問題は、この順に見ていけば機械的に答えが出ます。

  1. 1つのマスに複数の値が入っていないか → 入っていれば第1正規形より前
  2. 主キーの一部だけで決まる項目はないか → あれば第1正規形どまり
  3. 主キー以外で決まる項目はないか → あれば第2正規形どまり
  4. どれもなければ第3正規形

あえて分けないこともある

分けるほど重複は消えますが、そのぶんデータを取り出すときに表をつなぎ合わせる手間が増えます。参照が非常に多いシステムでは、速さを優先してあえて重複を残すこともあり、これを非正規化と呼びます。

正規化は目的ではなく手段だ、ということです。

覚え方:第1・第2・第3を「何を取り除いたか」で並べる

3つの正規形は、取り除いたものの名前で順に並べると混ざりません。

取り除くもの一言で
第1正規形1マスに複数の値繰り返しをなくす
第2正規形主キーの一部で決まる項目部分関数従属をなくす
第3正規形主キー以外で決まる項目推移的関数従属をなくす

「くり返し → 部分 → 推移」の3語だけ順に言えるようにしておけば、条件を聞かれたときに逆算できます。 第2と第3の取り違えが一番多いので、「2は主キーの一部、3は主キー以外」と、数字と“部”の字で結びつけておくと確実です。

試験ではこう出る

科目A(旧・午前)では「第◯正規形の条件はどれか」という定義問題と、具体的な表を示して「この表は第何正規形か」を判定させる問題の2パターンが定番です。応用情報の科目Bではデータベース分野の必答に近い頻度で登場し、与えられた業務要件からE-R図と正規化した表を設計させる形式で問われます。 「第何正規形か」を判定する問題は、繰返しがあるか(第1)、主キーの一部で決まる項目があるか(第2)、非キー項目で決まる項目があるか(第3)の順に見ていけば機械的に判定できます。

関連する用語

主キー
行を1つに特定する列。どの列がどの列に決まるかを、この主キーを軸に見る
外部キー
他の表の主キーを指す列。正規化で分け、外部キーでつなぎ直す
インデックス
検索を速くする索引。表の形を変える正規化とは目的が違う
非正規化
速さを優先して、あえて重複を残す設計。正規化の失敗ではなく意図した判断

ミニクイズ

第2正規形の条件として正しいものはどれか。

正解は 4番:第1正規形であり、非キー属性が主キーの一部だけに依存していない

主キーの一部にだけ依存する状態(部分関数従属)を取り除いたものが第2正規形です。非キー属性どうしの依存関係を除くのは第3正規形(推移的関数従属の除去)、繰返し項目がないのは第1正規形の条件です。

間違えた用語の復習リストを見る →

この分野をまとめて解く → データベースのミニテスト(全35問)

最終更新:2026-09-14