【デスペ3問】正規化の実習(データーベーススペシャリスト)
このNoteにはデータベーススペシャリスト(デスペ)AMIIに出題される正規化問題をまとめました。
いわゆる表を分解して、第3正規形を目指す演習です。
過去問を全部見ましたが、たった3問でした。
まず手っ取り早く理解したい時は、過去問道場さんをお薦めします。「こんな感じの表に分けるんだな」と理解しておいてください。
もし正規化に自信がなければ、ITパスポート向けのNoteですが2つ薦めます。
今回のNoteでは、主キーをどう決めていくか、他に主キーの選び方があったかなど、かなり深いところまで解説します。
AMII対策ではなく、「午後対策の下準備」と心構えてください。
このNoteは、データベーススペシャリスト独学合格、IT専門学校の先生の経験を基に書いています。
それでは始めましょう!
問題1:正規形を特定せよ
正答はウ。
第2正規形は、部分的関数従属がなく、推移的関数従属が残っている形態です。
ア~エの正規形は以下の通り。
ア:第1正規形。問題文より「講座名→担当教員」で、「講座名」は表の候補キー2つのうちの1つです。よって部分関数従属しているため、第2正規形になっていません。
イ:第3正規形。候補キー「社員番号」から社員1名が特定できるため、残りの3属性が決まっています。
ウ:正しい。第2正規形。問題文より「所属コード→勤務地」で、「所属コード」は表の「非」候補キーです。よって推移的関数従属が残っているので、第3正規形ではありません。一方で表の候補キーは「社員番号」1つであり、「候補キーの一部」に従属した属性はないので、第2正規形にはなっています。
エ:非正規形。趣味の属性に2つの値が入っています。単一ではない値が含まれている(=繰り返し項目)が含まれているので、第1正規形ではなく、非正規形です。
問題2:正規形を特定せよ
正答はイ。
表の候補キーを考えます。
項番は、問題文より「項番は1回の受注~連番」より、受注番号+項番で候補キーになれそう。
ここで、受注日+得意先コードでも候補キーにできそうですが、「同じ得意先からの受注は1日1回」旨の記述がないため、判断できません。
また、受注番号+商品コードでも候補キーにできそうですが、「同じ商品の複数受注はない」旨の記述がないため、判断できません。
では関数従属性を考えます。
受注番号→受注日, 得意先コード
受注番号, 項番→商品コード, 数量
商品コード→単価
では、どの正規形か考えます。
繰り返し項目がないので、非正規形ではないです。第1正規形以降です。
表の候補キーは{受注番号, 項番}で、受注番号→{受注日, 得意先コード}のように「候補キーの一部からの関数従属」があります。よって第2正規形より前なので、第1正規形と判断できます。
問題3:第3正規化をせよ
正答はウ。
候補キーについて、問題文より「1回の注文で受注伝票」「1回の注文で複数の商品」なので、受注番号+何かが候補キーになりそうです。
よくあるのは「明細番号」や「項番」という名前で、各受注に連番を設けるパターンですが、表には見当たりません。
よって問題文の「1回の注文で複数の商品」から、商品コードにするしかない、と判断します。
なお、1回の注文で「同じ商品を複数回」注文するのを禁じているか明記ないので、厳密にはアブナイです。しかし他に特定できる情報がありません。
また、商品コードではなく商品名を使うテもありますが、「商品名の重複がない」と明記がないのでアブナイです。表を見る限りでは「テレビA」「テレビB」など、重複を防ぐ努力をしているようには見えますが、商品コードの方が無難です。「コード」と名乗っているので、一意であると考えて良いからです。
では関数従属を見てみます。
{受注番号, 商品コード}→{受注数, 受注金額}
受注番号→{顧客コード, 受注日}
商品コード→{商品名, 単価}
顧客コード→顧客名
候補キーは{受注番号, 商品コード}の2つですが、受注番号だけ・商品コードだけに従属している項目があります。部分的関数従属が残っているので第1正規形です。
分離して
受注番号をキーとする受注表
商品コードをキーとする商品表
の2つの表を作ります。これで表は3つになりました。
部分的関数従属はなくなったので、第2正規形になりました。
受注表:
受注番号→{顧客コード, 受注日}
顧客表:
顧客コード→顧客名
受注明細表:
{受注番号, 商品コード}→{受注数, 受注金額}
商品コード→{商品名, 単価}
次は推移的関数従属を見ます。
各表の非候補キーを見ると、受注明細表の商品コードに従属した項目があります。
分離して
商品表:
商品コード→{商品名, 単価}
を作ります。
これで推移的関数従属はなくなったので、第3正規形になりました。
表は4つです。
受注表:
受注番号→{顧客コード, 受注日}
顧客表:
顧客コード→顧客名
受注明細表:
{受注番号, 商品コード}→{受注数, 受注金額}
商品表:
商品コード→{商品名, 単価}
最後に少し補足です。
受注金額は、単価×受注数で計算できるので、削除することを考えるべきです。ただし、イチイチ計算処理するよりは、データとして記録した方が動作効率は良いです。
他にもポイント履歴が絡むときは、第2正規形で留めることもあります。とはいえ、AMIIでは出ず午後問題に出るので、午後対策で学習すればOKです。
まとめ
お疲れ様でした!
正規化を実際にする問題を集めましたが、意外と3問でした。
データベース設計は、ER図・キーの設定・正規形の定義・正規形の演習など多岐に渡ります。
しかしAMIIはたった25問なので、早々多く出題するわけにもいかないんだろうと推察されます。
私が合格してきた勉強法についてもNoteにしました。
まずは書籍の読み倒し方、AMIIの勉強だけでも参考にして頂ければ、嬉しいです。
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ