デスペ用臨時ブログ

デスペ解答の検討用

R3秋期DB午後1問1 iTEC解答速報への感想

令和3年度秋期 情報処理技術者試験データベーススペシャリスト試験を受けた。

 

問題文はIPAが公開している。

IPA 独立行政法人 情報処理推進機構:問題冊子・配点割合・解答例・採点講評(2021、令和3年)

 

iTECから午後問題の解答速報が公表されている。

情報処理技術者試験 | 解答速報・自動採点サービス | IT技術者資格取得ならアイテック

 

解答速報のうち午後1問1への感想を記載する。5chの投稿を参考にしているが、私の解釈・理解が間違っている部分もあるだろう。

 

設問1

設問1(1)はすべて正解だと思う。以下に根拠を示す。

 

a,bは関係「店舗」の情報がないと店舗単位での支払いを管理できないため外部キーとして必要なのは常識的にわかる。とはいえ、確定のためにはc〜k確定後にp9 5-(1)やp9 1-(6)の記述から判断するしかなさそう。

 

cはp8最下段。dはp8①。eはp8②。fはp9 3行目。gはp10(5)。

 

hとjについて、配布・利用のどちらも関係「クーポン設定」との関連付けが必要なので推測できるが、明確に対応する問題文はなさそう。iはp10 2で会員単位で配布処理してるから。kはp10(8)。

 

設問1(2)も正解だと思う。

 

設問2

5chでおおいに議論になった箇所。iTEC解答速報は間違いだと思う。

 

設問2(1)

 

候補キーは行を一意に識別できる最小の組み合わせ。p7③の記載からJANコードコードが重複可能性を有するとわかる。ゆえに{加盟企業コード, JANコード}では一意に行を特定できない。

 

正解は

{加盟企業コード, 加盟企業商品コード}

{加盟企業コード, 横断分析用商品コード}

 

※ p7②で加盟企業が登録すると書いてある加盟企業商品コード・加盟企業商品名・JANコードは加盟企業が異なれば同じ値が登録される可能性があると予測できる。したがって、加盟企業商品コードだけでは何も一意に識別できない。また、横断分析用商品コードだけだと横断分析用商品しか一意に識別できない。

 

候補キーに非キーが部分関数従属しているのは以下が該当する。
加盟企業コード→加盟企業名

加盟企業コード→契約開始日
加盟企業コード→契約終了日
横断分析用商品コード→横断分析用商品名
加盟企業商品コード→JANコード

※複数企業で同じ加盟企業商品コードを使っていたら「加盟企業商品コード→加盟企業商品名」は一意に特定できない。横断分析用商品コードは候補キーなので「加盟企業商品コード→横断分析用商品コード」とは言えない。

 

※複数の加盟企業で同じ横断分析用商品コードなのに違うJANコードを割り当てている可能性を排除できない。余談だが、現実には商品が同じでも限定価格・付属品・パッケージなどのバリエーションに合わせて商品管理上JANコードを変えることがあるらしい。

 

第3正規形の定義ではなく、推移的関数従属の定義だけを考える問題文のように読める。推移的関数従属の定義は下記サイト参照。
https://taityo-diary.hatenablog.jp/entry/2020/11/09/054558

 

このブログから孫引きすると「情報処理教科書 データベーススペシャリスト 2020年版(三好 康之・翔泳社)」に次のように書いてあるらしい。

83ページ
第 3 正規形を考える上での推移的関数従属性とは、下図のように属性 X が候補キー、属性 Y,Z が非キー属性であることを前提し、下図の①(X → Y がある)②(Y → Z がある)③(Y → X がない)のすべてが成立した関数従属性のことです。

 

当該定義に従うなら推移的関数従属性は「なし」だと思う。とはいえ、一例だけ見つければ「あり」だと確定できるのにくらべ、「なし」だと確定するのは非常に時間がかかる。加盟企業名もJANコードも一意に何かを識別できるような気がして試験本番中は不安に感じた。

 

設問2(2)

{加盟企業コード, JANコード}では一意に行を特定できないため、そもそも候補キーではない。そうであるなら、疑わしいのは{加盟企業コード, 横断分析用商品コード}である。その理由はp8③より「横断分析用商品コードの設定には、加盟企業商品の登録から数日を要する場合があるから。」(41文字)である。設定されるまでnullなのか仮番号採番なのかはわからないため、踏み込んで書くべきではない気がする。

 

設問2(3)

1つの行(レコード)の中で特定の項目が繰り返し含まれたり、複数の値を連結した値が含まれていないため、第1正規形の要件は満たしている。

 

候補キーのうち加盟企業コードに対して加盟企業名・契約開始日・契約終了日が部分関数従属している。したがって、第2正規形ではない。

 

解答速報の関係スキーマは間違っていると思う。加盟企業商品コードは加盟企業が設定するものだから企業が異なれば重複しうる。したがって、加盟企業商品コードだけで加盟企業商品名やJANコードは一意に識別できない。

 

また、p7 2-(1)から契約は加盟企業単位に行われ、商品単位ではないとわかる。契約開始日と契約終了日は関係「加盟企業」が持つべき属性であろう。

 

私の解答は次のとおり。下線のかわりにPK・FKで表記する。

加盟企業(PK加盟企業コード, 加盟企業名, 契約開始日, 契約終了日)

加盟企業商品(PK加盟企業商品コード, PKFK加盟企業コード, 加盟企業商品名, JANコード, FK横断分析用商品コード)

横断分析用商品(PK横断分析用商品コード, 横断分析用商品名)

 

設問3

設問3(1)

iTEC解答速報には異論がある。ポイント登録が支払日当日なら問題なく処理されるからだ。会員がポイントカードを忘れて提示しなかった場合でも、申告してレシートに押印してもらい、同日中に押印されたレシートとポイントカードを持ってくれば、バッチ処理で扱われる。

 

問題文から次のことが読み取れる。

・ポイントカードを忘れた会員は申告すればレシートに押印してもらえる

・押印済レシートとポイントカードを1ヶ月以内に持ってくればポイント記録される

・付与ポイントはレシートが発行された日時で記録される

・ポイント残高可算のバッチ処理では支払い日時が前日の分が対象

 

「支払日の翌日以降に付与ポイントが記録された場合。」(文字数24)

が正答だと思うが、物足りない気もする。「ポイントカードを忘れた会員が」などと書けばレシートへの押印に触れねばならないだろうから仕方ない。

 

設問3(2)

iTEC解答速報には異論がある。会員がポイントカードを忘れた場合でも、申告してレシートに押印してもらわなければ、ポイントは後付けできない。

 

日次バッチがどう修正されたかは想像するしかない。きっと「支払日時が前日の分」ではなく「支払日時が直近1ヶ月の分」を抽出するようにしたと思う。ポイント後付けの期日が1ヶ月だからだ。このように修正すると、ポイントを残高に可算済みかどうか判断するフラグが関連「支払」に必要となる。

 

解答は次のようになる。

「記録された付与ポイントがポイント残高に加算済みか判断する役割」

 

午後1問1の感想

解答用紙を見て記述量の多さに戦々恐々とした。実際、満点を目指すと絶対に時間が足りない。

 

設問1(1)のa, b, h, jは「明確に対応する1文」がなさそう。p10の(8)で「クーポンがどの支払で利用されたか分かるように記録する」とあったので空欄gに「支払方法コード」と記載した。しかし、p10の(5)には「クーポンには配布上限数と配布期間を設定」とある。空欄gは「配布上限数」で、空欄kが「支払方法コード」だとわかった。

空欄gに対応する設問文より前に、空欄kに対応する設問文を持ってこないでほしい。

何分かタイムロスが発生した。

 

設問2の関数従属の問題は定義を載せておいてほしい。あと、設問2(3)で正規化後の関係スキーマを手書きさせるのは鬼。書かせるならもっと属性名の画数を少なくしてほしい。

 

時間がかかるだけで、難易度はそこまで高くないと思う。時間がかかるだけで。