データベース設計における正規形について、情報処理技術者試験の午前問題を基に見てみることにします。なお、試験問題の全文については、情報処理技術者試験センターのWebサイト http://www.jitec.jp/ にて公開されています。
まずは、平成19年度テクニカルエンジニア(データベース)午前試験問題の問24からです。
問24 第1、第2、第3正規形とそれらの特徴aからcの組み合わせとして、適切なものはどれか。
a:どの非キー属性も、主キーの真部分集合に対して関数従属しない。
b:どの非キー属性も、推移的に関数従属しない。
c:繰返し属性が存在しない。
第1正規形 第2正規形 第3正規形 ア a b c イ a c b ウ c a b エ c b a
答えは、ウ。
正規形の説明では、候補キーという用語がよく登場します。冗長がなく一意性を有する属性が候補キーとなります。その候補キーの中から主キー(Primary Key)が選ばれます。また、非キー属性は、候補キー以外の属性をいいます。
第2正規形は、第1正規形で、かつ、すべての非キー属性がすべての候補キーに対して完全関数従属するときのことをいいます。
関数従属とは、たとえば、属性Aの値を決めると常に属性Bの値が定まるとき、BはAに関数従属するといいます。(この場合、A→Bと表記します。)
そして、完全関数従属は、非キー属性が、候補キーを構成する複数の属性について関数従属しているような場合に、非キー属性には、候補キーを構成する一部の属性について関数従属(部分関数従属)はない、というような意味です。
なお、集合AがBの部分集合で、かつ、Bと等しくないとき、集合Aは集合Bの真部分集合であるといいます。「どの非キー属性も、主キーの真部分集合に対して関数従属しない。」とは、どの非キー属性も主キーを構成する一部の属性に対して関数従属するものではない、というようなことになりましょうか。まだ、第2正規化の余地があるということになります。
第3正規形は、第2正規形で、かつ、非キー属性のすべてが候補キーに非推移的に関数従属するときのことをいいます。
推移的に関数従属とは、たとえば、属性Aの値を決めると常に属性Bの値が定まり、なおかつ、そのときの属性Bの値により常に属性Cの値が定まるとき、CはAに推移的に関数従属するといいます。
第3正規形は、非キー属性の中に、候補キーに推移的に関数従属する属性がないことになります。
ちなみに、関数従属について、平成17年度テクニカルエンジニア(データベース)午前試験問題の問24もみてみます。
問24 関数従属に関する記述のうち、適切なものはどれか。ここで、A、B、Cはある関係の属性の集合とする。
ア BがAに関数従属し、CがAに関数従属すれば、CはBに関数従属する。
イ BがAの部分集合であり、CがAに関数従属すれば、CはBに関数従属する。
ウ BがAの部分集合であれば、AはBに関数従属する。
エ BとCの和集合がAに関数従属すれば、BとCはそれぞれがAに関数従属する。
答えは、エ。
さて、RDBのテーブル設計において、正規化は、必須のスキルです。ただ、必ずしも第3正規形まで進めればよいものでもなく、レコード件数やリレーションの複雑さに応じて、部分的に第2正規化そして部分的に第3正規化を行う、といったことも行われます。実際に非正規化の際にパフォーマンスが悪くなる、といったことはよくあることです。DBMSの性能に応じて、ということになりましょうか。あるいは、アプリケーションプログラムで調整可能な範囲で、ということにもなりましょうか。