【情報】正規化なんて怖くない
みなさんこんにちは。アンドロメダです。
しつこいようですが、1次試験の受験申込期限が近付いてきています!締切は6月4日(月)です。「相撲を取る準備ができていても土俵に上がる権利がなかった~orz 」なんてことがないように、確実に申し込みを済ませましょう!!
さて、今回のテーマは情報ということですが、恥ずかしながら私は普段SEとして働いております。ですので、情報は自分のテリトリーと言っても過言ではありませんでした。今週はすでに他の執筆陣がほとんどの論点を取り上げていますので、私の一番得意なデータベースの範囲から「正規化」について取り上げたいと思います。
まず、今回使用するテーブルを載せておきましょう。
ルール:同じ日に、同じ仕入先から同じ商品を2回以上仕入れることはない。
また、以下で用いる例として、キーAの値が決まればキーB,Cが決まることを、「A→{B, C}」と表すことにします。
1.正規化する目的
正規化する目的の代表格としては「一貫性の保持」があります。「一貫性」とは簡単にいえば、「矛盾がない状態」のことです。
例のテーブルをご覧下さい。例えば、仕入先コードE1001の仕入先名を”秋田商店”から”青森商店”に変更したいとします。その時、矛盾のないように変更するためには”秋田商店”に関するすべてのレコードに対して変更をかけなければなりません。(もし1箇所でも変更しないと仕入先コードがE1001の仕入先名が”秋田商店”と”青森商店”の2種類存在することになり、矛盾が生じます。)
これを防ぐために、仕入先の情報だけ分離させることで、一貫性を保とうというわけです。
また、もし仕入先コードE1002の情報がすべて削除された場合、”岩手商店”に関する情報が消失してしまいます。
こういった事態を防ぐために、正規化という技術を用いるわけです。
2.正規化の手順
さぁ、それでは実際に正規化をしてみましょう。
手順としては「主キーの決定」→「非正規化から第1正規化へ」→「第2正規化へ」→「第3正規化へ」
となります。
(1)主キーの決定
主キーの定義は「そのキー値が定まることで、レコードを特定できるキー、またはキーの集合」です。
では、例のテーブルの主キーを考えてみましょう。
まず、商品コードが決まれば商品名と価格が決まるので「商品コード→{商品名、価格}」が成り立ちます。次に、仕入先コードが決まれば仕入先名が決まるので、「仕入先コード→仕入先名」の関係が成り立ちますね。
「それなら主キーは{商品コード、仕入先コード}で決まり!」と考えるのは早いです。なぜだかお分かりでしょうか?
それは、商品コードと仕入先コードが決まってもレコードが一意に決まらないからです。従って、主キーに「日付」を含める必要があります。(※ルールに注目すれば、日付が主キーとしてふさわしいことが分かります。)
(2)非正規形から第1正規形へ
第1正規形の定義は、「テーブルの中に繰り返し項目がないこと」です。繰り返し項目とは、「1つのセルに複数の値がある項目」を言います。例のテーブルには繰り返し項目はありませんので、第1正規形を満たしています。
(3)第1正規形から第2正規形へ
第2正規形の定義は、「すべての非キー項目(主キーでない項目)が、主キー項目に完全関数従属すること」です。ここで「関数従属」という言葉を使いましたが、簡単に言うと「{A}→{B}」の状態です。すなわち上の例で言えば、「商品名と価格は商品コードに関数従属している」ということです。
また、「完全関数従属」というのは「主キーの一部に関数従属している非キー項目がない」ということです。主キーの一部というのは、例で言うところの
「{商品コード}」 「{仕入先コード}」 「{日付}」 「{商品コード, 仕入先コード}」 「{商品コード, 日付}」 「{仕入先コード, 日付}」
の組み合わせを言います。(「{商品コード, 仕入先コード, 日付}」の組み合わせは”一部”ではなく、”全部”になります。) 例のテーブルではそれぞれ「{商品コード}→{商品名, 価格}」と「{仕入コード}→{仕入先名}」が該当します。これをそれぞれ別テーブルに分けます。
すると、以下のようなテーブルになります。
(4)第2正規形から第3正規形へ
第3正規形の定義は「すべての非キー項目(主キーでない項目)が、主キー項目に推移的関数従属しないこと」です。ここで、「推移的関数従属」とは、「{A}→{B}→{C}であるが、{A}→{C}でない」ときに「CはAに推移的関数従属している」と言います。
定義に沿えば、「主キーAが決まれば一意に決まる非キー項目Bがあったとき、そのBが決まれば一意に決まる非キー項目Cが存在しない」ことが第3正規形である条件です。
第2正規形まで正規化を進めたテーブルを見てみると、上記のような項目は見当たらないので、上記のテーブルは第3正規形となっています。
いかがでしたでしょうか?難しい言葉も少し使いましたが、言葉自体は覚えていなくてもいいので、「どういう状態が第何正規形か?」が分かればもう怖くありません。ここまでできれば、どんな問題が出ても大丈夫でしょう。定義を理解しておけば、「この表の正規化度を答えなさい」みたいな問題が出てきても即答できるでしょう。
皆さんもどうか苦手に感じることなく、パズル感覚で問題を解いてみてくださいね!
By アンドロメダ
まっすー様へ 様
この論点は、7月のTAC模試でも出題された問題なのですね。よく考えると、少々疑問のあるところがありますが、正規形の定義から×と判断することは可能、ということですね。
深く勉強されたとのことで、まさに、アンドロメダの投稿のタイトルにあるように「正規化なんて怖くない」ですね。
1次試験突破をお祈りしております!
回答ありがとうございました。
貴殿の下記の指摘は同感です。
「この選択肢の記述は第1正規形の定義(繰返し項目の排除)を言っているのではないので×としました。診断士試験対策としては、それで十分だと思います。」
ただ、7月のTAC模試で
「第二正規形とは主キー以外の項目が主キーによってのみ特定できる形式をいう」
が選択肢と出題され、×となっていました。
さらに貴殿も指摘されている
主キーの一部で特定できるものは含まないのか?等からこの選択肢は設問文として適切なのでしょうか?との疑問を持った次第です。
重ねての速やかな回答ありがとうございます。
今回の質問で正規形につて深く勉強しましたので、1次試験ではokだと思います。
では。
ひょこり様
追加の情報ありがとうございます。
TACの過去問題集の解説を確認しましたが、第3正規形である、との解説となっておりました。
この考え方によると、「主キー以外の項目が主キーによってのみ特定できる形式」というのは、主キーから導出される、主キー以外の項目から主キー以外の項目への関数従属性(つまり推移的関数従属性)は、主キーによってのみ特定できる形式として考えない、ということになるんですね。
TACの解説は、この「のみ」というのが、推移的関数従属性を排除するという解釈ですね。
ただ、この場合、部分的関数従属がある場合は第1正規形になります。第3正規形の定義は、「第2正規形であって、候補キーから非キー項目への推移的関数従属性がない」ですので。
主キー「のみ」というのは、主キーの一部で特定できるものは含まないのか?少々解釈に悩む問題です。
ちなみに私は、この選択肢の記述は第1正規形の定義(繰返し項目の排除)を言っているのではないので×としました。診断士試験対策としては、それで十分だと思います。
まっすー様へ
少し情報が不足していました。
この問題は2009年1次試験第7問選択肢ウで出題された問題です。
「第一正規形とは主キー以外の項目が主キーによってのみ特定できる形式をいう」
の正誤問題です。
ひょこり様
再度のご投稿ありがとうございます。
第1正規形にはならないとのご指摘に対し、私なりの考察を書かせていただきます。
主キーの定義は、「一つまたは複数の候補キーの内、最もふさわしいもの」であり、候補キーの定義は、「そのタプル(行)を特定できる属性(列)の最小の組み合わせ」となります。
よって、主キーは「主キー以外の項目を含む、その行を特定する、最小の列の組み合わせの内、最もふさわしいもの」であることになります。
この定義より、主キーが主キー以外の項目を特定するのは自明であり、私は第1〜3正規形や、複数の行を許容するのであれば、非正規形でさえもこの条件を満たすと考えました。
これが第2正規形にはなるが、第1正規形にはならない場合、「主キー以外の項目が主キーによってのみ特定できる形式」という文言に、完全関数従属性を満たす要素が含まれることになるはずですが、私は、そこまでは読み取れませんでした。
私の考察は以上です。
他にもご質問等ありましたら、またお寄せいただけますとありがたいです!
イラサム様へ
回答ありがとうございました。
まっすー様へ
残念ながら、第1正規形ではないと思います。説明略。
ひょこり様
イラサムの回答に補足させていただきます。ご質問に対する回答としては、「第1正規形、第2正規形、第3正規形のいずれの可能性もある」となります。
まず、前提条件として「主キー以外の項目が主キーによってのみ特定できる形式」ですが、主キー以外の項目が一意に特定できる、つまり繰り返し項目がないものとします(もし、一つまたは一組の主キーに対して複数の項目が定まる場合は非正規形です)。
アンドロメダの記事にもありますが、この時点で、第1正規形の条件を満たします。
第1正規形を満たしている場合、あとは完全関数従属となっているか、推移的関数従属があるか、によって第1正規形、第2正規形、第3正規形のいずれに当たるかを判断することになります。
ご質問頂いた情報では、これらの関数従属性に関する記述がないため、いずれの可能性もある、と言うのが回答となります。
試験対策としては、イラサムの言うように、テーブルを見て、正規形への組換えや第何正規形かを回答できるレベルにしておけば大丈夫だと思います。
梅雨も明け、暑い季節を迎えましたが、最後までがんばってください!
ひょこり様
コメントありがとうございます。
結論から申し上げますと、第2・第3の両方とも当てはまる可能性があります。
第2正規形から第3正規形への手順を確認すると
(1)外部キーとそれに従属する項目の抽出
(2)計算で求める項目がある場合は、その項目を削除
となっています。
この時、仮に外部キーが存在しない場合でも、計算で求める項目が削除された表は第3正規形に分類されます。
つまり表だけみるとは第2正規形と同じ数しかないのに、計算で求める項目が削除されていれば第3正規形となる事です
こう考えると、一概に「主キー以外の項目が主キーによってのみ特定できる形式は」第2です または第3です、とは言えません。
試験対策で考えるなら、①正規化ができる(H19第6-1)、②表を見て第?正規形か判断できる(H16第8-3)で大丈夫かと思います。
(あくまで僕の所感で絶対ではありません)
ちなみに平成16年の問題はTBC受験研究会のページから閲覧できます。
なにかありましたら、またコメントください。
1ヵ月を切りましたが最後まで頑張ってください!!
正規化の定義ですが、
「主キー以外の項目が主キーによってのみ特定できる形式は」
第2、第3のどちらでしょうか?
回答よろしくご指導ください。