データベースの正規化

問題

応用情報技術者平成22年春期 午前問32

“受注明細”表は,どのレベルまでの正規形の条件を満足しているか。ここで,受注番号と明細番号の組は主キーである。

受注番号明細番号商品コード商品名数量
0158671TV2000620型テレビ20
0158672TV2400524型テレビ10
015867 3TV2800728型テレビ5
01586781TV2400524型テレビ8
  • 第1正規形
  • 第2正規形
  • 第3正規形
  • 第4正規形

答え

第2正規形

解説

データベースの正規化


関係の正規化(かんけいのせいきか)は、関係データベース (リレーショナル・データベース) において、正規形と呼ばれる形式に関係(リレーション)を準拠させることにより、データの一貫性の維持と効率的なデータアクセスを可能にする関係設計を導くための方法である。正規形には様々なものが存在するが、いずれにせよ、正規化を行うことにより、データの冗長性と不整合が起きる機会を減らすことができる。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

ざっくりした理解では、データベースの中で重複しているデータを削除して、わかりやすいデータベースを作りましょうということです。

関数従属性

第2正規化、第3正規化は、関数従属性という概念を理解しておくと、覚えやすいです。


関数従属性 (かんすうじゅうぞくせい、FD: functional dependency) は、コンピュータ関係データベースにおける関係)の2つの属性集合間で、一方の属性集合の値(の集合)がもう一方の属性集合の値(の集合)を関数的に決定するという、制約である。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

関数従属性とは、入力\(x\)と出力\(y\)に対して、$$\{x\} \rightarrow \{y\}$$ \(x\)が決まれば\(y\)が決まることを示す。この時、\(y\)は\(x\)に従属しているという。

例えば、問題の表であれば、『「数量」は「受注番号」に従属している』し、また『「数量」は「明細番号」に従属している』と言えます。

関数従属性については、以下のサイトの説明が大変分かりやすいです。

第1正規化


関係がスカラ値のみを持ちうるとき、その関係を第1正規形 (first normal form; 1NF) であるという。スカラ値とはそれ以上分割できない値のことをいい、単一の数値や単語は一般にスカラ値だが、表や配列、カンマで区切った文字列などはふつうスカラ値ではない。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

非正規形を第1正規形にします。簡単に言ってしまえば、第1正規形とは、行内に繰り返し項目のない表です。

非正規形

受注番号明細番号商品コード商品名数量
0158671TV2000620型テレビ20
2TV2400524型テレビ10
3TV2800728型テレビ5
0158681TV2400524型テレビ8

第1正規形

受注番号明細番号商品コード商品名数量
0158671TV2000620型テレビ20
0158672TV2400524型テレビ10
015867 3TV2800728型テレビ5
0158681TV2400524型テレビ8

第2正規化


ある関係が、第1正規形で、かつ、すべての非キー属性が、すべての候補キーに対して完全従属するとき、第2正規形 (second normal form; 2NF) であるという。つまり、第2正規形では、候補キーの一部に関数従属する非キー属性があってはならない。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

第1正規形を第2正規形にします。第2正規形とは、完全関数従属を持つテーブルのみで構成された形です。 逆に言えば、テーブルのすべての候補キー(主キー)において部分関数従属性が存在しないことです。

部分関数従属性は、複数の主キーからなるテーブルで、一部の主キーでのみ決まってしまう値があることです。

問題のテーブルは既に第2正規化されてしまっているので、注文者をテーブルに加えることで、意図的に第2正規化されていない状態に戻します。

受注番号注文者明細番号商品コード商品名数量
015867田中1TV2000620型テレビ20
015867田中2TV2400524型テレビ10
015867 田中3TV2800728型テレビ5
015868山田1TV2400524型テレビ8

この新しく作成したテーブルでは、以下のような関係が成り立っています。

  • 「注文者」は「受注番号」に従属している。
  • 「商品コード」は「受注番号」と「明細番号」に従属している。

問題の主キーは「受注番号」と「明細番号」です。「注文者」は「受注番号」によってのみ決まってしまうので、部分関数従属性があります。よって、第2正規形になるためには、テーブルを分離する必要があります。

受注番号明細番号商品コード商品名数量
0158671TV2000620型テレビ20
0158672TV2400524型テレビ10
015867 3TV2800728型テレビ5
0158681TV2400524型テレビ8
受注番号注文者
015867田中
015868山田

第3正規化


ある関係が、第2正規形で、かつ、非キー属性があるならば、それら全てが候補キーに非推移的に関数従属するとき、第3正規形 (third normal form; 3NF) であるという。
候補キーA及び非キー属性B, Cを含む関係があり、A → BかつB → Cのとき、Cは候補キーAに推移的に関数従属するという。推移的に従属する属性に従属する非キー属性も同様である。非推移的に従属するとは、関数従属するが推移的に関数従属していないことをいう。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

第2正規形を第3正規形にします。第3正規形とは、推移的関数従属が存在しないことです。

問題では、「受注番号、明細番号」→「商品コード」→「商品名」という推移的関数従属が発生してしまっているので、第3正規形になるためには、テーブルを以下のように分離する必要があります。

受注番号明細番号商品コード数量
0158671TV2000620
0158672TV2400510
015867 3TV280075
0158681TV240058
商品コード商品名
TV20006 20型テレビ
TV24005 24型テレビ
TV28007 28型テレビ

ボイス-コッド(3.5)正規形化


ある関係上に存在する自明でない全ての関数従属性の決定項が候補キーであるとき、かつそのときに限り、その関係はボイス・コッド正規形 (Boyce/Codd normal form; BCNF) であるという。すなわち、ボイス・コッド正規形では、すべての属性が候補キーに完全従属する。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

ボイスコッド正規化では、「非キー→主キー」という関数従属を排除します。

第4正規化


第4正規形 (fourth normal form; 4NF) では候補キーではない属性への多値従属性をもった属性があってはならない。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

第4正規化、第5正規化は、テーブルが全て主キーから成り立っている場合の正規化です。

ざっくりした理解では、第4正規化は、主キー同士の関係を関数従属性を使って分解するようなイメージです。

第5正規化


第5正規形 (fifth normal form; 5NF) を満たす関係は、その関係が第4正規形であり、さらにその関係に含まれる結合従属性の決定項が候補キーのみである場合、かつその場合だけである。 第5正規形は、射影-結合正規形 (project-join normal form; PJ/NF) とも呼ばれる。


出典: フリー百科事典『ウィキペディア(Wikipedia)』

ざっくりした理解では、あるテーブルを分解したテーブルを、結合することによってもとのテーブルに戻ることが可能であることを結合従属性といって、この結合従属性を満たすようにしながらテーブルをより細かく分割していくイメージです。