令和3年度 秋期 データベーススペシャリスト試験 午後Ⅰ 問1 共通ポイントサービスのデータベース設計と関係スキーマの正規化
テクノロジデータベース
学習ガイド
複数の加盟企業が参加する共通ポイントサービスで、ポイントシステムを再構築するためのデータベース設計の問題です。概念データモデルと関係スキーマの完成、関係“加盟企業商品”の候補キーと正規化、日次バッチでポイント残高に加算されない記録への対応が問われます。横断分析用商品コードが後から設定されることや、ポイントの後付けの記録日時など、業務ルールの細部がキーや処理にどう影響するかを確かめます。
この記事で押さえる論点
- エンティティ間のリレーションシップを業務ルールから抽出し、概念データモデルを完成できる
- 主キーと外部キーを適切に設定し、関係スキーマを完成できる
- 部分関数従属性と推移的関数従属性を見つけ、第3正規形までの正規化手順を説明できる
- 日次バッチ処理でのデータの状態遷移(加算済みか未加算か)を管理する属性の役割を述べられる
出題情報
- 出題
- 2021(R3)秋 データベーススペシャリスト 午後I 問1
- 配点
- 50点満点
- 模範解答
- 公表(設問ごとに掲載)
出題趣旨・採点講評(IPA 公表)
データベースの設計では,業務内容や業務で取り扱うデータなどの実世界の情報を統合的に理解し,データモデルに反映することが求められる。本問では,共通ポイントサービスのデータベース設計を題材として,業務要件をデータモデルに反映する能力,関数従属性,正規化理論などの基礎知識を用いてデータモデルを分析する能力,データモデルの問題点を識別する能力を問う。
問1では,共通ポイントサービスを題材に,業務要件に基づくデータベース設計,正規化理論に基づくデータモデル分析について出題した。全体として正答率は平均的であった。
問題本文
データベース設計に関する次の記述を読んで,設問1〜3に答えよ。
B社は,複数の加盟企業向けに共通ポイントサービスを運営している。今回,その基盤のシステム(以下,ポイントシステムという)を再構築することになり,データベース設計を開始した。
〔ポイントシステムの概要〕
会員
会員は,B社が発行したポイントカードの利用者であり,会員コードで識別する。加盟企業
(1) 加盟企業は,B社と共通ポイントサービス加盟の契約をした企業であり,加盟企業コードで識別する。コンビニエンスストア,レストランチェーンなど様々な業種の企業がある。同じ加盟企業と複数回の契約をすることはない。
(2) 加盟企業は複数の店舗をもつ。店舗は,加盟企業コードと店舗コードで識別する。加盟企業商品と横断分析用商品情報
(1) 加盟企業商品
① 加盟企業が販売する商品を,B社から見て加盟企業商品と呼ぶ。
② 加盟企業は,商品をポイントシステムに登録するときに,当該加盟企業の商品コード(以下,加盟企業商品コードという),商品名(以下,加盟企業商品名という),JANコードを登録する。加盟企業商品は,加盟企業コードと加盟企業商品コードで識別する。
③ 加盟企業商品コードは再利用されないが,加盟企業商品名とJANコードは再利用されることがある。また,JANコードが設定されない商品もある。
(2) 横断分析用商品情報
① 横断分析用商品情報は,複数の加盟企業が同じ商品を扱っている場合に同一商品であると認識できるようにするものである。横断分析用商品情報には,横断分析用商品コードと横断分析用商品名を設定し,横断分析用商品コードで識別する。横断分析用商品名は一意になるとは限らない。
② B社は,加盟企業商品が追加される都度,既に同じ商品の横断分析用商品が登録済みかどうかを確認し,登録済みと判断すればその横断分析用商品コードを,登録済みでないと判断すれば新たな横断分析用商品コードを加盟企業商品に設定する。
③ 横断分析用商品コードの設定には,加盟企業商品の登録から数日を要する場合がある。
〔ポイントの概要〕
ポイント
ポイントは,加盟企業の販促のために会員に与える点数である。ポイントの利用
(1) 会員は,自分のポイント残高を上限として,購入金額の一部又は全てをポイントで支払うことができる。利用したポイント(以下,利用ポイントという)は,支払時にポイント残高から減算する。
(2) ポイントは,全ての加盟企業の店舗で利用できる。
(3) 利用ポイントを支払ごとに記録する。1回の支払はレシート番号で識別する。ポイントの付与
(1) 会員がポイントカードを提示して支払をすると,その支払で付与するポイントを記録する。ポイントカードの提示がなければこの記録を作成しない。
(2) 付与ポイントを記録した時点では,付与ポイントの記録は会員のポイント残高に加算しない。ポイント残高への加算は後述の日次バッチで行う。
(3) ポイントには,商品ごとの購入金額に対して付与するものと,支払方法ごとの支払金額に対して付与するものがある。
① 購入商品ごとの付与ポイント
・商品の購入金額(購入数×商品単価)にポイント付与率を乗じて計算する。
・ポイント付与率は,通常は全加盟企業共通で決められている基準ポイント付与率を適用するが,後述のクーポンの利用によって変わることがある。
② 支払方法ごとの付与ポイント
・支払においては,現金,ポイント利用,電子マネー利用など,1回の支払で複数の支払方法を併用できる。
・支払方法ごとの付与ポイントは,各支払方法での支払金額に,ポイント付与率を乗じて計算する。
・各支払方法に対するポイント付与率は,ポイント設定で決めている。ポイント設定はポイント設定コードで識別し,ポイント付与率,適用期間をもつ。ポイントを付与する支払方法にポイント設定を対応付ける。同じポイント設定を,複数の支払方法に対応付けることがある。
(4) 付与ポイントは,小数第3位まで記録する。
(5) 会員がポイントで支払った分にもポイントを付与する。
4. 付与ポイントのポイント残高への加算
(1) 毎日午前0時を過ぎると,支払ごとの付与ポイントの記録から,支払日時が前日の分を日次バッチで抽出し,集計して会員のポイント残高に加算する。
(2) 購入商品ごとの付与ポイントと支払方法ごとの付与ポイントを加算し,小数点以下を切り捨てたものが支払全体の付与ポイントとなる。
- ポイントの後付け
(1) 会員がポイントカードを忘れた場合,会員が申告すると店員は支払時のレシートに押印する。会員がこのレシートを1か月以内にこの店舗に持って行き,ポイントカードを提示すると,その支払で付与するポイントを記録する。
(2) 付与ポイントの記録は,レシートが発行された日時の記録となる。
〔クーポンの概要〕
クーポン
(1) B社は,クーポンという販促手段を用意している。加盟企業は,自社の店舗に会員を呼び込むために,クーポンを企画する。
(2) クーポンは,会員に配布する紙片である。会員が支払時にクーポンを提示すると,クーポンに設定されたポイント付与率を適用する。店舗は,提示されたクーポンを回収する。
(3) クーポンの企画単位にクーポンコードを付与する。
(4) クーポンは,企画した加盟企業の店舗だけで利用できる。
(5) クーポンには,利用期間を設定している。
(6) 設定できるクーポンには,適用対象となる店舗を限定したクーポン,適用対象となる商品を限定したクーポン,及び,店舗も商品も限定しないクーポンがある。ただし,商品の購入数を限定したクーポンは設定できない。
(7) 会員は,クーポンコードが異なる複数のクーポンを1回の支払で利用できる。
(8) クーポンの効果を測るために,クーポンがどの支払で利用されたか分かるように記録する。クーポンの配布方法
(1) クーポンを企画した加盟企業は,B社に料金を支払い,クーポンの配布対象にしたい会員の抽出条件をB社に伝える。
(2) 会員の抽出は,支払時のポイント付与の記録を用いて行う。抽出条件には,ある期間に特定の店舗を利用した,特定の商品を一定以上の金額分購入した,特定の支払方法で一定以上の金額を支払った,などがある。
(3) B社は,条件に合う会員を抽出し,クーポン配布リストとして登録する。会員の抽出は,日次バッチで行う。
(4) クーポン配布リストに登録されている会員が,全加盟企業のいずれかの店舗を利用した場合に,クーポンを発行する。同じ会員に同じクーポンを2回発行することはない。
(5) クーポンには,配布上限数と配布期間を設定している。
〔概念データモデルと関係スキーマの設計〕
概念データモデルを図1に,関係スキーマを図2に示す。

図の説明テキスト
図1 概念データモデル(未完成)
エンティティを矩形で示し、リレーションシップを矢印で結んだ図。一部のリレーションシップのみが描画されており未完成の状態。
【エンティティ(矩形)】
クーポン設定対象店舗、店舗、クーポン配布、会員、クーポン設定、クーポン利用、支払、支払方法明細、購入商品明細、支払方法、ポイント設定
【描画されているリレーションシップ(矢印の向き)】
- 会員 → 支払
- 支払 → 支払方法明細
- 支払 → 購入商品明細
- 支払方法 → 支払方法明細
※上記以外のエンティティ間には線が引かれていない。

図の説明テキスト
図2 関係スキーマ(未完成)
枠内に次の関係スキーマが記載されている。原図では主キーを構成する属性名に実線の下線、外部キーを構成する属性名に破線の下線が付いており、ここではそれぞれ「(主キー)」「(外部キー)」と記す。
店舗(加盟企業コード(主キー),店舗コード(主キー),店舗名,所在地)
会員(会員コード(主キー),会員名,入会日,住所,性別,生年月日,ポイント残高)
加盟企業商品(加盟企業コード,加盟企業商品コード,JANコード,加盟企業名,契約開始日,契約終了日,加盟企業商品名,横断分析用商品コード,横断分析用商品名) ※この関係には下線が付いていない
支払(レシート番号(主キー),会員コード(外部キー),a,b,支払日時,利用ポイント)
支払方法明細(レシート番号(主キー),支払方法コード(主キー),c,付与ポイント)
購入商品明細(レシート番号(主キー),加盟企業コード(主キー),加盟企業商品コード(主キー),d,商品単価,付与ポイント)
支払方法(支払方法コード(主キー),支払方法名,e)
ポイント設定(ポイント設定コード(主キー),適用開始日,適用終了日,f)
クーポン設定(クーポンコード(主キー),クーポン名,企画加盟企業コード,配布開始日,配布終了日,利用開始日,利用終了日,ポイント付与率,g)
クーポン設定対象店舗(クーポンコード(主キー),加盟企業コード(主キー),店舗コード(主キー))
クーポン設定対象商品(クーポンコード(主キー),加盟企業コード(主キー),加盟企業商品コード(主キー))
クーポン配布(h,i,配布済フラグ,配布日時)
クーポン利用(j,k)
解答に当たっては,巻頭の表記ルールに従うこと。ただし,エンティティタイプ間の対応関係にゼロを含むか否かの表記は必要ない。
なお,エンティティタイプ間のリレーションシップとして“多対多”のリレーションシップを用いないこと。エンティティタイプ名及び属性名は,それぞれ意味を識別できる適切な名称とすること。
設問2の解答で部分関数従属性または推移的関数従属性が“あり”の場合は,次の表記法に従って,その関数従属性の具体例を一つ示すこと。

図の説明テキスト
| 関数従属性 | 表記法 |
|---|---|
| 部分関数従属性 | 属性 1 → 属性 2 |
| 推移的関数従属性 | 属性 3 → 属性 4 → 属性 5 |
なお,候補キー及び表記法に示されている属性1,属性3,属性4が複数の属性から構成される場合は,{ }でくくること。
設問と解答・解説
設問1
図1,2について,(1),(2)に答えよ。
図2中の a に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
加盟企業コード
店舗コード
採点基準
- 2点: 「加盟企業コード」「店舗コード」のどちらか一方が記述されている。主キー・外部キーの注記が無くても満点とする。
- 1点: どちらかの属性名に軽微な誤記がある、又は「(主キー)」と注記して主キー扱いにしている。
- 0点: 上記以外、または無解答。
解説
関係「支払」は1回の支払を表し、問題文の〔ポイントの概要〕2.(3)に「1回の支払はレシート番号で識別する」とあるため、主キーは レシート番号 となっています。
また、クーポンなどの処理において支払が行われた店舗を特定する必要があるため、関係「支払」は店舗と結びつく必要があります。〔ポイントシステムの概要〕2.(2)より「店舗は,加盟企業コードと店舗コードで識別する」、〔クーポンの概要〕2.(2) の会員の抽出条件に「ある期間に特定の店舗を利用した」とされているため、関係「支払」には外部キーとして 加盟企業コード と 店舗コード をもたせる必要があります。空欄 a と b にはこれらが順不同で入ります。
高得点のポイント
- 図2の関係「店舗」の主キー(加盟企業コード、店舗コード)を参照するための外部キーであることを理解し、正確な属性名を導出できていること。
- 公式解答例では破線の下線(外部キー)が付く。解答では「加盟企業コード(外部キー)」のように注記できる(注記が無くても減点しない)。
図2中の b に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
加盟企業コード
店舗コード
採点基準
- 2点: 「加盟企業コード」「店舗コード」のうち、1つ目の解答(空欄a)に書いたものと異なるもう一方が記述されている(1つ目が誤答・無解答の場合はどちらか一方で可)。主キー・外部キーの注記が無くても満点とする。
- 1点: もう一方の属性名に軽微な誤記がある、又は「(主キー)」と注記して主キー扱いにしている。
- 0点: 1つ目の解答と同じ属性名が記述されている、全く異なる属性名、または無解答。
解説
関係「支払」は1回の支払を表し、問題文の〔ポイントの概要〕2.(3)に「1回の支払はレシート番号で識別する」とあるため、主キーは レシート番号 となっています。
また、クーポンなどの処理において支払が行われた店舗を特定する必要があるため、関係「支払」は店舗と結びつく必要があります。〔ポイントシステムの概要〕2.(2)より「店舗は,加盟企業コードと店舗コードで識別する」、〔クーポンの概要〕2.(2) の会員の抽出条件に「ある期間に特定の店舗を利用した」とされているため、関係「支払」には外部キーとして 加盟企業コード と 店舗コード をもたせる必要があります。空欄 a と b にはこれらが順不同で入ります。
高得点のポイント
- 図2の関係「店舗」の主キー(加盟企業コード、店舗コード)を参照するための外部キーであることを理解し、正確な属性名を導出できていること。
- 公式解答例では破線の下線(外部キー)が付く。解答では「店舗コード(外部キー)」のように注記できる(注記が無くても減点しない)。
図2中の c に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
支払金額
採点基準
- 2点: 正解の属性名(支払金額)と完全に一致している。
- 1点: 正解の属性名とほぼ一致しているが、軽微な誤記がある。
- 0点: 無解答、または全く異なる属性名が記述されている。
解説
関係「支払方法明細」は、1回の支払においてどの支払方法でいくら支払ったかを記録するテーブルです。〔ポイントの概要〕3.(3)②に「各支払方法での支払金額に,ポイント付与率を乗じて計算する」とあり、付与ポイントを計算する基となる金額情報を保持する必要があります。したがって、空欄 c には 支払金額 が入ります。
高得点のポイント
- 支払方法ごとの付与ポイント計算に必要な要素が「支払金額」であることを業務要件から正しく読み取れていること。
図2中の d に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
購入数
採点基準
- 2点: 正解の属性名(購入数)と完全に一致している。
- 1点: 正解の属性名とほぼ一致しているが、軽微な誤記がある。
- 0点: 無解答、または全く異なる属性名が記述されている。
解説
関係「購入商品明細」は、1回の支払で購入した商品の明細を記録します。〔ポイントの概要〕3.(3)①に「商品の購入金額(購入数×商品単価)にポイント付与率を乗じて計算する」とあります。関係スキーマにはすでに 商品単価 と 付与ポイント が存在するため、計算に必要な残りの属性である 購入数 が空欄 d に入ります。
高得点のポイント
- 購入商品ごとの付与ポイント計算に必要な要素が「商品単価」と「購入数」であることを業務要件から正しく特定できていること。
図2中の e に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
ポイント設定コード
採点基準
- 2点: 「ポイント設定コード」と記述されている。主キー・外部キーの注記が無くても満点とする。
- 1点: 軽微な誤記がある、又は「(主キー)」と注記して主キー扱いにしている。
- 0点: 全く異なる属性名が記述されている、または無解答。
解説
関係「支払方法」は、利用可能な支払方法のマスターデータを管理します。〔ポイントの概要〕3.(3)②に「ポイントを付与する支払方法にポイント設定を対応付ける」とあります。この対応付けを実現するため、関係「支払方法」に外部キーとして ポイント設定コード をもたせる必要があります。したがって、空欄 e には ポイント設定コード が入ります。
高得点のポイント
- 支払方法とポイント設定の対応付け要件から、関係「ポイント設定」の主キー(ポイント設定コード)を参照するための外部キーが必要であると理解できていること。
- 公式解答例では破線の下線(外部キー)が付く。解答では「ポイント設定コード(外部キー)」のように注記できる(注記が無くても減点しない)。
図2中の f に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
ポイント付与率
採点基準
- 2点: 正解の属性名(ポイント付与率)と完全に一致している。
- 1点: 正解の属性名とほぼ一致しているが、軽微な誤記がある。
- 0点: 無解答、または全く異なる属性名が記述されている。
解説
関係「ポイント設定」は、ポイント付与に関する設定値を保持します。〔ポイントの概要〕3.(3)②に「ポイント設定はポイント設定コードで識別し,ポイント付与率,適用期間をもつ」とあります。関係スキーマには適用期間を表す 適用開始日 と 適用終了日 がすでにあるため、残りの属性である ポイント付与率 が空欄 f に入ります。
高得点のポイント
- ポイント設定が保持すべき項目を業務要件の記述から漏れなく抽出し、正確な属性名を導出できていること。
図2中の g に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
配布上限数
採点基準
- 2点: 正解の属性名(配布上限数)と完全に一致している。
- 1点: 正解の属性名とほぼ一致しているが、軽微な誤記がある。
- 0点: 無解答、または全く異なる属性名が記述されている。
解説
関係「クーポン設定」は、クーポンの企画内容を保持します。〔クーポンの概要〕2.(5)に「クーポンには,配布上限数と配布期間を設定している」とあります。関係スキーマには配布期間を表す 配布開始日、配布終了日 がすでに存在するため、残りの 配布上限数 が空欄 g に入ります。
高得点のポイント
- クーポン設定が保持すべき項目を業務要件の記述から漏れなく抽出し、正確な属性名を導出できていること。
図2中の h に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
クーポンコード
会員コード
採点基準
- 2点: 「クーポンコード」「会員コード」のどちらか一方が記述されている。主キー・外部キーの注記が無くても、「(主キー)(外部キー)」と両方を注記しても満点とする。
- 1点: 軽微な誤記がある、又は「(外部キー)」だけを注記して主キーとしなかったもの。
- 0点: 上記以外、または無解答。
解説
関係「クーポン配布」は、どの会員にどのクーポンを配布したかを管理します。〔クーポンの概要〕2.(4)に「クーポン配布リストに登録されている会員が,全加盟企業のいずれかの店舗を利用した場合に,クーポンを発行する。同じ会員に同じクーポンを2回発行することはない」とあります。1回の発行(配布)は会員とクーポンの組み合わせで一意になるため、主キーは クーポンコード と 会員コード になります。空欄 h, i にはこれらが順不同で入ります。
高得点のポイント
- クーポン配布を記録するためには、どのクーポンを誰(どの会員)に渡したかという2つの識別子が必要であることを理解できていること。
- 公式解答例では実線の下線(主キー)が付く。主キーの一部が外部キーを兼ねる場合は破線を付けない(表記ルール③)。
図2中の i に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
クーポンコード
会員コード
採点基準
- 2点: 「クーポンコード」「会員コード」のうち、1つ目の解答(空欄h)に書いたものと異なるもう一方が記述されている(1つ目が誤答・無解答の場合はどちらか一方で可)。主キー・外部キーの注記が無くても、「(主キー)(外部キー)」と両方を注記しても満点とする。
- 1点: 軽微な誤記がある、又は「(外部キー)」だけを注記して主キーとしなかったもの。
- 0点: 1つ目の解答と同じ属性名が記述されている、上記以外、または無解答。
解説
関係「クーポン配布」は、どの会員にどのクーポンを配布したかを管理します。〔クーポンの概要〕2.(4)に「クーポン配布リストに登録されている会員が,全加盟企業のいずれかの店舗を利用した場合に,クーポンを発行する。同じ会員に同じクーポンを2回発行することはない」とあります。1回の発行(配布)は会員とクーポンの組み合わせで一意になるため、主キーは クーポンコード と 会員コード になります。空欄 h, i にはこれらが順不同で入ります。
高得点のポイント
- クーポン配布を記録するためには、どのクーポンを誰(どの会員)に渡したかという2つの識別子が必要であることを理解できていること。
- 公式解答例では実線の下線(主キー)が付く。主キーの一部が外部キーを兼ねる場合は破線を付けない(表記ルール③)。
図2中の j に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
クーポンコード
レシート番号
採点基準
- 2点: 「クーポンコード」「レシート番号」のどちらか一方が記述されている。主キー・外部キーの注記が無くても、「(主キー)(外部キー)」と両方を注記しても満点とする。
- 1点: 軽微な誤記がある、又は「(外部キー)」だけを注記して主キーとしなかったもの。
- 0点: 上記以外、または無解答。
解説
関係「クーポン利用」は、支払時にどのクーポンが使われたかを記録します。〔クーポンの概要〕1.(8)に「クーポンがどの支払で利用されたか分かるように記録する」とあります。1回の支払は レシート番号 で識別され、利用されるクーポンは クーポンコード で識別されます。〔クーポンの概要〕1.(7)に「会員は,クーポンコードが異なる複数のクーポンを1回の支払で利用できる」とあり、1回の支払で複数のクーポンが利用されるので、レシート番号だけでは識別できません。クーポンと支払の組み合わせで特定できるため、この関係の主キーは クーポンコード と レシート番号 の組み合わせになります。空欄 j, k にはこれらが順不同で入ります。
高得点のポイント
- クーポンの利用履歴を特定するためには、利用されたクーポンと、利用された支払機会(レシート)の両方の識別子が必要であることを理解できていること。
- 公式解答例では実線の下線(主キー)が付く。主キーの一部が外部キーを兼ねる場合は破線を付けない(表記ルール③)。
図2中の k に入れる適切な属性名を答えよ。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
クーポンコード
レシート番号
採点基準
- 2点: 「クーポンコード」「レシート番号」のうち、1つ目の解答(空欄j)に書いたものと異なるもう一方が記述されている(1つ目が誤答・無解答の場合はどちらか一方で可)。主キー・外部キーの注記が無くても、「(主キー)(外部キー)」と両方を注記しても満点とする。
- 1点: 軽微な誤記がある、又は「(外部キー)」だけを注記して主キーとしなかったもの。
- 0点: 1つ目の解答と同じ属性名が記述されている、上記以外、または無解答。
解説
関係「クーポン利用」は、支払時にどのクーポンが使われたかを記録します。〔クーポンの概要〕1.(8)に「クーポンがどの支払で利用されたか分かるように記録する」とあります。1回の支払は レシート番号 で識別され、利用されるクーポンは クーポンコード で識別されます。〔クーポンの概要〕1.(7)に「会員は,クーポンコードが異なる複数のクーポンを1回の支払で利用できる」とあり、1回の支払で複数のクーポンが利用されるので、レシート番号だけでは識別できません。クーポンと支払の組み合わせで特定できるため、この関係の主キーは クーポンコード と レシート番号 の組み合わせになります。空欄 j, k にはこれらが順不同で入ります。
高得点のポイント
- クーポンの利用履歴を特定するためには、利用されたクーポンと、利用された支払機会(レシート)の両方の識別子が必要であることを理解できていること。
- 公式解答例では実線の下線(主キー)が付く。主キーの一部が外部キーを兼ねる場合は破線を付けない(表記ルール③)。
図1のリレーションシップは未完成である。必要なリレーションシップを全て記入し,図を完成させよ。
なお,図に表示されていないエンティティタイプは考慮しなくてよい。
模範解答
店舗 → 支払
店舗 → クーポン設定対象店舗
クーポン設定 → クーポン設定対象店舗
クーポン設定 → クーポン配布
会員 → クーポン配布
クーポン設定 → クーポン利用
支払 → クーポン利用
ポイント設定 → 支払方法
(いずれも“1対多”で、矢印の先が“多”側。図1 に既にある 会員 → 支払、支払 → 支払方法明細、支払 → 購入商品明細、支払方法 → 支払方法明細 は記入不要)
採点基準
- 1点: 追加すべき8本のリレーションシップ(店舗→支払、店舗→クーポン設定対象店舗、クーポン設定→クーポン設定対象店舗、クーポン設定→クーポン配布、会員→クーポン配布、クーポン設定→クーポン利用、支払→クーポン利用、ポイント設定→支払方法)をすべて挙げている。図1に既にある4本を重ねて書いても減点しない。
- 0点: リレーションシップの抽出に1本でも欠けがある。
- 1点: 8本すべてで1側と多側(矢の向き)が正しく示されており、8本以外の線(多対多・1対1・図に無いエンティティタイプへの線など)を書いていない。「店舗→支払」「店舗と支払は1対多」など向きが読み取れる書き方であれば可。
- 0点: 矢印の向きの誤りがある、または不要なリレーションシップが描画されている。
解説
概念データモデル(図1)を完成させるためには、業務要件からエンティティ間の関係(リレーションシップ)を読み解き、親(1)から子(多)へ矢印を引く必要があります。
解答は「1 側 → 多 側」の形で、1 行に 1 本ずつ書きます。
追加すべき主なリレーションシップは以下の通りです。
- 店舗と支払: 支払は特定の店舗で行われ、1つの店舗で複数の支払が発生します。〔クーポンの概要〕2.(2)の会員の抽出条件に「ある期間に特定の店舗を利用した」とあり、支払がどの店舗で行われたかを記録する必要があるため、
店舗→支払の関係があります。 - クーポン設定とクーポン設定対象店舗: 1つのクーポンは複数の店舗を対象にできるため、
クーポン設定→クーポン設定対象店舗の関係があります。 - 店舗とクーポン設定対象店舗: 対象となる各店舗は複数のクーポンに紐づく可能性があるため、
店舗→クーポン設定対象店舗の関係があります。 - クーポン設定と配布/利用: 1つのクーポンは複数の会員に配布・利用されるため、
クーポン設定→クーポン配布、クーポン設定→クーポン利用の関係があります。 - 会員とクーポン配布: 1人の会員は複数のクーポンを受け取るため、
会員→クーポン配布の関係があります。 - 支払とクーポン利用: 1回の支払で複数のクーポンが利用されることがあるため、
支払→クーポン利用の関係があります。 - ポイント設定と支払方法: 〔ポイントの概要〕3.(3)②より、1つのポイント設定を複数の支払方法に対応付けることがあるため、
ポイント設定→支払方法の関係があります。
高得点のポイント
- 本文の複数の箇所に分散している業務要件を漏れなく拾い上げ、エンティティ間の依存関係を過不足なく特定できていること。
- 主キー・外部キーの構成を考慮し、「1対多」の関係において「1(親)」から「多(子)」へ正しく矢印を引いていること。
設問1(2)は,正答率はやや高かったが,店舗と支払のリレーションシップが記入できていない解答が散見された。クーポンの配布対象にしたい会員の抽出に関する要件を読み取れていないと思われる。リレーションシップに関する記述が複数の業務要件に分散していても的確に読み取れるようにしてほしい。
設問2
図2中の関係“加盟企業商品”について,(1)〜(3)に答えよ。
関係“加盟企業商品”の候補キーを全て答えよ。
模範解答
{加盟企業コード, 加盟企業商品コード},{加盟企業コード, 横断分析用商品コード}
採点基準
- 1点: {加盟企業コード, 加盟企業商品コード} と {加盟企業コード, 横断分析用商品コード} の両方を挙げ、それ以外(JANコードを含む組、横断分析用商品コード単独など)を挙げていない。
- 0点: 片方だけ挙げている、または余分な候補キーを含んでいるなど、特定に誤りや不足がある。
- 1点: 複数属性の候補キーを { } でくくっている。候補キーの順序・{ } 内の属性の順序は問わない。
- 0点: 指定の形式に従っていないなど、解答の形式が不適切である。
解説
候補キーとは、関係(テーブル)の中の行を一意に識別できる属性(またはその最小の組み合わせ)のことです。
- 〔ポイントシステムの概要〕3.(1)②より「加盟企業商品は,加盟企業コードと加盟企業商品コードで識別する」とあるため、 が候補キーの1つとなります。
- さらに、3.(2)①より「横断分析用商品情報には,横断分析用商品コードと横断分析用商品名を設定し,横断分析用商品コードで識別する。横断分析用商品名は一意になるとは限らない」とあり、同じ加盟企業内において、横断分析用商品コードも商品を一意に識別できる値となります。したがって、 も候補キーとなります。
高得点のポイント
- 「加盟企業コードと加盟企業商品コード」の組み合わせがレコードを一意に特定できることを理解していること。
- 「横断分析用商品コード」の仕様から、加盟企業コードとの組み合わせで代替の識別子となることを導出できていること。
- 複数の属性からなる複合キーであることを示すため、指定通り
{ }でくくって列挙できていること。
関係“加盟企業商品”における部分関数従属性の有無を答えよ。
模範解答
選択肢ア: あり
解説
部分関数従属性とは、複合キー(複数の属性からなる候補キー)の「一部」だけで、他の非キー属性が一意に決まる関係のことです。
関係「加盟企業商品」の候補キーは や です。このうち、候補キーの一部である 加盟企業コード だけで、その企業の属性である 加盟企業名、契約開始日、契約終了日 が一意に決まります。
このように、候補キーの「全体」ではなく「一部」に従属している属性が存在するため、部分関数従属性は「あり」となります。
各選択肢の解説
- イ(なし): 候補キーの一部(加盟企業コードなど)によって一意に決まる属性群が存在するため誤りです。
部分関数従属性が「あり」の場合は,指定の表記法に従って,その関数従属性の具体例を一つ示せ。
模範解答
加盟企業コード→加盟企業名
加盟企業コード→契約開始日
加盟企業コード→契約終了日
横断分析用商品コード→横断分析用商品名
採点基準
- 2点: 部分関数従属性となる属性の組を正しく抽出できている。
- 1点: 部分的に正しいが、属性の抽出に軽微な誤りがある。
- 0点: 部分関数従属性を抽出できていない。
- 1点: 「属性 1 → 属性 2」の形式で正しく記述できている。
- 0点: 指定の形式に従っていない。
解説
関係「加盟企業商品」における候補キー または の真部分集合(一部)から関数従属する属性を見つけます。
加盟企業コード(候補キーの一部)から、加盟企業自体の属性である加盟企業名,契約開始日,契約終了日が決定されます。- また、候補キー の一部である
横断分析用商品コードから横断分析用商品名が決定されます。
これらを指定された表記法「属性 1 → 属性 2」に従って記述します。解答としてはこれらの中から1つを示せば正解となります。
高得点のポイント
- 複合キーの一部(加盟企業コード、あるいは横断分析用商品コード)から一意に決まる属性を正確に見つけ出せていること。
- 問題文の表にある「部分関数従属性」の表記法(属性 1 → 属性 2)に厳密に従って記述できていること。
関係“加盟企業商品”における推移的関数従属性の有無を答えよ。
模範解答
選択肢ア: あり
解説
推移的関数従属性とは、X → Y かつ Y → Z が成り立ち、Y → X は成り立たない(Y を経由して Z が決まる)関係のことです。
関係「加盟企業商品」において、候補キー から、単独では候補キーにならない 横断分析用商品コード が決まり、その 横断分析用商品コード から 横断分析用商品名 が一意に決まります。
横断分析用商品コードを経由した関数従属性が存在するため、推移的関数従属性は「あり」となります。
各選択肢の解説
- イ(なし): 属性の間に推移的な依存関係が存在するため誤りです。
推移的関数従属性が「あり」の場合は,指定の表記法に従って,その関数従属性の具体例を一つ示せ。
模範解答
{加盟企業コード, 加盟企業商品コード}→横断分析用商品コード→横断分析用商品名
採点基準
- 2点: 推移的関数従属性となる属性の組を正しく抽出できている。
- 1点: 部分的に正しいが、属性の抽出に軽微な誤りがある。
- 0点: 推移的関数従属性を抽出できていない。
- 1点: 複合属性を{}でくくるなど、指定された表記法に完全に一致している。
- 0点: 指定の形式に従っていない。
解説
設問2(1)〜(4)の考察の通り、候補キー → 横断分析用商品コード → 横断分析用商品名(横断分析用商品コードは候補キーを決定しない)という関係を記述します。
具体的には、候補キー から 横断分析用商品コード が決定し、さらに 横断分析用商品コード から 横断分析用商品名 が決定します。
指定された表記法「属性 3 → 属性 4 → 属性 5」に従い、複合属性は { } でくくって {加盟企業コード, 加盟企業商品コード} → 横断分析用商品コード → 横断分析用商品名 と記述します。
高得点のポイント
- 候補キーから横断分析用商品コードを経てさらに横断分析用商品名が決定されるという、3段階の関係性を正確に捉えられていること。
- 問題文の表にある「推移的関数従属性」の表記法(属性 3 → 属性 4 → 属性 5)に従い、複合属性を
{ }でくくって記述できていること。
関係“加盟企業商品”の候補キーのうち,主キーとして採用できないものはどれか答えよ。
模範解答
{加盟企業コード, 横断分析用商品コード}
採点基準
- 1点: 採用できない候補キーを正しく特定できている。
- 0点: 特定誤り、または解答内容が不適切である。
- 1点: 指定された形式で正しく記述できている。
- 0点: 記述形式に誤りがある。
解説
関係「加盟企業商品」の候補キーには と の2つがあります。
主キーの絶対条件として「値が必ず存在し、NULLにならないこと(エンティティ完全性)」があります。本文中の要件から、登録時点で値が確定しない可能性がある属性を含む候補キーは主キーとして採用できません。よって、採用できない候補キーは となります。
高得点のポイント
- 本文の記述(横断分析用商品コードの設定に遅れが生じる可能性)から、NULLになり得る属性を含んだ候補キーを特定できていること。
- 複合キーであることを示すため、指定通り
{ }でくくって解答できていること。
関係“加盟企業商品”の候補キーのうち,主キーとして採用できない理由を45字以内で具体的に述べよ。
模範解答
横断分析用商品コードは加盟企業商品が登録された後に設定される場合があるから
採点基準
- 1点: 商品の登録時点では値が設定されない(NULLになる)可能性があることを正しく指摘できている。
- 0点: 理由の指摘が不適切、または不十分である。
- 1点: 指定された文字数以内で、理由を論理的かつ簡潔な文章で表現できている。
- 0点: 文章が非論理的であるか、意味が通じない。
解説
主キーを構成する属性には、原則として NULL を設定できません(エンティティ完全性制約)。
〔ポイントシステムの概要〕3.(2)③に「横断分析用商品コードの設定には,加盟企業商品の登録から数日を要する場合がある」と記載されています。つまり、加盟企業商品をシステムに登録する時点では 横断分析用商品コード が未定(NULL)になる可能性があり、主キーとしての条件を満たしません。この理由を字数制限内にまとめます。
高得点のポイント
- 「登録から数日を要する場合がある」という業務要件を、主キーの「NULL不可」の制約と結びつけて理解できていること。
- 指定された字数(45字以内)の範囲内で、要点を論理的かつ簡潔な文章で表現できていること。
関係“加盟企業商品”は第1正規形,第2正規形,第3正規形のうち,どこまで正規化されているか答えよ。
模範解答
第1正規形
採点基準
- 1点: 現在の状態が第1正規形であることを正しく判定できている。
- 0点: 判定に誤りがある。
- 1点: 適切な用語を用いて解答できている。
- 0点: 解答の形式が不適切である。
解説
関係「加盟企業商品」には、1つの行に複数の値が入るような繰り返し項目は存在しないため、「第1正規形」の条件は満たしています。
しかし、設問2(1)の解答の通り、候補キーの一部である 加盟企業コード だけで 加盟企業名 などが一意に決まる「部分関数従属性」が存在しています。部分関数従属性が残っている関係は、第2正規形の条件を満たしていません。
したがって、現在の関係は「第1正規形」まで正規化されている状態です。
高得点のポイント
- 正規形(第1、第2、第3)のそれぞれの定義を正しく理解し、現在の関係における関数従属性(部分関数従属性の存在)に基づいて正確な判定を下せていること。
関係“加盟企業商品”が第3正規形でない場合は,第3正規形に分解し,関係スキーマを示せ。ここで,分解後の関係の関係名には,本文中の用語を用いること。
なお,主キーを構成する属性の場合は実線の下線を,外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
加盟企業(加盟企業コード(主キー), 加盟企業名, 契約開始日, 契約終了日)
加盟企業商品(加盟企業コード(主キー), 加盟企業商品コード(主キー), 横断分析用商品コード(外部キー), 加盟企業商品名, JANコード)
横断分析用商品情報(横断分析用商品コード(主キー), 横断分析用商品名)
(原図の実線の下線を(主キー)、破線の下線を(外部キー)と記す。加盟企業商品の加盟企業コードは主キーの一部が外部キーを兼ねるので破線を付けない)
採点基準
- 1点: 3つの関係に過不足なく分解している(加盟企業{加盟企業コード, 加盟企業名, 契約開始日, 契約終了日}、加盟企業商品{加盟企業コード, 加盟企業商品コード, 横断分析用商品コード, 加盟企業商品名, JANコード}、横断分析用商品情報{横断分析用商品コード, 横断分析用商品名})。関係の順序・属性の並び順は問わない。
- 0点: 分割に誤りがあるか、属性の配置に不足や誤りがある。
- 1点: 関係名が本文中の用語(加盟企業・加盟企業商品・横断分析用商品情報、又は横断分析用商品)であり、キーを示した場合はそれが正しい(主キー: 加盟企業コード / {加盟企業コード, 加盟企業商品コード} / 横断分析用商品コード、外部キー: 加盟企業商品の横断分析用商品コード)。キーは「(主キー)」「(外部キー)」「主キー: …」等の注記で読み、注記が無い解答や、加盟企業商品の加盟企業コードに外部キーの注記を重ねた解答も減点しない。
- 0点: 関係名が不適切であるか、主キーを誤って指定したもの(例: 加盟企業商品の主キーに横断分析用商品コードを含めるなど)。
解説
第1正規形の関係を第3正規形にするためには、データの重複や更新時の矛盾を防ぐため、部分関数従属性と推移的関数従属性を排除してテーブルを分割します。
部分関数従属性の排除(第2正規形へ):
加盟企業コードのみに従属する属性群を別テーブルにします。加盟企業(加盟企業コード(主キー), 加盟企業名, 契約開始日, 契約終了日)推移的関数従属性の排除(第3正規形へ):
横断分析用商品コードに従属する属性群を別テーブルにします。横断分析用商品情報(横断分析用商品コード(主キー), 横断分析用商品名)残りの属性(加盟企業商品の本体):
分離した属性を取り除き、外部キーを残して元のテーブルを再構成します。加盟企業商品(加盟企業コード(主キー), 加盟企業商品コード(主キー), 横断分析用商品コード(外部キー), 加盟企業商品名, JANコード)
(※順序は問いませんが、属性が不足なく含まれ、主キーと外部キーの指定が正しい必要があります。なお、加盟企業商品の加盟企業コードは主キーの一部が外部キーを兼ねるので破線の下線は付けません)
高得点のポイント
- 部分関数従属と推移的関数従属を正しく排除し、論理的な矛盾のない3つの関係に分割できていること。
- 分解後の関係名に「加盟企業」「横断分析用商品情報」等の本文中の用語を用いていること。
- 主キーに実線の下線、外部キーに破線の下線を付けるという指定を正確に守っていること。
設問2(1)は,全体的に正答率は平均的であったが,候補キーの“{加盟企業コード, 横断分析用商品コード}”を“横断分析用商品コード”と答えてしまうなど,候補キーとは何かを正しく理解できていない解答が多く見られた。推移的関数従属性の具体例については“横断分析用商品コード→横断分析用商品名”の部分しか書けていない解答が多く見られた。正規化理論の基礎を十分理解するようにしてほしい。
日次バッチの集計処理では,付与ポイントの記録がポイント残高に加算されない場合がある。それはどのような場合か。本文中の用語を用いて30字以内で述べよ。
模範解答
購入の翌日以降にポイントの後付けをしたとき
採点基準
- 2点: 日付の不整合を正しく理解し、抽出漏れとなるケースを正確に特定できている。
- 1点: 抽出漏れが起きる状況を大まかに理解しているが、要素が不足している。
- 0点: 要件を正しく読み取れていない。
- 2点: 本文中の用語を適切に用い、指定文字数以内で簡潔かつ論理的に説明できている。
- 1点: 説明は論理的だが、本文中の用語の不使用、または文章構造にやや難がある。
- 0点: 説明が非論理的であるか、指定の条件を大きく逸脱している。
解説
〔ポイントの概要〕4.(1)において、日次バッチの抽出条件は「支払日時が前日の分」と規定されています。
一方、5.(1)(2)の「ポイントの後付け」手続きでは、会員が後日レシートを持参した際にポイント付与の記録が作成されますが、「付与ポイントの記録は,レシートが発行された日時の記録となる」とされています。
つまり、購入日の「翌日以降」にポイントの後付けが行われた場合、作成された記録の「支払日時」はバッチ処理の前日より過去の日付になってしまいます。その結果、「前日の分」という日次バッチの抽出条件に合致せず、抽出から漏れてしまい、ポイント残高に加算されなくなります。
高得点のポイント
- 日次バッチの抽出条件(前日分)と、ポイント後付け処理における日付記録ルール(過去日付での記録)の間の不整合に気づき、具体的な抽出漏れのケースを特定できていること。
- 「ポイントの後付け」という本文中の用語を必ず用い、30字以内で端的に状況を説明できていること。
付与ポイントの記録をポイント残高に正しく加算するために,日次バッチの処理を変更することにした。この処理に用いる属性を,関係“支払”に一つ追加した。その属性の役割を30字以内で述べよ。
模範解答
ポイント残高に加算済みかどうかを判別する。
ポイント残高への加算処理日が分かるようにする。
付与ポイントの記録を作成した日で抽出できるようにする。
採点基準
- 2点: 公式3例のいずれかの役割(①加算済みかどうかの判別、②加算処理日が分かる、③支払日時ではなく付与ポイントの記録を作成した日で抽出できる)を正確に理解できている。
- 1点: 加算漏れ防止の方向であることは読み取れるが、どの役割かあいまいである。
- 0点: 上記以外。
- 2点: 指定された文字数以内で、論理的かつ簡潔な文章で表現できている。
- 1点: 文章構造にやや難がある。
- 0点: 説明が非論理的であるか、意味が通じない。
解説
設問3(1)で指摘したように、「支払日時」を基準にして日次バッチの抽出を行うと、過去の支払日時で記録されるポイント後付け分が抽出漏れを起こします。
この問題を解消し、全ての付与ポイント記録を確実に1回ずつ残高に加算するためには、ポイント残高に加算済みかどうかや加算処理日といった処理状態を持たせる方法と、付与ポイントの記録を作成した日を持たせる方法があります。
具体的には「加算済フラグ」や「加算処理日」などの属性を追加し、バッチ処理で未処理のものを漏れなく抽出して処理後にフラグを更新するか、記録作成日の属性を追加し、日次バッチは作成日が前日の記録を抽出するという仕組みに変更します。解答ではこの属性の役割を30字以内で記述します。
高得点のポイント
- 抽出漏れや重複加算を防ぐため、レコード単位で処理状態(加算済みかどうか)を管理するフラグや日付属性の必要性を理解できていること。
- 追加した属性がシステム上どのような目的で利用されるかを、30字以内で過不足なく表現できていること。