データベーススペシャリスト試験 2011年 午後102


データベースの設計に関する次の記述を読んで、設問1〜3に答えよ。

   B社は,飲食店をチェーン展開している。 これまでB社の各店舗では,来店者を増やすために、来店者数の少ない日には商品単価を下げたり,割引クーポンを発行したりしていたが、店舗での作業負担が大きいことから今回これらの点を含めてシステム化することにした。  
〔業務の概要〕 1.商品  (1) 商品区分   商品は,単品商品と複合商品に区分する。   単品商品は,例えば, 生ビール中ジョッキ,冷ややっこなどのように一つの商品が一つの飲食物に対応する。 複合商品は, セット商品と一括商品に区分する。セット商品は,複数の単品商品を組み合わせた一つの商品である。 一括商品は,宴会のコース料理のように 1 人ずつに提供する一連の単品商品を一つにまとめた商品である。   なお、セット商品の商品単価は,構成する単品商品の商品単価の合計よりも低く設定する。一つの単品商品が, 複数のセット商品に組み込まれることはない。  (2) 商品提供時間と商品単価   ① 商品提供時間は,次のとおりである。    ・全店の営業時間は同じである。    ・“時間帯”は,営業時間を19時台, 20時台のように, 1時間刻みに分けたものである。    ・単品商品は、すべての時間帯で提供している。    ・セット商品と一括商品は,商品別に、提供する曜日、時間帯を限定している。   ② 商品単価は,次のとおりである。    ・すべての商品には, それぞれ一つの標準単価を設定する。    ・単品商品の一部に,店舗別曜日別時間帯別に変動単価を設定する。    ・一括商品の一部に,店舗別曜日別に変動単価を設定する。    ・セット商品には, 変動単価を設定しない。    ・変動単価が設定された場合は,変動単価を標準単価に優先して適用し,変動単価が設定されない場合は,標準単価を適用する。
2.販売  (1) 割引クーポンの発行   販売促進のために割引クーポンを発行している。 割引クーポンは来店時のグループ全員に有効で,割引クーポンの種類によらず,1回の来店でグループ当たり1枚使用できる。ただし, 複合商品を構成する単品商品には割引クーポンは適用できない。   割引クーポンには,次の項目からなる利用条件を定め、一意なクーポン番号を付与する。   ・利用可能商品: 一つ又は複数の単品商品   ・割引額 : 一つの割引額   ・有効期間(開始年月日〜終了年月日):一つの有効期間   ・利用可能店舗: 一つ又は複数の店舗   ・利用可能時間: 利用可能な曜日ごとの複数の時間帯    割引クーポンは,必要な枚数が印刷される。 割引クーポンの例を、図1に示す。
データベーススペシャリスト試験(平成23年 午後I 問2 図1)
(2) 売上計上方法  ・来店したグループ (以下, 利用客という) 単位に,一つの売上伝票番号を付与する。  ・係員が利用客の注文を聞き始めてから、注文の内容確認後テーブルを離れるまで、1回の“注文伺” という。注文伺開始時の時刻 (時分秒)を当該注文伺の時刻とする。  ・一つの注文を構成する商品ごとの注文を, “注文” という。 ただし,一つの注文伺の中で同じ商品が複数個注文された場合は,数量で管理する。  ・注文伺の後,既に売切れとなっていることが判明した商品については,利用客に説明して注文の取消しを行う。 注文の取消しは、新たな注文同の中で当該商品の数量をマイナスにする。 一つの注文伺の中で,一つの商品が注文された後その場で取り消された場合は、注文がなかったものとする。  ・注文伺ごとに,注文同内容,注文同金額小計, 及び利用金額合計を表示した注文伺明細を,利用客に提示する。 1回の注文何における注文伺明細の例を,図2に示す。図2は、前回の注文同で受けた注文の取消しを含む追加注文伺明細の例である。   データベーススペシャリスト試験(平成23年 午後I 問2 図2)
〔データベースの設計概要〕  〔業務の概要〕に対するデータベースの設計概要は,次のとおりである。
1.商品ごとの区分の設定  商品ごとに商品区分として, 単複区分と複合区分を設定する。また、セット商品を除く商品について、商品単価の区分のために単価区分を設定する。各区分の取り得る値と意味を、表1に示す。
データベーススペシャリスト試験(平成23年 午後I 問2 表1)   2.テーブルの構造  テーブルの構造を、図3に示す。   データベーススペシャリスト試験(平成23年 午後I 問2 図3)
〔セット商品扱いの対応〕  現在は、複数の単品商品の注文によって一つの売上伝票番号内でセット商品を構成する単品商品がそろった場合でも, 単品商品として取り扱っている。 システム化後は,このような場合には,自動的にセット商品が注文されたものとみなし(これを“セット商品扱い”という), 単品商品の注文を取消し扱いにする。 この場合、利用客からの注文とセット商品扱いを区別して, 注文伺明細に表示する。 セット商品扱いを含む注文明細の例を、図4に示す。
データベーススペシャリスト試験(平成23年 午後I 問2 図4)
 解答に当たっては、巻頭の表記ルールに従うこと。  なお,テーブル構造の表記は,“関係データベースのテーブル (表) 構造の表記ルール”を用いること。 さらに, 主キー及び外部キーを明記せよ。

設問1(1)図3中の“クーポン利用条件”テーブルについて,(1),(2)に答えよ。

“クーポン利用条件” テーブルの候補キーを一つ示せ。
模範解答
クーポン番号,商品番号,曜日,時間帯番号,店舗番号
解説

1. キーワード・論点の整理

本問のポイントは「クーポン利用条件」テーブルから候補キーを抽出することです。
まず、候補キーに関する用語を整理します。
用語意味
主キーテーブル内の各レコードを一意に識別する属性(または属性の組合せ)
候補キー主キーになり得る属性の組合せ。重複なくレコードを一意に特定できるもの全てを指す
次に、「クーポン利用条件」テーブルの構造を確認します。
カラム名意味
クーポン番号割引クーポンを一意に識別する番号
商品番号利用可能商品(単品商品)の識別番号
開始年月日クーポンの有効期間開始日
終了年月日クーポンの有効期間終了日
曜日クーポンが利用できる曜日
時間帯番号クーポンが利用できる時間帯(時間帯テーブルへの参照)
店舗番号クーポンが利用できる店舗(店舗テーブルへの参照)
割引額クーポン利用時の割引額

2. 解答根拠の論理的説明

模範解答として示された候補キーは
「クーポン番号,商品番号,曜日,時間帯番号,店舗番号」
です。なぜこれらの組合せで一意となるのか、問題文の記述を引用しながら説明します。
  1. クーポン番号
    問題文にある通り、
    「割引クーポンには…一意なクーポン番号を付与する」
    とあるため、クーポン番号単体では“どのクーポンか”は特定できますが、そのクーポンでどの条件に該当するか(商品・曜日・時間帯・店舗)は特定できません。
  2. 利用可能商品(商品番号)
    「利用可能商品: 一つ又は複数の単品商品」
    より、クーポンごとに複数の商品番号が割り当てられる可能性があります。よって商品番号をキーに含めておかないと、同じクーポン番号で複数レコードが区別できません。
  3. 利用可能日時(曜日 + 時間帯番号)
    「利用可能時間: 利用可能な曜日ごとの複数の時間帯」
    とあるため、同じクーポン番号・同じ商品番号でも、“月曜は17–18時” と “火曜は18–19時” のように複数行が存在します。
    • 曜日:週のどの日か
    • 時間帯番号:1時間刻みの時間帯
  4. 利用可能店舗(店舗番号)
    「利用可能店舗: 一つ又は複数の店舗」
    より、クーポン毎に複数の店舗が設定される可能性があるため、店舗番号もキーに含める必要があります。
以上をまとめると、1つのレコードを一意に識別するためには
「クーポン番号 + 商品番号 + 曜日 + 時間帯番号 + 店舗番号」
の組合せが必要となります。

3. 受験者が誤りやすいポイント

  1. 開始年月日・終了年月日をキーに含める
    ‒ 有効期間はクーポン番号単位で固定の範囲なので、各行で同じ値となる。
    ‒ そのためキーには含めず、属性として管理すれば十分です。
  2. 割引額をキーに含める
    ‒ 割引額も属性値であり、同じクーポン番号・商品番号などで同一。キーとして重複排除には寄与しません。
  3. 時間帯番号だけで時間を特定できると誤解する
    ‒ “曜日” が抜けていると「月曜20時台」と「火曜20時台」を区別できず一意性が保てません。

4. 試験対策として押さえるべき知識

  • 候補キー/主キー
    候補キーは「テーブル内で重複なくレコードを識別する属性の組合せ」を指し,そこから適切に主キーを選択します。
  • 多対多(1つ又は複数)→キー設計
    1つのクーポンに対して「複数の商品」「複数の店舗」「複数の時間帯」がある場合,これら全ての属性をキーに含めないと一意性は担保できません。
  • 属性とキーの区別
    同一レコード内で全て同じ値となる属性(有効期間など)はキーに含めず,更新対象の属性として扱うのが正しい設計です。
  • 論理モデルの正規化
    正規化の視点からも,重複した属性をキーに組み込むのではなく,「識別に必要十分な最小単位」をキーとすることで,冗長性を抑えられます。
以上を押さえることで,「クーポン利用条件」テーブルに限らず,様々な業務要件に対して適切なキー設計が行えるようになります。

設問1(2)図3中の“クーポン利用条件”テーブルについて,(1),(2)に答えよ。

“クーポン利用条件” テーブルを第3正規形の条件を満たすテーブルに分解せよ。  なお,テーブル名は本文中で与えられた語句を用いて,適切な名称にすること。
模範解答
クーポン割引額有効期間(クーポン番号,開始年月日,終了年月日,割引額) クーポン利用可能商品(クーポン番号商品番号) クーポン利用可能時間(クーポン番号曜日時間帯番号) クーポン利用可能店舗(クーポン番号店舗番号
又は
クーポン割引額有効期間(クーポン番号,開始年月日,終了年月日,割引額) クーポン利用可能商品店舗時間(クーポン番号商品番号店舗番号曜日時間帯番号
解説

1. キーワード・論点整理

  • 主キーと属性群の関係(関数従属性)
    元の“クーポン利用条件”テーブルは
    (クーポン番号, 商品番号, 開始年月日, 終了年月日, 曜日, 時間帯番号, 店舗番号, 割引額)
    という8属性を持っています。
  • 部分関数従属の排除
    一つのクーポン番号に対して「割引額」「開始年月日」「終了年月日」は常に同じ値を持つため、
    (クーポン番号)→(割引額, 開始年月日, 終了年月日)
    という部分従属が生じています。
  • 多値属性・繰り返し属性の分離
    「利用可能商品」「利用可能店舗」「利用可能時間(曜日+時間帯)」はいずれも1つのクーポンにつき複数行で管理され得るため、別テーブルに分ける必要があります。
  • 第3正規形(3NF)の要件
    1. 第2正規形を満たす(主キーの部分集合に従属する属性を排除)
    2. 非キー属性間の推移的関数従属を排除

2. 解答の論理的説明

  1. 【問題文引用】
    「割引クーポンには,次の項目からなる利用条件を定め、一意なクーポン番号を付与する。
    ・利用可能商品: 一つ又は複数の単品商品
    ・割引額 : 一つの割引額
    ・有効期間(開始年月日〜終了年月日):一つの有効期間
    ・利用可能店舗: 一つ又は複数の店舗
    ・利用可能時間: 利用可能な曜日ごとの複数の時間帯」
    この記述から、
    • 割引額, 有効期間 は「1クーポン番号⇔1値」の1対1対応
    • 利用可能商品, 利用可能店舗, 利用可能時間 は「1クーポン番号⇔複数行」の1対多対応
      であることがわかります。
  2. 【部分従属の検出】
    • 元テーブルの主キーを (クーポン番号, 商品番号, 曜日, 時間帯番号, 店舗番号) とすると、
      • 割引額, 開始年月日, 終了年月日は クーポン番号のみによって決まる(部分従属)。
    • 3NF化のためには、これらをクーポン番号に対する関数従属性の塊として切り出します。
  3. 【各テーブルの役割】
    • クーポン割引額有効期間
      クーポン番号ごとの固定情報「割引額」「開始年月日」「終了年月日」を扱う
    • クーポン利用可能商品
      クーポンごとに“どの商品”に適用できるかを扱う
    • クーポン利用可能時間
      クーポンごとに“どの曜日・時間帯”に適用できるかを扱う
    • クーポン利用可能店舗
      クーポンごとに“どの店舗”で適用できるかを扱う

3. 正規化後のテーブル構造例

テーブル名主キー属性
クーポン割引額有効期間クーポン番号割引額, 開始年月日, 終了年月日
クーポン利用可能商品(クーポン番号, 商品番号)
クーポン利用可能時間(クーポン番号, 曜日, 時間帯番号)
クーポン利用可能店舗(クーポン番号, 店舗番号)
Markdown表記例:
クーポン割引額有効期間
クーポン番号 (PK)開始年月日終了年月日割引額
123456782011-02-012011-03-31200
クーポン利用可能商品
クーポン番号 (PK)商品番号 (PK)
123456781001
123456781002
クーポン利用可能時間
クーポン番号 (PK)曜日 (PK)時間帯番号 (PK)
123456781
123456782
クーポン利用可能店舗
クーポン番号 (PK)店舗番号 (PK)
1234567810
1234567811

4. 受験者が誤りやすいポイント

  • 部分従属の見落とし
    「割引額」や「有効期間」を商品単位や店舗単位のキーに含めてしまい、同一クーポンで値が重複登録される設計をしてしまう。
  • 多値属性のまとめすぎ
    「利用可能商品・店舗・時間」を一つのテーブルにまとめて (クーポン番号, 商品番号, 店舗番号, 曜日, 時間帯番号) とすると、組み合わせの重複や拡張性が低下します。
  • 主キー設定ミス
    項目の組み合わせを正しく主キーに指定せず、重複データが発生する。

5. 試験対策としてのまとめ

  • 正規化の手順は
    1. 第1正規形:全ての属性を原子値とする
    2. 第2正規形:主キーの部分集合に従属する属性を排除する
    3. 第3正規形:非キー属性間の推移的従属を排除する
  • **機能従属性(FD)**を洗い出し、テーブル分割の根拠とする
  • 「1対多」関係の多値属性は別テーブルへ分離し、かつ適切な複合主キーを設定
  • 問題文の用語(ここでは“利用可能商品”など)をそのままテーブル/カラム名に使うと、採点者に意図が伝わりやすいです。

設問2(1)商品ごとの区分について, 1),(2)に答えよ。

図3中の“商品” テーブルにおける列 “商品番号”,“商品名”,(a),(b)及び(c)の値(一例)を表2に示す。 データベーススペシャリスト試験(平成23年 午後I 問2 表2)
 (a)図3 中の(a)〜(c)に入れる適切な区分を次の①〜③の中から選び、番号で答えよ。   ①:単複区分, ②: 複合区分, ③ : 単価区分  (b)テーブル“商品提供時間”,“単品商品変動単価”,“一括商品変動単価”の外部キー“商品番号”は,“商品” テーブルの限定されたインスタンスを参照する。これらのテーブルの“商品番号” が “商品” テーブルを参照するとき, 次に示す表 3 の決定表で各区分の条件を判定する。 表 3(1/2)の商品提供時間を例にして, 3(2/2)中の空欄をすべて埋めよ。   なお,存在しない区分の組合せも,決定表の列に含まれている。
データベーススペシャリスト試験(平成23年 午後I 問2 表3-1)
データベーススペシャリスト試験(平成23年 午後I 問2 表3-2)
模範解答
(a):  a:③  b:②  c:① (b): データベーススペシャリスト試験(平成23年 午後I 問2 設問2-1解)
解説

模範解答の論点整理

まず,本問で問われているのは次の2点です。
  1. 「商品」テーブルの属性 (a),(b),(c) がそれぞれ何を表しているか
  2. 外部キーとして「商品」テーブルのどのインスタンスを参照するかを,決定表に従って埋める方法
これらのポイントを押さえるためのキーワードは以下の通りです。
  • 単複区分(全商品)
    1:単品商品, 2:複合商品
  • 複合区分(全複合商品)
    1:セット商品, 2:一括商品, 対象外は NULL
  • 単価区分(全単品商品・全一括商品)
    1:変動単価を適用しない, 2:変動単価を適用する, 対象外は NULL
  • 参照条件
    • 商品提供時間:セット商品・一括商品のみ
    • 単品商品変動単価:単価区分=2 かつ 単複区分=1
    • 一括商品変動単価:単価区分=2 かつ 複合区分=2

(a) (a)〜(c) の対応付け

問題文中の「表1 各区分の取り得る値と意味」から引用します。
区分対象商品取り得る値と意味
単複区分全商品1:単品商品、2:複合商品
複合区分全複合商品1:セット商品、2:一括商品
(対象外商品→NULL)
単価区分全単品商品、全一括商品1:変動単価を適用しない商品、2:変動単価を適用する商品
(対象外商品→NULL)
表2の (a), (b), (c) 列と照らし合わせると,
カラム問(a)の答え意味
a単価区分
b複合区分
c単複区分
解答
(a)
a:③  
b:②  
c:①

(b) 決定表の空欄埋め

「表3(2/2) 決定表」において,外部キー “商品番号” が “商品” テーブルのどのインスタンスを参照するか(X:参照する,–:参照しない又は存在しない)を埋めます。
  1. 商品提供時間
    「セット商品と一括商品は,商品別に、提供する曜日、時間帯を限定している」
    → 単複区分=2(複合商品)の行のみ参照 → c=2 の列に X
  2. 単品商品変動単価
    「単品商品の一部に,店舗別曜日別時間帯別に変動単価を設定する」
    → 単価区分=2 かつ 単複区分=1 → a=2 かつ c=1 の列に X
  3. 一括商品変動単価
    「一括商品の一部に,店舗別曜日別に変動単価を設定する」
    → 単価区分=2 かつ 複合区分=2 → a=2 かつ b=2 の列に X
以下に,表3(2/2) の空欄部分を埋めたものを示します。列番号は便宜的にルール1~ルール9とします。
ルール1ルール2ルール3ルール4ルール5ルール6ルール7ルール8ルール9
a222NULLNULLNULLNULLNULLNULL
b2NULLNULL1122NULLNULL
c212121212
商品提供時間XXXXX
単品商品変動単価X
一括商品変動単価X

受験者が陥りやすいポイント

  • (a)のカラム対応誤り
    図3の空欄ラベルと表1の「区分」を混同しがち。
    → 表1と表2を見比べ,対象商品・NULL許容をキーに丁寧に対応付けること。
  • (b)の参照条件漏れ
    「商品提供時間」は複合商品のみ,「単品商品変動単価」は単品のみ,「一括商品変動単価」は一括商品のみ対象という 三つの異なるフィルタ条件 を同時に押さえる必要があります。

試験対策としてのまとめ

  1. 区分属性の役割
    表1の「区分」を完全に暗記し,表2・図3の空欄と対応づけられるようにする。
  2. 決定表の読み方
    • 行(a),(b),(c) から商品種別を判別
    • 対象テーブルごとに参照すべき組合せ条件を抽出
    • 条件一致の列に X,それ以外に – を配置
  3. ミス対策
    • まず「どの属性でフィルタするか」を日本語で書き出し,そのあと表に転記する
    • NULLや対象外商品の取り扱いを忘れない
以上を意識して,区分設計と参照制約の問題に慣れておきましょう。

設問2(2)商品ごとの区分について,(1),(2)に答えよ。

図3 中の(d)〜(f)に入れる適切な列名を、本文中の用語を用いてすべて答えよ。
模範解答
d:曜日時間帯番号 e:店舗番号曜日時間帯番号,変動単価 f:店舗番号曜日,変動単価
解説

模範解答のキーワード整理

本問では,図3の以下3つのテーブルに空欄(d)〜(f)で示される列名を,本文中の用語を用いて埋めます。
  • 商品提供時間:(d)
  • 単品商品変動単価:(e)
  • 一括商品変動単価:(f)
対応する本文の記述は次のとおりです。
記述箇所内容
商品提供時間の制限「セット商品と一括商品は,商品別に,提供する曜日、時間帯を限定している。」
単品商品の変動単価設定「単品商品の一部に,店舗別曜日別時間帯別に変動単価を設定する。」
一括商品の変動単価設定「一括商品の一部に,店舗別曜日別に変動単価を設定する。」

(d)商品提供時間の列

解答

  • (d)曜日,時間帯番号

解説

図3の「商品提供時間」テーブルは,以下の本文から導出します。
「セット商品と一括商品は,商品別に,提供する曜日、時間帯を限定している。」
したがって,キーとなる 商品番号 に加えて,「曜日」と「時間帯番号」を持たせることで,どの商品をどの曜日・時間帯に提供するかを定義できます。
テーブル名カラム名備考
商品提供時間商品番号主キーの一部
曜日主キーの一部
時間帯番号主キーの一部,外部キー

(e)単品商品変動単価の列

解答

  • (e)店舗番号,曜日,時間帯番号,変動単価

解説

「単品商品の一部に,店舗別曜日別時間帯別に変動単価を設定する。」という記述に基づきます。
単品商品の一部に,店舗別曜日別時間帯別に変動単価を設定する。
変動単価の適用条件を特定するために必要な列は,
  1. 商品番号(テーブルに既存)
  2. 店舗番号(店舗別)
  3. 曜日(曜日別)
  4. 時間帯番号(時間帯別)
  5. 変動単価(設定する変動価格)
の5項目です。これにより,特定の店舗・曜日・時間帯における単品商品の変動単価を管理できます。
テーブル名カラム名備考
単品商品変動単価商品番号主キーの一部
店舗番号主キーの一部,外部キー
曜日主キーの一部
時間帯番号主キーの一部,外部キー
変動単価

(f)一括商品変動単価の列

解答

  • (f)店舗番号,曜日,変動単価

解説

本文の記述は次のとおりです。
「一括商品の一部に,店舗別曜日別に変動単価を設定する。」
単品商品変動単価と異なり,時間帯別の指定は不要なので,必要な列は,
  1. 商品番号(既存)
  2. 店舗番号(店舗別)
  3. 曜日(曜日別)
  4. 変動単価
の4項目です。
テーブル名カラム名備考
一括商品変動単価商品番号主キーの一部
店舗番号主キーの一部,外部キー
曜日主キーの一部
変動単価

受験者が陥りやすいポイント

  1. 「時間帯番号」をどこまで必要とするか
    • 単品商品は「時間帯別」に変動単価を設定するため必要ですが,一括商品では「時間帯別」がない点に注意します。
  2. 「曜日」と「時間帯番号」の混同
    • 提供時間制限では「曜日,時間帯」を両方扱います。曜日のみ・時間帯のみでは要件を満たせません。
  3. テーブル間の外部キー関係を忘れる
    • 時間帯番号 は「時間帯」マスタへの外部キー,店舗番号 は「店舗」マスタへの外部キーであることを意識してください。

試験対策のポイント

  • 本文中の順序どおりに用語を拾う
    「店舗別曜日別時間帯別」などの並び順を見逃さない。
  • テーブル設計の主キー
    各制約(曜日・時間帯・店舗)の組み合わせが重複しないよう,複合主キーを設定する。
  • 要件とデータ設計の整合性チェック
    「変動単価」を優先適用する仕組みも意識し,テーブル構造が実装要件を満たすか確認する習慣をつけましょう。

設問3(1)〔セット商品扱いの対応〕 を行った場合の図 3中の“売上明細” テーブルについて,(1),(2)に答えよ。

図3中の“売上明細” テーブルでは、セット商品扱いを想定した場合,問題点が二つある。それぞれの問題点について, 40字以内で述べよ。
模範解答
①:・1回の注文伺時分秒で同じ商品番号が発生する場合があり一意性制約違反となる。 ②:・利用客からの注文,売切れによる取消とセット商品扱いを区別できない。
解説

キーワード・論点整理

  • 一意性制約(ユニークキー)の違反
  • 同一「注文伺時刻」「商品番号」の重複
  • 注文区分(利用客注文/取消/セット扱い)の判別不能

① 一意性制約違反の問題点

指摘
「①:1回の注文伺時分秒で同じ商品番号が発生する場合があり一意性制約違反となる。」
論理的な説明
図3の「売上明細」テーブルでは、主キーとして
(店舗番号, 売上伝票番号, 注文伺時刻, 商品番号)
が想定されます。
セット商品扱いを行うと、
  • 利用客が単品を注文
  • システムが「セット商品扱い」として単品を取消し+セット商品行を追加
という流れで、同一注文伺時刻内に
→ 単品商品番号A(数量−1)
→ セット商品番号B(数量+1)
さらに同じセット構成の単品商品番号Aを再利用客注文で記録すると、
同一時刻・同一商品番号A の行が複数生じ、
主キーの一意性制約に違反してしまいます。

② 注文種別の判別不能の問題点

指摘
「②:利用客からの注文,売切れによる取消とセット商品扱いを区別できない。」
論理的な説明
「売上明細」には数量のプラス/マイナスしか情報がなく、
  • 利用客による正規注文
  • 売切れによる取消(数量マイナス)
  • システムによるセット商品扱い(取消+追加)
を区別する手段がありません。
結果として、伝票を参照した際に「どの行がセット扱いによる自動取消なのか」
「本当に利用客が注文取消を頼んだのか」を見分けられず、訂正履歴の解釈や集計に支障が生じます。

受験者が誤りやすいポイント

  • 「セット商品扱い」がただの数量調整だと思い込み、主キー設計への影響を見落とす
  • 数量の符号だけで取消/セット扱いを識別できると考えてしまう
  • 注文履歴の正当性確保のための「種別カラム」設計を忘れやすい

試験対策として覚えておくべきポイント

  1. 主キー(ユニーク制約)は将来の要件変更も含めて検討
    • 新たな業務ロジック(セット扱いなど)で同一キーが重複しないか設計段階で確認する。
  2. 取引の発生日・時刻だけで行を一意に特定できない場合の対処
    • 「行番号」「シーケンス番号」「注文種別コード」などの追加カラムが必要。
  3. 業務イベントの区別は必ず属性として持つ
    • 正規注文/取消/自動訂正(セット扱い)などを表す「注文区分」を定義し、
      ロギングや集計、再現性を確保する。

設問3(2)〔セット商品扱いの対応〕 を行った場合の図 3中の“売上明細” テーブルについて,(1),(2)に答えよ。

“売上明細” テーブルに列を追加することで,(1)の問題点を解決することができる。このときの(a),(b)に答えよ。  (a)列を追加した後のテーブル構造を答えよ。  (b)追加列名とその列に設定する値の説明を答えよ。   なお,解答欄はすべて埋まるとは限らない。
模範解答
(a):売上明細(店舗番号売上伝票番号注文伺時分秒商品番号,数量,販売単価,クーポン番号セット商品扱い区分) (b): データベーススペシャリスト試験(平成23年 午後I 問2 設問3-2解)
解説

1 解答の論点整理

設問3では,「(1)の問題点を解決する」ために「売上明細」テーブルに新たな列を追加します。
ここでの主なキーワード・論点は以下のとおりです。
  • 売上明細テーブルの構造
  • “セット商品扱い”を区別して保持・表示する必要性
  • 追加する属性の名称と値の意味
  • 主キーや外部キーの扱い

2 なぜこの解答になるのか

(1) の問題点

問題文中に次の記述があります。
「システム化後は, 複数の単品商品の注文によって…自動的にセット商品が注文されたものとみなし(これを“セット商品扱い”という), 単品商品の注文を取消し扱いにする。この場合、利用客からの注文とセット商品扱いを区別して, 注文伺明細に表示する。」
「注文伺明細」(=売上明細)の中で, ① 利用客が実際にオーダーした単品商品 と ② システム側がまとめて処理したセット商品扱い を区別して表示しなければなりません。
にもかかわらず,既存の「売上明細」テーブルにはその区別を保持する属性がありません。
したがって,テーブルに“セット商品扱い”を区別するための列を追加する必要があります。

元のテーブル構造

図3や問題文の記述から,既存の「売上明細」テーブルは以下の属性を持ちます。
カラム名主キー/外部キー意味
店舗番号PK, FK (店舗)売上を計上した店舗番号
売上伝票番号PK1来店グループごとの伝票番号
注文伺時分秒PK注文伺の開始時刻
商品番号PK, FK (商品)注文された(または扱われた)商品
数量注文数量
販売単価伝票に記録された単価
クーポン番号FK (クーポン利用条件)使用したクーポン番号(NULL可)

追加すべき列

上記に加えて
  • 「セット商品扱い区分」
を追加します。これにより,売上明細の各行が「利用客の注文」「セット商品扱い」のいずれかを判別できます。

3 解答例

(a) 列を追加した後の「売上明細」テーブル構造
カラム名主キー/外部キー意味
店舗番号PK, FK (店舗)売上を計上した店舗番号
売上伝票番号PK1来店グループごとの伝票番号
注文伺時分秒PK注文伺の開始時刻(時分秒)
商品番号PK, FK (商品)注文された(または扱われた)商品番号
数量注文数量
販売単価伝票に記録された単価
クーポン番号FK (クーポン利用条件)使用したクーポン番号(NULL可)
セット商品扱い区分0:利用客注文/1:セット商品扱い
主キーは(店舗番号, 売上伝票番号, 注文伺時分秒, 商品番号)の4属性の複合キーです。
(b) 追加列名とその値の説明
列名取り得る値説明
セット商品扱い区分0, 10:利用客が直接注文した商品の明細行
1:システムが“セット商品扱い”としてまとめ処理した商品の明細行

4 受験者が誤りやすいポイント

  1. 主キーの設定忘れ
    新しい属性を追加しても,主キーを正しく維持していないと,重複レコードや整合性違反を招きます。
  2. 値の取り得る範囲の定義不足
    “セット商品扱い区分”が単に Boolean として扱われていることを明確にしないと,意味があいまいになります。
  3. クーポン番号との混同
    「セット商品扱い区分」を「クーポン適用区分」と勘違いしないように注意してください。

5 試験対策上のまとめ

  • 仕様変更や要件追加の際には,「どのテーブルに」「どの属性を」「どのような制約で」追加すればよいかを即座に判断できるようにしておく。
  • 複合キーや外部キーといった整合性制約を忘れない。
  • 区分値は必ず「取り得る値」と「値の意味」をセットで定義し,ER図やDDL設計に反映する。
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ