見出し画像

【デスペ3問】正規化の実習(データーベーススペシャリスト)

このNoteにはデータベーススペシャリスト(デスペ)AMIIに出題される正規化問題をまとめました。

いわゆる表を分解して、第3正規形を目指す演習です。

過去問を全部見ましたが、たった3問でした。

とはいえ「正規化のセンス」は午後問題で必須になる重要テーマです。「AMIIで正解できた!」で終わらせてはダメです。


まず手っ取り早く理解したい時は、過去問道場さんをお薦めします。「こんな感じの表に分けるんだな」と理解しておいてください。

もし正規化に自信がなければ、ITパスポート向けのNoteですが2つ薦めます。

※なおデスペでは「主キー」「外部キー」以外に「候補キー」「スーパーキー」「代用キー」の理解も必要です。解説Noteを準備しておきますね。


今回のNoteでは、主キーをどう決めていくか、他に主キーの選び方があったかなど、かなり深いところまで解説します。

AMII対策ではなく、「午後対策の下準備」と心構えてください。


このNoteは、データベーススペシャリスト独学合格、IT専門学校の先生の経験を基に書いています。

それでは始めましょう!





問題1:正規形を特定せよ


データベーススペシャリスト 平成24年午前2問08より
データベーススペシャリスト 平成28年午前2問07より
データベーススペシャリスト 令和02年午前2問05より

正答はウ。

第2正規形は、部分的関数従属がなく、推移的関数従属が残っている形態です。

ア~エの正規形は以下の通り。

ア:第1正規形。問題文より「講座名→担当教員」で、「講座名」は表の候補キー2つのうちの1つです。よって部分関数従属しているため、第2正規形になっていません。

イ:第3正規形。候補キー「社員番号」から社員1名が特定できるため、残りの3属性が決まっています。

ウ:正しい。第2正規形。問題文より「所属コード→勤務地」で、「所属コード」は表の「非」候補キーです。よって推移的関数従属が残っているので、第3正規形ではありません。一方で表の候補キーは「社員番号」1つであり、「候補キーの一部」に従属した属性はないので、第2正規形にはなっています。

エ:非正規形。趣味の属性に2つの値が入っています。単一ではない値が含まれている(=繰り返し項目)が含まれているので、第1正規形ではなく、非正規形です。




問題2:正規形を特定せよ


データベーススペシャリスト 平成27年午前2問06より

正答はイ。

表の候補キーを考えます。

受注系は、受注番号+明細番号で復合主キーにするのが王道です。

項番は、問題文より「項番は1回の受注~連番」より、受注番号+項番で候補キーになれそう。

ここで、受注日+得意先コードでも候補キーにできそうですが、「同じ得意先からの受注は1日1回」旨の記述がないため、判断できません。

また、受注番号+商品コードでも候補キーにできそうですが、「同じ商品の複数受注はない」旨の記述がないため、判断できません。


では関数従属性を考えます。

  • 受注番号→受注日, 得意先コード

  • 受注番号, 項番→商品コード, 数量

  • 商品コード→単価


では、どの正規形か考えます。

繰り返し項目がないので、非正規形ではないです。第1正規形以降です。

表の候補キーは{受注番号, 項番}で、受注番号→{受注日, 得意先コード}のように「候補キーの一部からの関数従属」があります。よって第2正規形より前なので、第1正規形と判断できます。




問題3:第3正規化をせよ


データベーススペシャリスト 令和05年午前2問08より

正答はウ。


私は段階的に従属関係を求めて正規化してないです。
最初に全部の従属性を明らかにしています。


候補キーについて、問題文より「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就職のブログ << をやってます。

でわでわ(・ω・▼)ノシ


いいなと思ったら応援しよう!

せんない
学習方法・問題特集のNoteは全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ

この記事が参加している募集