ホーム > データベーススペシャリスト試験 > 2021年
データベーススペシャリスト試験 2021年 午後1 問01
データベース設計に関する次の記述を読んで、設問1〜3に答えよ。
B社は,複数の加盟企業向けに共通ポイントサービスを運営している。 今回、その基盤のシステム (以下, ポイントシステムという)を再構築することになり、 データベース設計を開始した。
〔ポイントシステムの概要〕
1.会員
会員は, B社が発行したポイントカードの利用者であり, 会員コードで識別する。
2.加盟企業
(1) 加盟企業は, B社と共通ポイントサービス加盟の契約をした企業であり, 加盟企業コードで識別する。 コンビニエンスストア, レストランチェーンなど様々な業種の企業がある。 同じ加盟企業と複数回の契約をすることはない。
(2) 加盟企業は複数の店舗をもつ。 店舗は, 加盟企業コードと店舗コードで識別する。
3.加盟企業商品と横断分析用商品情報
(1) 加盟企業商品
① 加盟企業が販売する商品を, B社から見て加盟企業商品と呼ぶ。
② 加盟企業は,商品をポイントシステムに登録するときに,当該加盟企業の商品コード(以下,加盟企業商品コードという), 商品名(以下, 加盟企業商品名という), JANコードを登録する。 加盟企業商品は,加盟企業コードと加盟企業商品コードで識別する。
③ 加盟企業商品コードは再利用されないが, 加盟企業商品名と JANコードは再利用されることがある。 また, JANコードが設定されない商品もある。
(2) 横断分析用商品情報
① 横断分析用商品情報は,複数の加盟企業が同じ商品を扱っている場合に同一商品であると認識できるようにするものである。 横断分析用商品情報には,横断分析用商品コードと横断分析用商品名を設定し, 横断分析用商品コードで識別する。 横断分析用商品名は一意になるとは限らない。
② B社は, 加盟企業商品が追加される都度, 既に同じ商品の横断分析用商品が-登録済みかどうかを確認し, 登録済みと判断すればその横断分析用商品コードを登録済みでないと判断すれば新たな横断分析用商品コードを加盟企業商品に設定する。
③ 横断分析用商品コードの設定には, 加盟企業商品の登録から数日を要する場合がある。
〔ポイントの概要〕
1.ポイント
ポイントは,加盟企業の販促のために会員に与える点数である。
2.ポイントの利用
(1) 会員は,自分のポイント残高を上限として、購入金額の一部又は全てをポイントで支払うことができる。 利用したポイント (以下, 利用ポイントという)は,支払時にポイント残高から減算する。
(2) ポイントは、 全ての加盟企業の店舗で利用できる。
(3) 利用ポイントを支払ごとに記録する。 1回の支払はレシート番号で識別する。
3.ポイントの付与
(1) 会員がポイントカードを提示して支払をすると, その支払で付与するポイントを記録する。 ポイントカードの提示がなければこの記録を作成しない。
(2) 付与ポイントを記録した時点では, 付与ポイントの記録は会員のポイント残高に加算しない。 ポイント残高への加算は後述の日次バッチで行う。
(3) ポイントには、商品ごとの購入金額に対して付与するものと, 支払方法ごとの支払金額に対して付与するものがある。
① 購入商品ごとの付与ポイント
・商品の購入金額 (購入数×商品単価) にポイント付与率を乗じて計算する。
・ポイント付与率は,通常は全加盟企業共通で決められている基準ポイント付与率を適用するが, 後述のクーポンの利用によって変わることがある。
②支払方法ごとの付与ポイント
・支払においては, 現金, ポイント利用, 電子マネー利用など, 1 回の支払で複数の支払方法を併用できる。
・支払方法ごとの付与ポイントは,各支払方法での支払金額に、ポイント付与率を乗じて計算する。
・各支払方法に対するポイント付与率は, ポイント設定で決めている。 ポイント設定はポイント設定コードで識別し, ポイント付与率, 適用期間をもつ。ポイントを付与する支払方法にポイント設定を対応付ける。 同じポイント設定を、複数の支払方法に対応付けることがある。
(4) 付与ポイントは,小数第3位まで記録する。
(5) 会員がポイントで支払った分にもポイントを付与する。
4.付与ポイントのポイント残高への加算
(1) 毎日午前0時を過ぎると, 支払ごとの付与ポイントの記録から,支払日時が前日の分を日次バッチで抽出し, 集計して会員のポイント残高に加算する。
(2) 購入商品ごとの付与ポイントと支払方法ごとの付与ポイントを加算し, 小数点以下を切り捨てたものが支払全体の付与ポイントとなる。
5.ポイントの後付け
(1) 会員がポイントカードを忘れた場合, 会員が申告すると店員は支払時のレシートに押印する。 会員がこのレシートを1か月以内にこの店舗に持って行き, ポイントカードを提示すると、 その支払で付与するポイントを記録する。
(2) 付与ポイントの記録は,レシートが発行された日時の記録となる。
〔クーポンの概要〕
1.クーポン
(1) B社は,クーポンという販促手段を用意している。 加盟企業は、自社の店舗に会員を呼び込むために, クーポンを企画する。
(2) クーポンは, 会員に配布する紙片である。 会員が支払時にクーポンを提示すると、クーポンに設定されたポイント付与率を適用する。 店舗は,提示されたクーポンを回収する。
(3) クーポンの企画単位にクーポンコードを付与する。
(4) クーポンは, 企画した加盟企業の店舗だけで利用できる。
(5) クーポンには、 利用期間を設定している。
(6) 設定できるクーポンには, 適用対象となる店舗を限定したクーポン, 適用対象となる商品を限定したクーポン,及び,店舗も商品も限定しないクーポンがある。 ただし, 商品の購入数を限定したクーポンは設定できない。
(7) 会員は,クーポンコードが異なる複数のクーポンを1回の支払で利用できる。
(8) クーポンの効果を測るために, クーポンがどの支払で利用されたか分かるように記録する。
2.クーポンの配布方法
(1) クーポンを企画した加盟企業は, B社に料金を支払い, クーポンの配布対象にしたい会員の抽出条件をB社に伝える。
(2) 会員の抽出は, 支払時のポイント付与の記録を用いて行う。 抽出条件には,ある期間に特定の店舗を利用した, 特定の商品を一定以上の金額分購入した,特定の支払方法で一定以上の金額を支払った, などがある。
(3) B社は,条件に合う会員を抽出し, クーポン配布リストとして登録する。 会員の抽出は, 日次バッチで行う。
(4) クーポン配布リストに登録されている会員が,全加盟企業のいずれかの店舗を利用した場合に,クーポンを発行する。 同じ会員に同じクーポンを2回発行することはない。
(5) クーポンには,配布上限数と配布期間を設定している。
〔概念データモデルと関係スキーマの設計〕
概念データモデルを図1に, 関係スキーマを図2に示す。


解答に当たっては, 巻頭の表記ルールに従うこと。 ただし, エンティティタイプ間の対応関係にゼロを含むか否かの表記は必要ない。
なお, エンティティタイプ間のリレーションシップとして “多対多” のリレーションシップを用いないこと。 エンティティタイプ名及び属性名は,それぞれ意味を識別できる適切な名称とすること。
設問1(1):図1,2について,(1),(2)に答えよ。
図2中の(a)〜(k)に入れる適切な属性名を答えよ。なお, 主キーを構成する属性の場合は実線の下線を、外部キーを構成する属性の場合は破線の下線を付けること。(a, bは順不同、h, iは順不同、j, kは順不同)
模範解答
a:加盟企業コード
b:店舗コード
c:支払金額
d:購入数
e:ポイント設定コード
f:ポイント付与率
g:配布上限数
h:クーポンコード
i:会員コード
j:クーポンコード
k:レシート番号
解説
1. 核心となるキーワードと論点整理
本問の核心は,「図2 関係スキーマ(未完成)」中の未定義属性(a~k)を,論理データモデルから導出して適切な属性名とキー種別を明示することにあります。
主な論点は以下のとおりです。
主な論点は以下のとおりです。
- 各リレーションがどのエンティティを表し,どのリレーションと結合されるか
- 外部キー参照の対象リレーションと対応する候補属性
- 主キー構成属性の判別
- 問題文中の用語と図2の属性名の整合
2. 解答の論理的説明
以下,(a)~(k)それぞれについて,問題文の記述を引用しながら解説します。
-
支払 リレーションの
(a),(b)
支払には「レシート番号」「会員コード」に加え,どの店舗で支払ったかを識別する必要があります。
問題文より,「店舗は, 加盟企業コードと店舗コードで識別する。」
したがって,支払リレーションに加えるべき未定義属性は加盟企業コード
店舗コード
の2つです。これらは「店舗」リレーションの主キーを参照する外部キーとなるため,破線下線で示します。
-
支払方法明細 リレーションの
(c)
問題文より,「ポイントの利用…利用ポイントは, 支払時にポイント残高から減算する。」
しかし支払方法明細では「各支払方法での支払金額にポイント付与率を乗じて計算する」という記述から,
支払方法明細には「支払金額」を記録する必要があります。よって(c)
は支払金額
です。
-
購入商品明細 リレーションの
(d)
問題文より,「商品の購入金額 (購入数×商品単価) にポイント付与率を乗じて計算する。」
「購入商品明細」には何個購入したかを記録する「購入数」が必要です。よって(d)
は購入数
です。
-
支払方法 リレーションの
(e)
問題文より,「各支払方法に対するポイント付与率は, ポイント設定で決めている。ポイント設定はポイント設定コードで識別し, ポイント付与率, 適用期間をもつ。」
従って「支払方法」リレーションには,どのポイント設定を適用したかを示す外部キーとしてポイント設定コード
が必要です。破線下線で示します。
-
ポイント設定 リレーションの
(f)
問題文より,「ポイント設定は…ポイント付与率, 適用期間をもつ。」
したがって,未定義属性はポイント付与率
です。
-
クーポン設定 リレーションの
(g)
問題文より,「クーポンには, 配布上限数と配布期間を設定している。」
よって配布上限数
が未定義属性に対応します。
-
クーポン配布 リレーションの
(h),(i)
問題文より,「同じ会員に同じクーポンを2回発行することはない。」
をもって,主キーは(クーポンコード, 会員コード)
の組合せです。よってクーポンコード
(主キー)会員コード
(主キー,かつ「会員」リレーション参照の外部キー)
の2属性となります。
-
クーポン利用 リレーションの
(j),(k)
問題文より,「会員が支払時にクーポンを提示すると…クーポンがどの支払で利用されたか分かるように記録する。」
よって主キーは,クーポンコード
レシート番号
の組合せで,それぞれ「クーポン設定」「支払」リレーションを参照する外部キーにもなります。
以上をまとめると,下表のとおりです。
3. 誤りやすいポイント
- 支払リレーションで
(a),(b)
を「会員に紐付く支払」と混同し,会員コード
を二重で入れがち。実際は店舗情報を表す別属性です。 - 支払方法明細
(c)
と「利用ポイント」を混同し,利用ポイント
とするとポイント消費量を記録してしまい誤り。 - クーポン関係で主キーを忘れ,「配布日時」を含めてしまうケース。ですが「同じ会員に同じクーポンを2回発行しない」前提があるため,配布日時は主キーには不要です。
4. 試験対策まとめ
- 実体‐関係モデルから関係スキーマに落とし込む際, 主キー と 外部キー の区別を明確に!
- 「何を識別するためのキーか」「どのリレーションを参照する外部キーか」を,問題文の「識別する」「参照する」記述から正確に読み取る。
- クーポンやポイントの付与など複数のバッチ処理が関わる場合でも,スキーマ設計の観点では 識別子 と 参照先 の関係に着目する。
- 誤りやすいのは「属性名が似ているもの」「主キーか外部キーかのケアレスミス」。一度書いたら「この属性はなにを参照して,主キーに含まれているか」を必ずセルフチェックする習慣を。
設問1(2):図1,2について,(1),(2)に答えよ。
図1のリレーションシップは未完成である。必要なリレーションシップを全て記入し、図を完成させよ。
なお,図に表示されていないエンティティタイプは考慮しなくてよい。
模範解答

解説
模範解答の核心キーワードと論点
なぜその解答になるのか──論理的根拠の引用と解説
以下、関係性ごとに【問題文】の記述を引用しながら説明します。
-
クーポン設定→クーポン設定対象店舗→店舗
- 「クーポンは,企画した加盟企業の店舗だけで利用できる」
- エンティティ「クーポン設定」と「店舗」を直接結べないため,中間エンティティ「クーポン設定対象店舗」を介して
- クーポン設定対象店舗.(クーポンコード)→クーポン設定.(クーポンコード)
- クーポン設定対象店舗.(加盟企業コード,店舗コード)→店舗.(加盟企業コード,店舗コード)
-
クーポン設定→クーポン配布→会員
- 「クーポン企画単位にクーポンコードを付与する」「クーポン配布リストに登録されている会員が…クーポンを発行する」
- よって
- クーポン配布.(クーポンコード)→クーポン設定.(クーポンコード)
- クーポン配布.(会員コード)→会員.(会員コード)
-
クーポン設定→クーポン利用→支払
- 「会員は,クーポンを提示するとポイント付与率を適用する」「クーポンがどの支払で利用されたか分かるように記録する」
- よって
- クーポン利用.(クーポンコード)→クーポン設定.(クーポンコード)
- クーポン利用.(レシート番号)→支払.(レシート番号)
-
支払→店舗
- 「会員は…店舗で利用できる」「支払はレシート番号で識別する」および図2の未定義属性[a][b]は「加盟企業コード,店舗コード」
- よって
- 支払.(加盟企業コード,店舗コード)→店舗.(加盟企業コード,店舗コード)
-
支払→支払方法明細/購入商品明細
- 支払明細は「支払方法明細」「購入商品明細」に分かれる(図1中央フロー)
- よって
- 支払方法明細.(レシート番号)→支払.(レシート番号)
- 購入商品明細.(レシート番号)→支払.(レシート番号)
-
購入商品明細→加盟企業商品
- 「加盟企業商品は…加盟企業商品コードで識別」「購入商品明細に加盟企業コード,加盟企業商品コードを持つ」
- よって
- 購入商品明細.(加盟企業コード,加盟企業商品コード)→加盟企業商品.(加盟企業コード,加盟企業商品コード)
-
支払方法明細→支払方法
- 「支払方法ごとの付与ポイントは…支払方法コードで識別」「支払方法明細に支払方法コードを持つ」
- よって
- 支払方法明細.(支払方法コード)→支払方法.(支払方法コード)
-
支払方法⇔ポイント設定(M:Nの解消)
- 「ポイント設定は…ポイント付与率,適用期間をもつ。ポイントを付与する支払方法にポイント設定を対応付ける。同じポイント設定を,複数の支払方法に対応付けることがある」
- ERモデリングでは多対多は認められないため,
- 支払方法とポイント設定を中間エンティティ(例:支払方法ポイント設定)でつなぎ,
- 支払方法ポイント設定.(支払方法コード)→支払方法.(支払方法コード)
- 支払方法ポイント設定.(ポイント設定コード)→ポイント設定.(ポイント設定コード)
リレーションごとの外部キーまとめ
受験生が誤りやすいポイント
- 図2の未定義[a][b]を見落とし,「支払」に店舗識別情報が必要なことを忘れる。
- 購入商品明細と加盟企業商品は複合キー(加盟企業コード+加盟企業商品コード)で結ぶこと。
- 支払方法とポイント設定の M:N をそのまま「多対多リレーションシップ」で記述しない。必ず中間エンティティで解消する。
- クーポン関連のエンティティ(設定→対象店舗→店舗、配布→会員、利用→支払)の結びつきを一つでも欠けると受付されない。
試験対策として覚えておくべきポイント
- ER図で「多対多」は使わず,中間エンティティで1:N×N:1に分解する。
- 複合キーのリレーションでは,主キーだけでなく全てのキー属性を外部キーとして参照する。
- 業務要件を読むとき,「どのエンティティのどの属性がリレーションシップの鍵になるか」「実体どうしを橋渡しする中間テーブルが必要か」を常に意識する。
- 図2の空欄(a~k)が何を指すかを要件文に当てはめて特定する練習をしておく。
設問2(1):図2中の関係 “加盟企業商品” について(1)〜(3)に答えよ。
関係“加盟企業商品” の候補キーを全て答えよ。 また, 部分関数従属性, 推移的関数従属性の有無を,答案用紙のあり・なしのいずれかを○で囲んで示せ。“あり”の場合は,次の表記法に従って, その関数従属性の具体例を一つ示せ。
なお、候補キー及び表記法に示されている属性1,属性3,属性4が複数の属性から構成される場合は,{}でくくること。

模範解答
候補キー:{ 加盟企業コード, 加盟企業商品コード }
{ 加盟企業コード, 横断分析用品商品コード }
部分関数従属性:
有無:あり
具体例:加盟企業コード → 加盟企業名
加盟企業コード → 契約開始日
加盟企業コード → 契約終了日
横断分析用品商品コード → 横断分析用品名
推移的関数従属性
有無:あり
具体例:{ 加盟企業コード, 加盟企業商品コード } → 横断分析用品商品コード → 横断分析用品名
解説
核心となるキーワード・論点
- 候補キー
最小性を満たす superkey。関係スキーマのすべてのタプルを一意に識別でき、かつどれかを削ると一意性を失う組み合わせ。 - 部分関数従属性
複合キーの一部から非キー属性が関数従属している場合。 - 推移的関数従属性
キー属性 → 非キー属性A → 非キー属性B のように,非キー属性Aを介して別の非キー属性Bが従属している場合。
解答の根拠・論理的説明
1. 関係スキーマの再掲
問題文の図2より,「加盟企業商品」リレーションは以下の属性から構成されます。
2. 候補キーの検討
- 問題文に「加盟企業商品は,加盟企業コードと加盟企業商品コードで識別する。」とある通り,
{加盟企業コード, 加盟企業商品コード} は一意にタプルを識別できます。 - さらに「横断分析用商品情報には…横断分析用商品コードで識別する。」「登録済みと判断すればその横断分析用商品コードを…加盟企業商品に設定する。」という記述から,
同一の商品を扱う複数の加盟企業商品でも「横断分析用商品コード」は同じになるため,
{加盟企業コード, 横断分析用商品コード} もタプルを一意に識別できます。 - それ以外の組み合わせでは,JANコードや商品名は再利用される場合があり,最小性を保った一意性が担保できないため,以下の2つが候補キーとなります。
- {加盟企業コード, 加盟企業商品コード}
- {加盟企業コード, 横断分析用商品コード}
3. 部分関数従属性の有無と具体例
- 複合キーの一部(=部分)から非キー属性が決まる関係が存在するか?
- 実際に存在するので「あり」に○。具体例として,以下のような従属性があります。
- 「加盟企業コード→加盟企業名」
―「加盟企業は…加盟企業コードで識別する」かつ「加入企業1つに対し加盟企業名は一意」 - 「加盟企業コード→契約開始日」「加盟企業コード→契約終了日」
- 「横断分析用商品コード→横断分析用商品名」
―「横断分析用商品コードで識別する」ので同コードの横断分析用商品名は一意
- 「加盟企業コード→加盟企業名」
4. 推移的関数従属性の有無と具体例
- キー属性→非キー属性A→非キー属性B の形を探すと,以下があります。
- {加盟企業コード, 加盟企業商品コード} → 横断分析用商品コード → 横断分析用商品名
- よって「あり」に○。具体例を表記すると:
{加盟企業コード, 加盟企業商品コード}→横断分析用商品コード→横断分析用商品名
受験者が誤りやすいポイント
- 候補キーの最小性の見落とし
「横断分析用商品コード」単独をキーと誤認しやすいが,複数加盟企業の商品に同じコードを付与するため一意性が保てません。 - 部分関数従属性と推移的関数従属性の混同
- 部分従属性…複合キーの一部に依存
- 推移的従属性…キーから非キーAを経由して非キーBに依存
それぞれ定義を押さえ、具体例を整理しましょう。
試験対策として覚えておくべきポイント
- 複合キーの一部で決まる属性があれば「部分関数従属性あり」。非キー属性間の「仲介」をチェックして推移的があれば「推移的関数従属性あり」。
- 定義を暗記するだけでなく,設計図(ER図・関係スキーマ)から具体的な関数従属性を抜き出す練習を重ねること。
- 候補キーは「最小の属性集合で一意性を持つもの」を必ず確認する習慣をつけると誤りが減ります。
設問2(2):図2中の関係 “加盟企業商品” について(1)〜(3)に答えよ。
関係 “加盟企業商品” の候補キーのうち, 主キーとして採用できないものはどれか答えよ。 また, その理由を 45字以内で具体的に述べよ。
模範解答
採用できない候補キー:{ 加盟企業コード, 横断分析用品商品コード }
理由:横断分析用品商品コードは加盟企業商品が登録された後に設定される場合があるから
解説
1. 模範解答のキーワード・論点
- 候補キー
- 主キーに要求される「レコード登録時点で必ず値が設定されていること」
- 「横断分析用商品コードは後日設定される」属性は主キーに不適
2. 解答の理由
関係スキーマ「加盟企業商品」には,主キーにできる候補キーとして
が考えられます。
問題文には
問題文には
「横断分析用商品コードの設定には,加盟企業商品の登録から数日を要する場合がある」
とあり,
「B社は,加盟企業商品が追加される都度…登録済みでないと判断すれば新たな横断分析用商品コードを加盟企業商品に設定する」
と記載されています。主キーには「INSERT時に必ず値が確定している属性」を用いる必要があるため,後日設定される「横断分析用商品コード」を含む候補キーは採用できません。
3. 受験者が誤りやすいポイント
- 「横断分析用商品コードは一意に識別できるから主キーに使える」と考える
→ 一意性だけでなく 登録時点の NULL 禁止 も主キーの必須要件です。 - JANコードや加盟企業商品名をキー候補に挙げる
→ JANコードは「設定されない商品もある」「再利用されることがある」,商品名も再利用されるのでキーに不適です。
4. 試験対策として覚えておくべきポイント
- 主キーは 必ず一意かつ非 NULL の属性・属性集合から選ぶ
- 候補キーと主キーは,「レコード登録時点で確定している」 ことを確認する
- 業務要件で「後付け」「バッチ処理」で設定される属性は主キーに使わない
- 候補キー抽出の際は「属性の一意性」「NULL 許容」「設定タイミング」の3点を必ずチェックする
設問2(3):図2中の関係 “加盟企業商品” について(1)〜(3)に答えよ。
関係 “加盟企業商品” は第1正規形, 第2正規形, 第3正規形のうち,どこまで正規化されているか答えよ。 第3正規形でない場合は,第3正規形に分解し、関係スキーマを示せ。 ここで, 分解後の関係の関係名には,本文中の用語を用いること。
なお, 主キーを構成する属性の場合は実線の下線を, 外部キーを構成する属性の場合は破線の下線を付けること。
模範解答
正規形:第1正規形
関係スキーマ:加盟企業(加盟企業コード, 加盟企業名, 契約開始日, 契約終了日)
加盟企業商品(加盟企業コード, 加盟企業商品コード, 横断分析用品コード, 商品コード, 加盟企業商品名, JANコード)
横断分析用品商品情報(横断分析用品商品コード, 横断分析用品名)
解説
1. 模範解答のキーワード・論点整理
2. なぜその解答になるのか(問題文引用付きの論理説明)
2.1 主キーの確認
関係スキーマ「加盟企業商品」の主キーは
(加盟企業コード, 加盟企業商品コード)
と明示されている(図2より)。
(加盟企業コード, 加盟企業商品コード)
と明示されている(図2より)。
2.2 機能従属性の洗い出し
問題文中に次のような記述があります。
-
「同じ加盟企業と複数回の契約をすることはない。」
→ 加盟企業コードが決まれば、加盟企業名・契約開始日・契約終了日は一意に決まる。
⇒ (加盟企業コード) → {加盟企業名, 契約開始日, 契約終了日} -
「横断分析用商品情報には, … 横断分析用商品コードで識別する。」
→ 横断分析用商品コードが決まれば横断分析用商品名は一意。
⇒ (横断分析用商品コード) → {横断分析用商品名} -
「加盟企業商品は, 加盟企業コードと加盟企業商品コードで識別する。」
→ 主キー全体が決まればJANコード・加盟企業商品名・横断分析用商品コードが決まる。
⇒ (加盟企業コード, 加盟企業商品コード) → {JANコード, 加盟企業商品名, 横断分析用商品コード}
2.3 正規化判定
- 第1正規形:繰返し属性は無いので満たす。
- 第2正規形:主キーの一部(加盟企業コード)のみに依存する属性(加盟企業名など)があるため 不合格。
- 第3正規形:そもそも2NFを満たさないので当然 不合格。さらに横断分析用商品コード → 横断分析用商品名 という推移的従属も存在。
従って「第1正規形まで」と判断する。
2.4 第3正規形への分解
2NF,3NFを満たすように “部分従属” と “推移的従属” を切り離す。
※主キーは実線下線、外部キーは破線下線で表記するのが答案ルール。
3. 受験者が誤りやすいポイント
4. 試験対策のまとめ
-
第2正規形のチェック手順
① 主キーを部分的に決定する非キー属性が無いか探す。
② あればその部分キー+属性で別リレーションを作成。 -
第3正規形のチェック手順
① 2NFを満たしていることを確認。
② 非キー → 非キー の機能従属が無いかを探す(推移的従属)。
③ あれば従属先を別リレーションへ。 -
機能従属性の根拠は必ず “業務ルール” に求める。
問題文から根拠を抜き出す癖をつける。 -
答案記述の作法
・主キー:実線下線、外部キー:破線下線。
・関係名・属性名は「本文中の用語」を忠実に使用。
・分解後の関係が2つ以上ある場合、意味のまとまりを意識して命名。 -
ひっかけ回避
・「コード」属性があると大抵はそれが主キー。
・「〜は一意」「再利用しない」=決定性あり。
・「〜ごとに識別」=複合主キーの合図。
これらを押さえておけば、正規化問題で失点する可能性は大きく下げられます。
設問3(1):〔ポイントの概要〕 の4. で示した日次バッチについて,(1),(2)に答えよ。
日次バッチの集計処理では, 付与ポイントの記録がポイント残高に加算されない場合がある。 それはどのような場合か。 本文中の用語を用いて 30字以内で述べよ。
模範解答
購入の翌日以降にポイントの後付けをしたとき
解説
コアキーワードと論点整理
- 日次バッチ:「毎日午前0時を過ぎると,支払ごとの付与ポイントの記録から,支払日時が前日の分を日次バッチで抽出し,集計して会員のポイント残高に加算する。」
- ポイント後付け:「会員がポイントカードを忘れた場合…レシートが発行された日時の記録となる。」
- 対象外となる条件:ポイント後付けの「支払日時」が前日の期間に含まれない
なぜ「購入の翌日以降にポイントの後付けをしたとき」になるのか
- ポイント通常付与の場合
「支払ごとの付与ポイントの記録」は、支払日時が記録される。 - 日次バッチの抽出条件
「支払日時が前日の分」を抽出して、ポイント残高に加算する。 - ポイント後付けの場合
- 「付与ポイントの記録は,レシートが発行された日時の記録となる。」
- 会員が後日(購入の翌日以降)にレシートを持参してポイント後付けをすると、
レコードの支払日時は購入日の日時となる。 - その購入日は日次バッチの「前日」の範囲外になるため、抽出対象とならず、ポイント残高に加算されない。
受験者が誤りやすいポイント
- 「ポイント後付けは1か月以内」という期間条件に着目しやすいが、日次バッチが参照するのは“支払日時”
- 「後付けの申告日=支払日時」と誤解しやすいが、実際はレシート発行日時が支払日時として記録される
- 問われているのは「加算されない場合」であり、「後付けできる期間」ではない
試験対策として覚えておくポイント
- 日次バッチの集計対象は支払日時が前日のレコードであること
- ポイント後付け時の記録タイミングは「レシートが発行された日時」であること
- 購入翌日以降に登録された後付けは、支払日時のズレにより日次バッチで取り込まれない点を押さえること
設問3(2):〔ポイントの概要〕 の4. で示した日次バッチについて,(1),(2)に答えよ。
付与ポイントの記録をポイント残高に正しく加算するために, 日次バッチの処理を変更することにした。 この処理に用いる属性を, 関係 “支払” に一つ追加した。 その属性の役割を30字以内で述べよ。
模範解答
・ポイント残高に加算済みかどうかを判別する。
・ポイント残高への加算処理日が分かるようにする。
・付与ポイントの記録を作成し日で抽出できるようにする。
解説
模範解答の核心キーワード・論点整理
- 「ポイント残高に加算済みかどうかを判別する」→日次バッチで二重加算を防止
- 「ポイント残高への加算処理日が分かるようにする」→いつ処理したか記録
- 「付与ポイントの記録を作成日で抽出できるようにする」→抽出条件の明確化
解答がこれになる理由と論理的説明
問題文では、
「毎日午前0時を過ぎると, 支払ごとの付与ポイントの記録から, 支払日時が前日の分を日次バッチで抽出し, 集計して会員のポイント残高に加算する。」
とあります。
この仕組みのままだと、
- まだ加算していないレコードだけを抽出できない
- 過去に一度でも加算済みのレコードと区別がつかない
という課題が生じます。
そこで「関係 ‘支払’ に属性を一つ追加」し、
- 日次バッチ実行前後でレコードを区別(未加算/加算済み)
- 加算処理日を保持していつ処理したか分かる
ようにする必要があります。
受験者が誤りやすいポイント
- 「支払日時」だけで管理できると思い込む
→ 支払日時は支払いそのものの日付であり、加算の有無や処理日を示さない。 - 「付与ポイントの記録作成日」を使う案
→ レシート発行日とは異なる、バッチ処理のタイミングを別途管理する必要がある。 - 「利用ポイント」や「付与ポイント」を加工して代用しようとする
→ 実際のポイント付与額と処理状態は別次元の情報なので混同不可。
試験対策として覚えておくべき知識
- バッチ処理での「増分抽出」には必ず処理済み判別属性(フラグや処理日)が必要
- 「支払日時」「作成日時」「処理日時」はそれぞれ別の意味を持つ
- 再実行時にも安定して同じ結果を得るための「冪等性(べきとうせい)」設計
- データベース設計では、**業務的な状態管理(未処理・処理済み)**を属性として表現する