DBデータベーススペシャリスト試験 午後Ⅰ

平成23年度特別 データベーススペシャリスト 午後Ⅰ 問2

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問2 データベースの設計に関する次の記述を読んで,設問1~3に答えよ。 B社は,飲食店をチェーン展開している。これまでB社の各店舗では,来店者を増やすために,来店者数の少ない日には商品単価を下げたり,割引クーポンを発行したりしていたが,店舗での作業負担が大きいことから今回これらの点を含めてシステム化することにした。 〔業務の概要〕 1.商品 (1) 商品区分 商品は,単品商品と複合商品に区分する。 単品商品は,例えば,生ビール中ジョッキ,冷ややっこなどのように一つの商品が一つの飲食物に対応する。複合商品は,セット商品と一括商品に区分する。セット商品は,複数の単品商品を組み合わせた一つの商品である。一括商品は,宴会のコース料理のように1人ずつに提供する一連の単品商品を一つにまとめた商品である。 なお,セット商品の商品単価は,構成する単品商品の商品単価の合計よりも低く設定する。一つの単品商品が,複数のセット商品に組み込まれることはない。 (2) 商品提供時間と商品単価 ① 商品提供時間は,次のとおりである。 ・全店の営業時間は同じである。 ・“時間帯”は,営業時間を19時台,20時台のように,1時間刻みに分けたものである。 ・単品商品は,すべての時間帯で提供している。 ・セット商品と一括商品は,商品別に,提供する曜日,時間帯を限定している。 ② 商品単価は,次のとおりである。 ・すべての商品には,それぞれ一つの標準単価を設定する。 ・単品商品の一部に,店舗別曜日別時間帯別に変動単価を設定する。 ・一括商品の一部に,店舗別曜日別に変動単価を設定する。 ・セット商品には,変動単価を設定しない。 ・変動単価が設定された場合は,変動単価を標準単価に優先して適用し,変動単価が設定されない場合は,標準単価を適用する。 2.販売 (1) 割引クーポンの発行 販売促進のために割引クーポンを発行している。割引クーポンは来店時のグループ全員に有効で,割引クーポンの種類によらず,1回の来店でグループ当たり1枚使用できる。ただし,複合商品を構成する単品商品には割引クーポンは適用できない。 割引クーポンには,次の項目からなる利用条件を定め,一意なクーポン番号を付与する。 ・利用可能商品:一つ又は複数の単品商品 ・割引額:一つの割引額 ・有効期間(開始年月日~終了年月日):一つの有効期間 ・利用可能店舗:一つ又は複数の店舗 ・利用可能時間:利用可能な曜日ごとの複数の時間帯 割引クーポンは,必要な枚数が印刷される。割引クーポンの例を,図1に示す。 図1 割引クーポンの例 (2) 売上計上方法 ・来店したグループ(以下,利用客という)単位に,一つの売上伝票番号を付与する。 ・係員が利用客の注文を聞き始めてから,注文の内容確認後テーブルを離れるまでを,1回の“注文伺”という。注文伺開始時の時刻(時分秒)を当該注文伺の時刻とする。 ・一つの注文伺を構成する商品ごとの注文を,“注文”という。ただし,一つの注文伺の中で同じ商品が複数個注文された場合は,数量で管理する。 ・注文伺の後,既に売切れとなっていることが判明した商品については,利用客に説明して注文の取消しを行う。注文の取消しは,新たな注文伺の中で当該商品の数量をマイナスにする。一つの注文伺の中で,一つの商品が注文された後その場で取り消された場合は,注文がなかったものとする。 ・注文伺ごとに,注文伺内容,注文伺金額小計,及び利用金額合計を表示した注文伺明細を,利用客に提示する。1回の注文伺における注文伺明細の例を,図2に示す。図2は,前回の注文伺で受けた注文の取消しを含む追加注文伺明細の例である。 図2 1回の注文伺における注文伺明細の例 〔データベースの設計概要〕 〔業務の概要〕に対するデータベースの設計概要は,次のとおりである。 1.商品ごとの区分の設定 商品ごとに商品区分として,単複区分と複合区分を設定する。また,セット商品を除く商品について,商品単価の区分のために単価区分を設定する。各区分の取り得る値と意味を,表1に示す。 表1 各区分の取り得る値と意味 2.テーブルの構造 テーブルの構造を,図3に示す。 図3 テーブル構造(未完成) 〔セット商品扱いの対応〕 現在は,複数の単品商品の注文によって一つの売上伝票番号内でセット商品を構成する単品商品がそろった場合でも,単品商品として取り扱っている。システム化後は,このような場合には,自動的にセット商品が注文されたものとみなし(これを“セット商品扱い”という),単品商品の注文を取消し扱いにする。この場合,利用客からの注文とセット商品扱いを区別して,注文伺明細に表示する。セット商品扱いを含む注文伺明細の例を,図4に示す。 図4 セット商品扱いを含む注文伺明細の例(図2に続く注文伺明細) 解答に当たっては,巻頭の表記ルールに従うこと。 なお,テーブル構造の表記は,“関係データベースのテーブル(表)構造の表記ルール”を用いること。さらに,主キー及び外部キーを明記せよ。 設問1 図3中の“クーポン利用条件”テーブルについて,(1),(2)に答えよ。 (1) “クーポン利用条件”テーブルの候補キーを一つ示せ。 (2) “クーポン利用条件”テーブルを第3正規形の条件を満たすテーブルに分解せよ。 なお,テーブル名は本文中で与えられた語句を用いて,適切な名称にすること。 設問2 商品ごとの区分について,(1),(2)に答えよ。 (1) 図3中の“商品”テーブルにおける列“商品番号”,“商品名”,【a】,【b】及び【c】の値(一例)を表2に示す。 表2 “商品”テーブルにおける各列の値(一例) (a) 図3中の【a】~【c】に入れる適切な区分を次の①~③の中から選び,番号で答えよ。 ①:単複区分,②:複合区分,③:単価区分 (b) テーブル“商品提供時間”,“単品商品変動単価”,“一括商品変動単価”の外部キー“商品番号”は,“商品”テーブルの限定されたインスタンスを参照する。これらのテーブルの“商品番号”が“商品”テーブルを参照するとき,次に示す表3の決定表で各区分の条件を判定する。表3(1/2)の商品提供時間を例にして,表3(2/2)中の空欄をすべて埋めよ。 なお,存在しない区分の組合せも,決定表の列に含まれている。 表3(1/2) 決定表 表3(2/2) 決定表 (2) 図3中の【d】~【f】に入れる適切な列名を,本文中の用語を用いてすべて答えよ。 設問3 〔セット商品扱いの対応〕を行った場合の図3中の“売上明細”テーブルについて,(1),(2)に答えよ。 (1) 図3中の“売上明細”テーブルでは,セット商品扱いを想定した場合,問題点が二つある。それぞれの問題点について,40字以内で述べよ。 (2) “売上明細”テーブルに列を追加することで,(1)の問題点を解決することができる。このときの列の追加に関して,次の(a),(b)に答えよ。 (a) 列を追加した後のテーブル構造を答えよ。 (b) 追加列名とその列に設定する値の説明を答えよ。 なお,解答欄はすべて埋まるとは限らない。
図1 割引クーポンの例。焼き物○屋の割引クーポン。1枚でお1人様につき生ビール(中)又はハイボール1杯を200円引き(グループ様全員)、有効期間2011年2月1日~3月31日、利用可能店舗は新宿西口店・代々木店、利用可能時間は月曜全営業時間と火曜~木曜17時~20時、クーポン番号12345678とバーコード。
図1 割引クーポンの例。焼き物○屋の割引クーポン。1枚でお1人様につき生ビール(中)又はハイボール1杯を200円引き(グループ様全員)、有効期間2011年2月1日~3月31日、利用可能店舗は新宿西口店・代々木店、利用可能時間は月曜全営業時間と火曜~木曜17時~20時、クーポン番号12345678とバーコード。
図2 1回の注文伺における注文伺明細の例。○○駅前店、2011年3月7日、売上伝票番号00153624、テーブルNo.12、人数4の注文伺明細。注文伺時刻19時18分48秒で、サバ塩焼き−1(−945円)、サンマ塩焼き、ごぼう巻き、特製サラダ各1。小計1,050円、利用金額合計7,035円。
図2 1回の注文伺における注文伺明細の例。○○駅前店、2011年3月7日、売上伝票番号00153624、テーブルNo.12、人数4の注文伺明細。注文伺時刻19時18分48秒で、サバ塩焼き−1(−945円)、サンマ塩焼き、ごぼう巻き、特製サラダ各1。小計1,050円、利用金額合計7,035円。
表1 各区分の取り得る値と意味。単複区分(全商品、1:単品商品・2:複合商品)、複合区分(全複合商品、1:セット商品・2:一括商品、対象外はNULL)、単価区分(全単品商品と全一括商品、1:変動単価を適用しない・2:変動単価を適用する、対象外はNULL)を示す表。
表1 各区分の取り得る値と意味。単複区分(全商品、1:単品商品・2:複合商品)、複合区分(全複合商品、1:セット商品・2:一括商品、対象外はNULL)、単価区分(全単品商品と全一括商品、1:変動単価を適用しない・2:変動単価を適用する、対象外はNULL)を示す表。
図3 テーブル構造(未完成)。店舗、時間帯、クーポン利用条件、商品(空欄a〜c)、複合商品組合せ、商品提供時間(空欄d)、単品商品変動単価(空欄e)、一括商品変動単価(空欄f)、売上、売上明細の各テーブル構造。主キーは実線下線、外部キーのクーポン番号は破線下線で示されている。
図3 テーブル構造(未完成)。店舗、時間帯、クーポン利用条件、商品(空欄a〜c)、複合商品組合せ、商品提供時間(空欄d)、単品商品変動単価(空欄e)、一括商品変動単価(空欄f)、売上、売上明細の各テーブル構造。主キーは実線下線、外部キーのクーポン番号は破線下線で示されている。
図4 セット商品扱いを含む注文伺明細の例(図2に続く注文伺明細)。注文伺時刻20時05分20秒の明細。くし焼き盛合せと玉子焼きを各1注文し、*印の玉子焼き・ごぼう巻き・特製サラダを各−1として、お手軽3点セット1,365円をセット商品扱いで計上。単品より210円安い旨を注記し、小計1,050円、合計8,085円。
図4 セット商品扱いを含む注文伺明細の例(図2に続く注文伺明細)。注文伺時刻20時05分20秒の明細。くし焼き盛合せと玉子焼きを各1注文し、*印の玉子焼き・ごぼう巻き・特製サラダを各−1として、お手軽3点セット1,365円をセット商品扱いで計上。単品より210円安い旨を注記し、小計1,050円、合計8,085円。
表2 “商品”テーブルにおける各列の値(一例)。商品番号1234〜4567の商品ア〜エについて、空欄a・b・c列の値を示す表。アは2,2,2、イは2,NULL,1、ウはNULL,1,2、エは1,NULL,1。
表2 “商品”テーブルにおける各列の値(一例)。商品番号1234〜4567の商品ア〜エについて、空欄a・b・c列の値を示す表。アは2,2,2、イは2,NULL,1、ウはNULL,1,2、エは1,NULL,1。
表3(1/2) 決定表。区分a・b・cの値の組合せ9列ごとに、商品提供時間が参照するかどうかを示す決定表。a=1、b=2、c=2の列だけがX、他は−。単品商品変動単価と一括商品変動単価の行は網掛けで表示されていない。
表3(1/2) 決定表。区分a・b・cの値の組合せ9列ごとに、商品提供時間が参照するかどうかを示す決定表。a=1、b=2、c=2の列だけがX、他は−。単品商品変動単価と一括商品変動単価の行は網掛けで表示されていない。
表3(2/2) 決定表。a・b・cが2/NULLを含む残り9列の組合せについて、商品提供時間、単品商品変動単価、一括商品変動単価の行が空欄になっている決定表。注記1にX:参照する、−:参照しない又は存在しない、注記2に網掛けは表示していない、とある。
表3(2/2) 決定表。a・b・cが2/NULLを含む残り9列の組合せについて、商品提供時間、単品商品変動単価、一括商品変動単価の行が空欄になっている決定表。注記1にX:参照する、−:参照しない又は存在しない、注記2に網掛けは表示していない、とある。
解き方のヒントを見る

項目が何で決まるかを見極める

データ設計の問題では、ある項目の値がどの項目の値によって決まるのかという依存の関係を、業務の説明に即して一つずつ確かめることが検討の出発点になります。思い込みではなく記述を根拠に判断しましょう。

この問題で問われていること

問われているのは個々の用語の暗記よりも、業務上のルールをデータの構造に落とし込むときの考え方です。一つの項目の値を決めるのに何が必要かを、業務の状況を具体的に思い浮かべながら確かめる姿勢が求められます。

視点

関係データベースの設計では、ある項目の値を知れば別の項目の値が一通りに定まるかどうか、という依存の関係が判断の土台になります。この関係は、項目の名前から一般論で決めるものではありません。同じ名前の項目でも、業務の運用しだいで決まり方が変わります。そのため、時点や条件が変わったときに値が変わりうるか、同じ値が複数の行に繰り返し現れないかを、業務の記述と照らして確かめることが大切です。

確認ポイント

  • 注目している項目の値が、どの項目の値の組合せで一通りに定まるのかを、業務の記述を根拠に確かめたか
  • 業務の条件や時点が変わったときに、その項目の値が変わりうるかどうかを具体的な場面で想像したか
  • 同じ内容が複数の箇所に重複して記録される状況が生じないかを、依存の関係から見直したか
正解と解説を見る

解説

飲食店の割引クーポン、変動単価、セット商品扱いを題材にしたテーブル設計の問題です。多値の利用条件を含む表の候補キーと正規化、区分値の組合せ(NULLを含む)による参照先の限定、セット商品扱いで売上明細の主キーが重複する問題と区分列の追加による解決が問われています。採点講評では、候補キーをクーポン番号だけと答えた解答、決定表で存在しない組合せを『参照する』とした解答、設問3(1)で問題点を片方しか挙げていない解答が多かったと指摘されています。

問題の全体像

B社は飲食店チェーンで、これまで店舗の手作業で行っていた変動単価と割引クーポンの運用をシステム化します。商品は単品商品と複合商品(セット商品・一括商品)に分かれます。標準単価のほかに、単品商品には店舗別曜日別時間帯別、一括商品には店舗別曜日別の変動単価があります。セット商品と一括商品は、提供する曜日と時間帯が限られています。クーポンには、利用可能商品・店舗・時間が複数あり得る利用条件が付きます。売上は注文伺単位で明細を記録します。公式解答例の出題趣旨では、利用条件が限られるサービスのテーブル実装や、区分値による商品特性の定義を通して、業務要件の分析力とテーブル設計の能力を問うとされています。設問1はクーポン利用条件テーブルの候補キーと正規化、設問2は商品の区分値と各変動単価テーブルの設計、設問3はセット商品扱いを入れたときの売上明細テーブルの問題点と改善を扱います。

設問1(1)

〔業務の概要〕2.(1)の利用条件に着目します。割引額と有効期間はクーポンごとに『一つ』ですが、利用可能商品と利用可能店舗は『一つ又は複数』、利用可能時間は『曜日ごとの複数の時間帯』です。つまり、クーポン番号が一つ決まっても、商品番号・店舗番号・曜日・時間帯番号は複数の値を取ります。図3のクーポン利用条件テーブルは、これらを一つの表に並べているため、行を一意に識別するにはクーポン番号に加えて商品番号、曜日、時間帯番号、店舗番号のすべてが必要です。公式解答例でも候補キーは{クーポン番号、 商品番号、 曜日、 時間帯番号、 店舗番号}です。採点講評では、『クーポン番号』だけを答えた解答が多く、正答率が低かったとされています。クーポン番号は一意でも、この表の行を一意にするわけではない点に注意しましょう。

設問1(2)

(1)の候補キーのうち、クーポン番号だけで開始年月日、終了年月日、割引額が決まります。これは候補キーの一部への関数従属(部分関数従属)なので、この表は第2正規形も満たしていません。そこで、これらをクーポン番号を主キーとする表に分け、本文の語句を使って『クーポン割引額有効期間(クーポン番号、 開始年月日、 終了年月日、 割引額)』のように命名します。残りは全属性がキーの表になります。公式解答例では、これを『クーポン利用可能商品店舗時間(クーポン番号、 商品番号、 店舗番号、 曜日、 時間帯番号)』の1表のまま残す解答と、商品・時間・店舗の独立した多値性に着目して『クーポン利用可能商品(クーポン番号、 商品番号)』『クーポン利用可能時間(クーポン番号、 曜日、 時間帯番号)』『クーポン利用可能店舗(クーポン番号、 店舗番号)』の3表に分ける解答の、どちらも示されています。曜日と時間帯番号は『曜日ごとの時間帯』として組で意味を持つので、同じ表に置きます。採点講評では、正答率は高く、候補キーがつかみにくい場合は第3正規形に分解して考えるのも有効だとされています。

設問2(1)(a)a

表1の区分と表2の値を照らし合わせます。表1では、単複区分は全商品が対象なのでNULLになりません。複合区分は単品商品のとき、単価区分はセット商品のときNULLです。表2の列aは、商品ウ(b=1、c=2)でNULLです。列cがNULLを持たないので単複区分、列bの1はセット商品と読み取れます。つまり、ウはセット商品であり、セット商品でNULLになるのは単価区分です。ほかの行でもaは1か2のいずれかで、変動単価の適用有無として矛盾しません。したがって公式解答例のとおり、aは③単価区分です。

設問2(1)(a)b

列bは、商品イとエでNULL、アで2、ウで1です。イとエは列cが1、つまり単品商品です。単品商品のときNULLになるのは、全複合商品だけが対象の複合区分です。また、値1と2がそれぞれセット商品と一括商品に当たり、アは一括商品、ウはセット商品と解釈できます。したがって公式解答例のとおり、bは②複合区分です。

設問2(1)(a)c

列cはどの行でもNULLにならず、値は1か2です。全商品が対象で、1:単品商品、2:複合商品を表す単複区分に当たります。列bがNULL(単品)の行ではcが1、列bに値がある(複合)行ではcが2となっており、整合します。したがって公式解答例のとおり、cは①単複区分です。

設問2(1)(b)

まず、実際に存在する区分の組合せを整理します(a=単価区分、b=複合区分、c=単複区分)。単品商品は(a=1または2、 b=NULL、 c=1)、セット商品は(a=NULL、 b=1、 c=2)、一括商品は(a=1または2、 b=2、 c=2)です。これ以外の組合せは存在しません。次に参照先を当てはめます。商品提供時間は、提供する曜日・時間帯が限られるセット商品と一括商品が参照します。表3(1/2)では一括商品で変動単価なし(1、2、2)の列にXが付いています。単品商品変動単価は、変動単価を適用する単品商品(2、NULL、1)だけが参照します。一括商品変動単価は、変動単価を適用する一括商品(2、2、2)だけが参照します。そのため、表3(2/2)の各列は公式解答例のとおりになります。(2、2、2)は一括商品で変動単価を適用するので、商品提供時間X、単品商品変動単価-、一括商品変動単価Xです。(2、NULL、1)は変動単価を適用する単品商品なので、単品商品変動単価だけXです。(NULL、1、2)はセット商品なので、商品提供時間だけXです。(2、NULL、2)、(NULL、1、1)、(NULL、2、1)、(NULL、2、2)、(NULL、NULL、1)、(NULL、NULL、2)は存在しない組合せなので、すべて-です。採点講評では、存在しない列にXを付けた解答が多かったと指摘されています。商品区分に基づいて分類すれば、存在しない列ははっきりするはずです。

設問2(2)d

〔業務の概要〕1.(2)①に『セット商品と一括商品は、商品別に、提供する曜日、時間帯を限定している』とあります。商品ごとに提供できる曜日と時間帯の組を複数持つので、商品提供時間テーブルには曜日と時間帯番号を追加し、商品番号とともに主キーにします。時間帯は図3の時間帯テーブルの時間帯番号で表します。公式解答例では、dは『曜日、 時間帯番号』(いずれも主キーの一部)です。

設問2(2)e

本文に『単品商品の一部に、店舗別曜日別時間帯別に変動単価を設定する』とあります。変動単価を一意に決めるには、商品番号に加えて店舗番号、曜日、時間帯番号が必要です。これらを主キーにして、従属する属性として変動単価を持たせます。公式解答例では、eは『店舗番号、 曜日、 時間帯番号、 変動単価』で、変動単価以外が主キーの一部です。

設問2(2)f

一括商品の変動単価は『店舗別曜日別』に設定され、時間帯別ではありません。そのため、主キーは商品番号・店舗番号・曜日で、非キー属性が変動単価になります。単品商品変動単価と違って時間帯番号を含めないのがポイントです。公式解答例では、fは『店舗番号、 曜日、 変動単価』です。

設問3(1)①

売上明細の主キーは{店舗番号、 売上伝票番号、 注文伺時分秒、 商品番号}です。図4の20時05分20秒の注文伺では、利用客が注文した『玉子焼き 1』と、セット商品扱いによる『*玉子焼き −1』が同じ注文伺の中に並んでいます。どちらも注文伺時分秒と商品番号が同じなので、主キーの値が重複します。また、その場の取消しは注文がなかったものとするルールがありますが、セット商品扱いの行を差し引きして消すこともできません。公式解答例は、『1回の注文伺時分秒で同じ商品番号が発生する場合があり一意性制約違反となる』という趣旨です。40字以内に収めるには、『同一注文伺時分秒で同じ商品番号の行が生じる』ことと『主キーの一意性制約違反』の2点を入れます。

設問3(1)②

〔セット商品扱いの対応〕に、『利用客からの注文とセット商品扱いを区別して、注文伺明細に表示する』とあります。しかし図3の売上明細には、数量のマイナスが売切れによる取消し(図2のサバ塩焼き−1)なのか、セット商品扱いによる取消し扱い(図4の*印の行)なのかを見分ける列がありません。セット商品のプラス行も、利用客の注文なのかセット商品扱いなのかを区別できません。公式解答例は、『利用客からの注文、売切れによる取消とセット商品扱いを区別できない』という趣旨です。採点講評では、主キーの一意性制約違反と区別不能の二点を求めたのに、片方しか書いていない解答が多かったとされています。一つ目がキーの観点なら、二つ目は業務表示の観点というように、観点を変えて検討することが大切です。

設問3(2)(a)

(1)の二つの問題は、行の種類を表す区分列を一つ追加し、それを主キーに含めれば同時に解決できます。区分が異なれば、同じ注文伺時分秒・同じ商品番号でも別の行として識別できるので一意性が保たれます。区分の値から明細の種類も判別できます。公式解答例では、『売上明細(店舗番号、 売上伝票番号、 注文伺時分秒、 商品番号、 数量、 販売単価、 クーポン番号、 セット商品扱い区分)』とし、店舗番号・売上伝票番号・注文伺時分秒・商品番号・セット商品扱い区分を主キー(実線下線)、クーポン番号を外部キー(破線下線)として表記しています。問題文にあるとおり、主キーと外部キーの明記を忘れないようにしましょう。

設問3(2)(b)

公式解答例では、追加列名は『セット商品扱い区分』です。設定する値の説明は、『利用客からの注文、売切れによる取消とセット商品扱いを区別する区分』とされています。説明には、利用客からの注文、売切れによる取消し、セット商品扱いの三種類を識別することを明示します。解答欄は複数ありますが、公式解答例で追加する列は一つだけで、すべての欄が埋まるとは限りません。

学習のポイント

『一つ又は複数』という記述から多値属性を見つけて候補キーを組み立てる力、区分値とNULLの組合せから実在する商品種別を列挙する力、例示された帳票から主キー重複を検出する力を重点的に鍛えましょう。

出典:独立行政法人 情報処理推進機構(IPA)平成23年度特別 データベーススペシャリスト試験 午後Ⅰ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針