IPA 正規化・関数従属 — 頻出論点と過去問

頻出論点

1. この分野は何か

表の中のどの項目がどの項目で決まるかを手がかりに、同じ事実が何度も記録される表を分け、更新したときに食い違いが起きないようにする理論と手順を扱う分野です。どの正規形かを判定するときは、主キーの一部だけで決まる項目と、キー以外の項目を経由して決まる項目を見分けることが分かれ目になります。

2. 実際の出題のされ方

具体的な業務データの表を示し、正規化を行った後の表の構成や分割数を問う問題が繰り返し出題されています。ITパスポートでは、受注データや会員管理の表を分割したときに、どの項目をどの表に持たせ、何を主キーにするかの組み合わせを選ばせる問題が出ています。データベーススペシャリストの午前IIでは、1回の注文で複数の商品を注文できる受注データの表を第3正規形まで正規化したときの表の数を答える問題が出題されています。

第1正規形から第3正規形までの定義と変換手順を確かめる問いが、応用情報技術者の午前と高度試験の午前Iにあります。各正規形とリレーションの特徴の組み合わせを選ばせる問題や、第2正規形から第3正規形へ変換する操作を選ばせる問題のほか、受注入力システムの表と業務条件からその表がどの正規形まで満たしているかを判定させる問題が出ています。

候補キーと関数従属の理論そのものを問う問題は、記号で与えた関係を使った判定や計算まで踏み込みます。データベーススペシャリストの午前IIで、複数の候補キーと関数従属性が与えられた関係についてどこまでの正規形を満たすかを判定する問題や、与えられた属性集合から関数的に決定される属性を順次加えた集合(閉包)および冗長な関数従属を除いた集合(極小被覆)を求める問題が出ています。また、第1正規形から第5正規形までの分解において、情報無損失分解や関数従属性の保存が成り立つ条件を問う問題も出題されています。

3. 学習のポイント

関数従属性の向きと種類を整理することが、すべての正規形を判定する出発点になります。属性(または属性の集合)XX の値が決まれば属性 YY の値が一意に定まるとき、YY は XX に関数従属するといい、X→YX \rightarrow Y と表します。候補キーに含まれる属性を主属性、どの候補キーにも含まれない属性を非キー属性と呼びます。

各正規形の条件は、どの種類の従属性を排除したかで段階的に定義されます。

  • 第1正規形:1つのセルに複数の値(繰り返し項目)を含まず、すべての属性の定義域が単一の値(原子値)である状態です。1回の注文に複数の商品が含まれる伝票などを、明細行に展開したり別表に切り出したりして単一値にします。
  • 第2正規形:第1正規形を満たし、すべての非キー属性が候補キー全体に対して完全関数従属している状態です。複合キーの一部の属性だけで非キー属性が決まる部分関数従属がある場合、その属性を別表へ切り出します。
  • 第3正規形:第2正規形を満たし、すべての非キー属性がいかなる候補キーに対しても推移的に関数従属していない状態です。候補キー以外の属性 YY を経由して別の非キー属性 ZZ が決まる関係(候補キー →Y→Z\rightarrow Y \rightarrow Z)があるとき、YY と ZZ を別表へ分離します。
  • ボイス・コッド正規形(BCNF):ボイス・コッド正規形は、自明でない関数従属のどれをとっても、決定項がスーパーキー(候補キーを含む属性の組)になっている状態です。候補キーが複数重なっている関係では、第3正規形を満たしていても主属性から別の候補キーの一部への従属が残ることがあり、これを排除するとボイス・コッド正規形になります。
  • 第4正規形・第5正規形:第4正規形は、決定項がスーパーキーでない、自明でない多値従属性を持たない状態です。第5正規形は、候補キーから導けない結合従属性を持たない状態です。

表の分解に関する理論的な性質として、情報無損失分解と関数従属性の保存の2つを押さえます。情報無損失分解とは、分割した複数の表を自然結合したときに元の表が過不足なく復元できる性質です。2つに分けるとき、共通の属性から、分けたどちらかの表のすべての属性が決まるなら、情報無損失になります。関数従属性の保存とは、分割後の各表の関数従属から元の関数従属をすべて導ける性質です。第3正規形までなら、情報無損失で、しかも関数従属性も保存する分解を必ず選べます。ボイス・コッド正規形まで進めると、情報無損失には分けられても、元の関数従属の一部が、分けたどの表の中でも確かめられなくなることがあります。

また、関数従属の推論規則(アームストロングの公理など)では、次の性質を使って閉包や極小被覆を求めます。

  • 推論の基本規則:属性集合 YY が XX の部分集合(Y⊆XY \subseteq X)であれば、XX の値が決まるとその一部である YY の値も決まるため X→YX \rightarrow Y が成り立ちます(反射律)。また、X→YX \rightarrow Y かつ Y→ZY \rightarrow Z であれば X→ZX \rightarrow Z を導けます(推移律)。
  • 閉包の導出:初期の属性集合に対し、左辺の属性がすべて含まれている関数従属を見つけて右辺の属性を追加する操作を繰り返します。左辺に複数の属性がある関数従属(例:{P,Q}→R\{P, Q\} \rightarrow R)は、左辺の属性がすべてそろうまで使えません。
  • 極小被覆(冗長な関数従属の排除):右辺を単一属性に分解し、左辺の不要な属性を削った上で、他の関数従属から推移律などで導出できる関数従属を取り除きます。互いに決め合う属性の組があると、どちらの従属を残すかで、極小被覆が1通りに決まらないことがあります。

4. 間違えやすいところ

正規化の目的を問う問題では、データの圧縮率を上げることを目的とする誤答肢がありました。正規化で減らしたいのは、同じ事実が何か所にも記録されていることで起きる、更新したときの食い違い(更新時異状)です。

表を分ける問題の誤答肢には、複合キーの片方を落として行を1つに決められなくした表がありました。分けた後の表ごとに、主キーで行が1つに決まるかと、元の表に戻すための共通の列が残っているかを確かめます。

関数従属の推論規則を問う問題では、部分集合と全体のどちらがどちらに従属するかを逆にした誤答肢がありました。日本語の文では、決まる側(矢印の右辺)が主語になることに気をつけます。

ある属性の値に対して、別々の値の集まりが互いに無関係に決まる関係(多値従属性がある関係)は、ボイス・コッド正規形の条件を満たしていても、同じ値の組合せを何行も持ちます。第4正規形にするには、その2つの集まりを別々の関係に分けます。

正規化・関数従属の理解度チェック

正規化・関数従属の過去問一覧

正規化・関数従属の用語

データベースのほかの論点

SQL・関係代数53問 データモデル・E-R/UML・キー37問 トランザクション・同時実行制御30問 障害回復・バックアップ26問 分散DB・NoSQL18問 インデックス・物理設計11問