正規化とは

せいきか

関係データベースの表を、列どうしの関数従属に基づいて分割し、同じ事実が何か所にも記録されないようにする設計の手順。データの重複をなくし、更新時異常・挿入時異常・削除時異常を防ぐ。第1正規形から第3正規形、ボイス・コッド正規形などの段階がある。

「正規化」は、1分野の3問の練習問題に出てきます(データベースの基礎など)。

この用語の分野: データベースの基礎

正規化で防ぐ異常

正規化していない表では、同じ事実が何行にも重複して記録されます。例えば社員表の各行に部署名まで持たせると、部署名を変えるときにその部署の社員の行をすべて書き換えなければならず、書き換え漏れで内容が食い違います(更新時異常)。社員がまだいない部署は登録できず(挿入時異常)、部署の最後の社員を削除すると部署の情報まで消えます(削除時異常)。部署の情報を別の表に分ければ、1つの事実を1か所にだけ記録でき、これらの異常を防げます。

第1正規形から第3正規形まで

第1正規形は、どの列も繰り返しのない1つの値だけを持つ状態です。第2正規形は、第1正規形で、主キーの一部だけに従属する列(部分関数従属)がない状態で、主キーが複数の列からなる表で問題になります。第3正規形は、第2正規形で、主キー以外の列を経由して決まる列(推移的関数従属)がない状態です。例えば 受注番号 → 顧客番号 → 顧客名 のような従属があれば、顧客番号と顧客名を別の表に分けます。分けた表は、共通の列で結合すれば元の表に戻せる(情報が失われない)ように分割します。

非正規化とのバランス

正規化すると重複はなくなりますが、表が分かれる分、検索のたびに結合が必要になります。読み出しが大部分を占める集計用のデータベースなどでは、性能のために、あえて表をまとめて重複を持たせる非正規化を行うことがあります。その場合は、重複したデータをそろえて更新する仕組みが必要になります。更新の多い業務処理のデータベースでは、第3正規形までの正規化を基本にするのが一般的です。

正規化の練習問題に挑戦

関係データベースの表を正規化する主な目的はどれか。

  1. A表の数を減らして、どんな検索も結合なしで速く行えるようにすること
  2. Bデータを暗号化して、許可のない利用者に読まれないようにすること
  3. Cデータの重複をなくし、更新したときに内容が食い違うなどの異常を防ぐこと
答えと解説を見る

正解:C. データの重複をなくし、更新したときに内容が食い違うなどの異常を防ぐこと

正規化は、列どうしの関数従属(ある列の値が決まると、別の列の値が1つに決まる関係)に基づいて表を分割し、同じ事実が何か所にも記録されないようにする設計の手順です。例えば、社員表の各行に部署名まで書いておくと、部署名を変えるときに、その部署の社員の行をすべて書き換えなければならず、書き換え漏れがあると内容が食い違います(更新時異常)。ほかにも、社員がまだいない部署を登録できない(挿入時異常)、最後の1人の社員を削除すると部署の情報まで消える(削除時異常)といった問題が起きます。部署の情報を部署表に分けておけば、部署名は1か所を直すだけで済みます。一方、表が分かれる分、検索のときに結合が増えるので、正規化すると検索が速くなるとは限りません。

受注表(受注番号, 商品番号, 数量, 顧客番号, 顧客名)の主キーは{受注番号, 商品番号}で、関数従属は {受注番号, 商品番号} → 数量、受注番号 → 顧客番号、顧客番号 → 顧客名 である。この表を第3正規形まで正規化した結果として正しいものはどれか。

  1. A受注明細(受注番号, 商品番号, 数量, 顧客番号)、顧客(顧客番号, 顧客名)
  2. B受注明細(受注番号, 商品番号, 数量)、受注(受注番号, 顧客番号)、顧客(顧客番号, 顧客名)
  3. C受注明細(受注番号, 商品番号, 数量)、受注(受注番号, 顧客番号, 顧客名)
答えと解説を見る

正解:B. 受注明細(受注番号, 商品番号, 数量)、受注(受注番号, 顧客番号)、顧客(顧客番号, 顧客名)

第2正規形は、第1正規形で、しかも主キーの一部だけに従属する列(部分関数従属)がない状態です。受注番号 → 顧客番号 は、主キーの一部である受注番号だけで顧客番号が決まる部分関数従属なので、元の表は第1正規形ですが第2正規形ではありません。受注番号で決まる列を受注(受注番号, 顧客番号, 顧客名)として分けると、第2正規形になります。第3正規形は、第2正規形で、しかも主キー以外の列を経由して決まる列(推移的関数従属)がない状態です。受注表には 受注番号 → 顧客番号 → 顧客名 という推移的関数従属が残っているので、顧客(顧客番号, 顧客名)をさらに分けます。こうして、受注明細(受注番号, 商品番号, 数量)、受注(受注番号, 顧客番号)、顧客(顧客番号, 顧客名)の3つの表が第3正規形になります。分けた表は、受注番号や顧客番号で結合すれば元の表に戻せます。

よくある質問

第2正規形と第3正規形の違いは何ですか?

第2正規形は、主キーの一部だけで決まる列(部分関数従属)がない状態です。第3正規形は、それに加えて、主キー以外の列を経由して決まる列(推移的関数従属)もない状態です。主キーが1列の表は、第1正規形なら自動的に第2正規形になります。

正規化すると検索は速くなりますか?

速くなるとは限りません。正規化の目的は重複をなくして更新時の異常を防ぐことで、表が分かれる分、検索には結合が増えます。読み出しの性能が重要な場合は、あえて非正規化することもあります。

解説の中の「正規化」

「正規化」が出てくる問題(3問)

  1. 関係データベースの表を正規化する主な目的はどれか。
  2. 受注表(受注番号, 商品番号, 数量, 顧客番号, 顧客名)の主キーは{受注番号, 商品番号}で、関数従属は {受注番号, 商品番号} → 数量、受注番号 → 顧客番号、顧客番号 → 顧客名 である。この表を第3正規形まで正規化した結果として正しいものはどれか。
  3. 読み出しが大部分を占める集計用のデータベースで、正規化した表をあえて1つにまとめ、同じデータを重複して持たせる設計(非正規化)を行うことがある。この設計の長所と短所の組み合わせとして正しいものはどれか。

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

関係データベース 主キー 第3正規形 ACID特性 E-R図 インデックス SQL 外部キー トランザクション 2相ロック

用語集の一覧へ