応用情報技術者過去問題 平成24年秋期 午後問6

⇄問題文と設問を画面2分割で開く⇱問題PDF

問6 データベース

スーパーマーケットの販売管理システムに関する次の記述を読んで,設問1~5に答えよ。

 スーパーマーケットを営むQ社では,3年前にポイント制度を導入した。希望する顧客には,会員になってもらい,ポイントカードを提供する。買物の際にポイントカードを提示すると,100円につき1ポイントを加算する。たまったポイントは1ポイントにつき1円の換算で,精算の際に利用できる。ポイントの有効期限は,最後にポイントカードを使用した日から2年間である。
 Q社の販売管理システムでのポイント制度に関係する部分のE-R図を図1に示す。
pm06_1.gif/image-size:500×497
 E-R図に対応する関係データベースのテーブル構造を図2に示す。実線の下線は主キーを表す。
pm06_2.gif/image-size:348×110
 会員でない顧客が購入した場合は,テーブル"売上"の列"会員コード"にはNULLが設定される。会員になっても,一度も購入しない場合もあり得る。
 商品は,いずれかの商品種別に分類されるが,商品が存在しない商品種別もあり得る。商品の単価は,頻繁に変更される。

〔ポイント制度の改良〕
 最近,競合する他のスーパーマーケットでもポイント制度を導入し,そちらのポイント制度の方が魅力的との評判で,売上を伸ばしている。そこで,Q社では,ポイント制度を会員にとって,より魅力的なものに改良し,売上の増加を図ることにした。検討の結果,次の仕様を追加することにした。
  • マイレージサービス
     会員の購入累計額に応じて,精算時に加算するポイントを整数倍する。この倍率をマイレージ倍率といい,例えば,"購入累計額が50万円以上だと2倍,100万円以上だと3倍"といった具合にして決定する。
     購入累計額は,その年の1月1日からの購入金額の合計とする。年初におけるマイレージ倍率の初期値は,前年の購入累計額から決定する。買物での精算の際にその年の購入累計額が,現在のマイレージ倍率よりも大きくなる金額に達したら,マイレージ倍率を更新し,次回の精算からは,新しいマイレージ倍率を適用する。
  • タイムサービス
     特定の曜日,時間帯に,特定の商品種別の商品を購入すると,その商品の購入金額に対して付与するポイントを整数倍する。この倍率をタイムサービス倍率という。例えば,"日曜日の午前中は日用品のポイントを5倍にする"などの指定が可能である。設定の見直しと変更は随時行われる。
 これらの仕様を追加するために,現行データベースのテーブルに必要な列を追加するとともに,図3に示すテーブルを新たに追加した。
pm06_3.gif/image-size:425×66

設問1

図1中のacに入れる適切なリレーションシップを答え,E-R図を完成させよ。図1の表記ルールに従って解答すること。

解答入力欄

  • a:(図表で回答する問題のため解答入力欄はありません。)
  • b:(図表で回答する問題のため解答入力欄はありません。)
  • c:(図表で回答する問題のため解答入力欄はありません。)

解答例・解答の要点

  • a:pm06_4.gif/image-size:77×13
  • b:pm06_5.gif/image-size:77×13
  • c:pm06_6.gif/image-size:77×12

解説

関係データベースのテーブル構造において、主キーと外部キーの関係になっている2つの表があるとき、その表に対応するエンティティのカーディナリティ(多重度)は主キー側"1"、外部キー側"多"とした"1対多"の関係になります。図2のテーブル構造を見ると、以下の4つの"1対多"の関係があることがわかります。
  • 会員コードで関連付けられている、売上エンティティ(1)と会員エンティティ(多)
  • 売上番号で関連付けられている、売上エンティティ(1)と売上明細エンティティ(多)
  • 商品コードで関連付けられている、商品エンティティ(1)と売上明細エンティティ(多)
  • 商品種別コードで関連付けられている、商品種別エンティティ(1)と商品エンティティ(多)
pm06_7.gif/image-size:373×213
aについて〕
会員エンティティ側が主キー、売上エンティティ側が外部キーなので矢印は「→」となります。本文中には「会員でない顧客が購入した場合は,テーブル"売上"の列"会員コード"にはNULLが設定される。会員になっても,一度も購入しない場合もあり得る。」とあり、どの会員エンティティとも紐づかない売上エンティティ、およびどの売上エンティティとも紐づかない会員エンティティが存在し得ることがわかります。したがって、両側とも○が付きます。

apm06_4.gif/image-size:77×13

bについて〕
商品エンティティ側が主キー、売上明細エンティティ側が外部キーなので矢印は「←」となります。売上明細は実際に売れた商品の情報ですので必ずいずれかの商品エンティティと紐づけられる一方、新規商品などでまだ1つも売れていない場合には商品エンティティがどの売上明細とも紐づいていない状況もあり得ます。よって、売上明細側には○、商品側には●が付きます。

bpm06_5.gif/image-size:77×13

cについて〕
商品種別エンティティ側が主キー、商品エンティティ側が外部キーなので矢印は「←」となります。本文中には「商品は,いずれかの商品種別に分類されるが,商品が存在しない商品種別もあり得る。」とあるので、商品エンティティは必ずいずれかの商品種別エンティティに紐づく一方、どの商品エンティティとも紐づいていない商品種別エンティティが存在し得ることがわかります。よって、商品側には○、商品種別側には●が付きます。

cpm06_6.gif/image-size:77×12

設問2

テーブル"売上明細"には,列"単価"がある。列"単価"をもたずに,列"商品コード"からテーブル"商品"の列"単価"を参照する方法も考えられるが,あえて列"単価"をもつ目的を25字以内で述べよ。

解答入力欄

解答例・解答の要点

  • 売上が発生した時点の単価を記録するため (19文字)

解説

本文中には「商品の単価は,頻繁に変更される。」とあり、商品テーブルには商品の最新の単価しか保持されていません。売上金額などを計算するためには商品が購入されたときの単価が必要ですが、もしテーブル"商品"にしか単価を保持していないと、過去の売上金額についても現時点の単価でしか計算できなくなってしまいます。テーブル"売上明細"に列"単価"を持たせているのは、販売時点の商品単価を記録しておくためです。

∴売上が発生した時点の単価を記録するため

設問3

〔ポイント制度の改良〕(1)に対応するために,テーブル"会員"に追加する必要がある全ての列を,本文又は図中の字句を用いて答えよ。
 なお,精算時の処理時間が長くならないように考慮すること。

解答入力欄

解答例・解答の要点

  • 購入累計額,マイレージ倍率

解説

マイレージサービスを実現するには、顧客ごとのマイレージ倍率の情報が必要で、マイレージ倍率は前年と本年の購入累計額によって決まります。いくつかの実装が考えれますが、設問の「精算時の処理時間が長くならないように考慮すること」という条件を考慮すると、ある程度絞られてきます。

マイレージ倍率の使用場面は、顧客が購入したタイミングです。購入の度に本年の購入累計額を集計することも考えられますが、"会員"・"売上"・"売上明細"を結合して集計するので処理時間が長くなってしまいます。それよりも会員ごとに列"マイレージ倍率"をもたせて、それを参照するだけの方が無駄が少ないです。
別の方法として、列として"前年の購入累計額"と"(本年)購入累計額"の両方をもたせ、2つの金額から購入の都度マイレージ倍率を算定するという実装もあります。これは購入累計額を集計するよりは処理負荷が少ないですが、①"前年の購入累計額"と"(本年の)購入累計額"の少ない方を決める、②該当する金額区分を調べる、③テーブル"マイレージサービス"からマイレージ倍率を取得するというプロセスが必要で、やはり列"マイレージ倍率"をもたせて単に参照する場合と比較して処理時間が長くなります。
さらに、問題文には「清算の際に,…マイレージ倍率を更新し,次回の精算からは,新しいマイレージ倍率を適用する」と記載されており、マイレージ倍率を保持する属性が存在することを暗に示しています。よって、1つ目の列は"マイレージ倍率"となります。

前述のとおり、マイレージサービスでは「清算の際に,…マイレージ倍率を更新し,次回の精算からは,新しいマイレージ倍率を適用する」ことになっています。マイレージ倍率は購入累計額が一定の金額を超えたときにアップするので、この更新処理では購入累計額を参照する必要があります。こちらについても毎回集計すると処理時間が長くなってしまうので、顧客ごとに購入累計額の情報をもたせておいて、①購入の際にその購入金額を加算する、②一定金額を超えたらマイレージ倍率を更新するとした方が処理時間の面から有利です。

なお、列"購入累計額"だけをもたせ、購入の都度、テーブル"マイレージサービス"からマイレージ倍率を取得するという方法の場合、年初のマイレージ倍率を保持することができません。したがって両方の列が必要です。

∴購入累計額,マイレージ倍率

設問4

〔ポイント制度の改良〕(2)に対応するために,図3中のdに入れる列を,本文又は図中の字句を用いて答えよ。列が主キーの一部となる場合は,実線の下線を付けること。
(※正誤判定の都合上、主キー属性は{属性名}と入力してください)

解答入力欄

  • d:

解答例・解答の要点

  • d:商品種別コード

解説

dについて〕
〔ポイント制度の改良〕(2)タイムサービスには「特定の曜日,時間帯に,特定の商品種別の商品を購入すると,その商品の購入金額に対して付与するポイントを整数倍する。この倍率をタイムサービス倍率という。」とあり、タイムサービス倍率は曜日、時間帯、商品種別によって識別されることがわかります。図3のタイムサービステーブルには商品種別を表す列がないので追加する必要があります。

追加される列"商品種別コード"は、テーブル"タイムサービス"のレコードを一意に決めるために必要な主キーの一部、かつ、テーブル"商品種別"の主キーを参照する外部キーです。図2のテーブル"売上明細"の列"売上番号"の表記を見るとわかるように、主キーかつ外部キーであるときには主キーを表す下線のみを付けるのが一般的なルールなので、空欄には「商品種別コード」が当てはまります。

d商品種別コード

設問5

マーケティング部門から,"〔ポイント制度の改良〕(2)で導入するタイムサービス倍率と商品の販売数量との相関関係を分析したい"と要求された。この分析を効率よく行うには,どのテーブルにどのような列を追加する必要があるか。本文又は図中の字句を用いて答えよ。

解答入力欄

  • テーブル:
  • 列:

解答例・解答の要点

  • テーブル:売上明細
  • 列:タイムサービス倍率

解説

本文中にはタイムサービスについて「設定の見直しと変更は随時行われる」と記載されています。テーブル"タイムサービス"には、曜日と時間帯だけしか情報がなく、いつからいつまでそのタイムサービスが適用されていたかを知る術はありません。また、売上日時をもとに曜日と時間帯で集計しても、その当時適用していたタイムサービス倍率はわかりません。したがって、図2、図3のテーブル構造ではタイムサービス倍率と販売数量の相関分析を行うことは不可能です。

この問題を解決するには、設問2の単価と同じ考え方で、販売時点で適用されていたタイムサービス倍率を売上明細ごとにもたせることが考えられます。したがって、答えはテーブル「売上明細」に列「タイムサービス倍率」を追加するです。

∴テーブル:売上明細、列:タイムサービス倍率
問6成績

平成24年秋期 午後問題一覧

問1 問2 問3 問4 問5 問6 問7 問8 問9 問10 問11 問12 採点講評
© 2010-2024 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop