【応用情報】令和元年秋季 午後問6 DBを解きました
DBスペシャリスト落ちすぎて自信無くなってきたので、応用情報のデータベースを解いてモチベを上げていくという低姿勢。
参考書や解説サイトの真面目な解説を見る気力は残ってない、自分みたいな人向けの雑解説を残しておきます。
・問題PDF
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_ap_pm_qs.pdf
・解答例PDF
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_ap_pm_ans.pdf
設問1
a・b:IPAはE-R図で「1対1」と「多対多」を出してこないと信じる。
正規系を解く問題なら話は別だと思う。
残ったのは1対多。部署エンティティ [ a ] 従業員エンティティ。
部署エンティティに従業員エンティティの主キー[従業員番号]がないので空欄aに「←」はない。
従業員エンティティにも部署エンティティの主キー部署番号はないが、代わりに空欄bがあるので、ここに「部署番号(外部キー)」が入る。
これで空欄aも「→」になる。
c:IPAはE-R図の一番上に主キーを記入させると信じる。
従業員エンティティ→月次レポートエンティティなので、従業員エンティティの主キー従業員番号が入る。一番上に記入するので外部キー扱いではなく主キー扱い。空欄cは「従業員番号(主キー)」が入る。
d:E-R図の形状から見て「↓」が入ると確信するが何故そう思うか分からない。
言語化って難しいね。元々多対多の関係だった従業員エンティティ←→公開情報エンティティを1対多に分割するために出来た繋ぎ部分だから「↓」が入るとか?
素直に考えると、1人の従業員に対して公開情報は複数存在する。(問題文からだと身長や体重など)
なので従業員エンティティ→公開エンティティの関係になる。とかだと思う。
設問2
e:分からなかった。そこのFROMなに?副問い合わせ?ってパニックになってた。
INSERTはSELECT文の結果でも挿入できるので、INSERT INTOの後に書かれている(従業員番号 , レポート年月)が挿入できるようなSELECT文を記入する。
また、対象とするレポート年月は問題文より「集計する対象年月を格納する埋込み変更":レポート年月"」を使用する。
空欄eには「SELECT 従業員番号, :レポート年月」が入る。
f:④は「対象年月の月間総歩数を集計して更新する」ので、SUM(歩数.歩数)。
一歩も歩いていなくて歩数テーブルにレコードがないときはエラー回避のため0を表示する、歩いてたらレコードの集計結果で更新するので空欄fには「SUM(歩数.歩数)」が入る。
g:月次レポートは従業員ごとに作成するので従業員を一人に絞る処理を書く。
空欄gには「歩数.従業員番号 = 月次レポート.従業員番号」が入る。
なお、対象月の指定は「TOYM(歩数.測定日)=:レポート年月日」で行われている。
設問3
(1)下線①のパターンとは何か:測定日の主キーが重複してますエラーな気がする。E-R図見たら当たってた。
~~な気がする。をきちんと言語化できるようになりたい。
睡眠エンティティは「従業員番号(主キー)、測定日(主キー)、睡眠開始日時、睡眠終了日時」。これに対して図4の4行目と5行目が従業員番号も測定日も同じなので主キー制約エラーが発生する。
30字以内なので「同じ測定日に2回睡眠を行ったパターン(18字)」と答える。解答例は「1日に2回以上睡眠を取得するパターン」。3回目、4回目を考慮していない解答だったので、本番だと減点される気がする。
(2)下線②の変更を加えた表とその内容:列追加が駄目なら主キーの変更だよね。
今回のエラーは1日に2回以上睡眠を取得したパターンの際に発生する、主キーのユニーク制約。
主キーを「従業員番号(主キー)、測定日(主キー)」から「従業員番号(主キー)、睡眠開始日時(主キー)」に変更する。秒単位で時間を取得している睡眠開始日時なら、主キーのユニーク制約は起こらないはず。
1秒間に2回寝る超人がいたら再び同パターンのエラーが発生するが、のびた君でも最速入眠タイムは0.93秒なので大丈夫。
とりあえず知識が足りていないのと、言語化と想定が甘いところがあるので、地道に問題慣れしていくのが今後の課題だと思いました。後60日。間に合うのか。