データベーススペシャリスト 2016年 午後1 問01
データベースの設計に関する次の記述を読んで、設問1〜3に答えよ。
C社は、主力事業である駐車場の運営が好調で、現在、事業の拡大に伴い、駐車場管理システムを再構築している。 その一環として、情報システム部のN君がデータベースの設計を行っている。
〔駐車場の概要〕
駐車場は、個々の自動車を駐車する場所として、駐車スペース(以下、車室という)に分けられている。 駐車場は、月極駐車場と時間貸駐車場のいずれかに分類される。
(1) 月極駐車場: 契約期間を定め、契約期間中は自由に入出庫できる駐車場
① 利用できるのは、契約した会員だけである。
② 契約は、会員がC社に契約書類を送付して初回の月額利用料金を振り込み、C社がそれらの内容を確認して、初めて成立する。
(2) 時間貸駐車場: 時間帯別に料金が定められ、利用の都度精算する駐車場
① 会員でなくても利用することができる。
② 利用者は、空いている車室に入庫し、出庫する際に精算機で利用料金を支払う。
③ 料金は、“月〜金8:00〜22:00 100円/20分” のように、曜日ごと時間帯ごとに定められている。 また、1日当たりの最大料金又は時間帯当たりの最大料金が定められている場合がある。
〔会員及びポイントの概要〕
駐車場の利用者は、氏名、住所などの情報を登録して会員になることができる。
(1) 会員登録を行うと、会員IDが記載された会員カードとパスワードが発行される。会員は、会員IDとパスワードを使用して、C社のWebサイトの会員専用ページにアクセスすることができる。
(2) 会員には、毎月の支払額(時間貸駐車場で会員カードを提示して支払った支払額+月極駐車場の支払額) に、所定の付与率を乗じて算出されたポイントが付与される。ポイントが付与されると、ポイント付与の基となった支払データに対して、ポイント付与済みであることが記録される。
(3) 会員は、ポイントを消費してポイント交換商品と交換することができる。 交換を行うと、付与年月が古いポイントから順に消費され、その内容が記録される。
〔Webサイトの概要〕
C社のWebサイトの利用者は、駐車場名、施設名、エリア名などで絞り込んで、駐車場の情報を検索することができる。
(1) 施設とは、Webサイトの地図上に表示され、検索が可能な建造物である。例えば、東京駅、〇〇病院、△△ホテルなどである。
(2) エリアとは、駐車場及び施設が属する一定の地域である。 例えば、新宿エリア、横浜エリアなどである。 駐車場及び施設は、いずれか一つのエリアに属する。
(3) 施設の分類をカテゴリという。 例えば、駅、病院、ホテルなどである。 施設は、いずれか一つのカテゴリに属する。
(4) 駐車場から徒歩圏内にある主要な施設を周辺施設という。 駐車場には、一つ又は複数の周辺施設が定められている。一つの施設は、複数の駐車場の周辺施設として定められる場合がある。
会員専用ページでは、駐車場利用履歴の閲覧、ポイント付与履歴の閲覧、ポイントの交換、ポイント交換履歴の閲覧などを行うことができる。 ポイント付与履歴画面の例を図1に、ポイント交換履歴画面の例を図2に示す。
↩設問3(2)
↩設問3(2)〔データモデルの設計 〕
N君は、概念データモデル (図3) 及び関係スキーマ (図4) の設計を行った。
図4の関係スキーマの主な属性とその意味・制約を、表1に示す。

設問1:関係“周辺施設” について、(1)、(2)に答えよ。
問題文を見る(1)関係“周辺施設” の候補キーを全て答えよ。 また、部分関数従属性、推移的関数従属性の有無を、“あり” 又は “なし”で答えよ。 “あり” の場合は、その関数従属性の具体例を一つ、次の表記法に従って示せ。
なお、候補キー及び表記法に示されている属性1、属性2が複数の属性から構成される場合は、{}でくくること。
なお、候補キー及び表記法に示されている属性1、属性2が複数の属性から構成される場合は、{}でくくること。模範解答
候補キー:{ 施設ID, 駐車場ID }、{ 施設経度、施設緯度、駐車場ID }
部分関数従属性の有無:あり
推移的関数従属性の有無:あり
部分関数従属性:施設ID → 施設名
施設ID → カテゴリコード
施設ID → 施設エリアコード
推移的関数従属性:施設ID → カテゴリコード → カテゴリ名
解説
解答の論理構成
- 周辺施設関係の構造把握
- 施設⇔駐車場が多対多で結合し、関係に “所要時間” などの関係属性を持つ。
- 施設側の一意性
- 【表1】より「施設緯度、施設経度…経度及び緯度を組み合わせた位置上に、駐車場又は施設が複数存在することはない。」
- したがって (施設経度、施設緯度) または 施設IDが施設の候補キー。
- 周辺施設レコードの一意化
- 【問題文】①より同一施設が複数の駐車場にひも付く。施設識別子だけでは関係行が重複するため、駐車場IDを加える必要がある。
- ゆえに候補キーは
{ 施設ID, 駐車場ID } と { 施設経度、施設緯度、駐車場ID }。
- 部分関数従属性の判定
- 候補キーが複合で、その一部 施設IDにのみ従う属性がある。例:
施設ID → 施設名、施設ID → カテゴリコード、施設ID → 施設エリアコード - よって“あり”。
- 候補キーが複合で、その一部 施設IDにのみ従う属性がある。例:
- 推移的関数従属性の判定
- さらに 施設ID → カテゴリコード かつ カテゴリコード → カテゴリ名 が成り立つ。
- これは 施設ID → カテゴリコード → カテゴリ名 の推移従属であり“あり”。
- 以上より模範解答の内容を導出できる。
誤りやすいポイント
- “施設IDは一意だからキーは施設IDだけで良い”と早合点し、駐車場との多対多を失念する。
- “経度+緯度が一意”の記述を読み飛ばし第2の候補キーを落とす。
- “カテゴリ名”の依存関係を部分従属と誤答(正しくは推移従属)。
- 部分従属の表記で { 施設ID, 駐車場ID } → 施設名 と書き、部分従属であることを示せていない。
FAQ
Q: 「周辺施設」に “所要時間” が入っているのに候補キーに含めなくて良いのですか?
A: はい。所要時間は駐車場と施設の対応関係が決まった後で決まる従属属性であり、識別に必要ありません。
A: はい。所要時間は駐車場と施設の対応関係が決まった後で決まる従属属性であり、識別に必要ありません。
Q: カテゴリコード を候補キーに使えないのはなぜ?
A: 1つのカテゴリに複数施設が属します。カテゴリだけでは施設を特定できないため候補キーにはなりません。
A: 1つのカテゴリに複数施設が属します。カテゴリだけでは施設を特定できないため候補キーにはなりません。
Q: 第3正規形にする場合の分割は?
A: 部分従属を解消して「施設」と「カテゴリ」を独立表にし、周辺施設関係にはキーだけを残すことで第3正規形に正規化できます。
A: 部分従属を解消して「施設」と「カテゴリ」を独立表にし、周辺施設関係にはキーだけを残すことで第3正規形に正規化できます。
関連キーワード: 正規化、候補キー、部分関数従属性、推移的関数従属性、関係スキーマ
設問1:関係“周辺施設” について、(1)、(2)に答えよ。
問題文を見る(2)関係 “周辺施設” は、第1正規形、第2正規形、第3正規形のうち、どこまで正規化されているか答えよ。 また、第3正規形でない場合は、第3正規形に分解し、主キー及び外部キーを明記した関係スキーマを示せ。
模範解答
正規形:第1正規形
関係スキーマ:
カテゴリ(カテゴリコード、カテゴリ名)
施設(施設ID、施設名、施設緯度、施設経度、カテゴリコード、施設エリアコード)
周辺施設(駐車場ID、施設ID、所要時間)
解説
解答の論理構成
- 主キーの把握
【問題文】の関係 “周辺施設” には “駐車場ID, 施設ID, 所要時間” が含まれます。駐車場と施設の組み合わせごとに “所要時間” が一意に決まるため、 主キー候補=“駐車場ID+施設ID” です。 - 部分関数従属の確認(2NF判定)
“施設ID → 施設名、施設緯度、施設経度、施設エリアコード、カテゴリコード” が成り立ち、これらは主キーの一部(施設ID)のみに従属します。
よって 第2正規形を満たさない。 - 推移関数従属の確認(3NF判定)
さらに “カテゴリコード → カテゴリ名” があり、非キー属性間での推移従属が発生します。従って 第3正規形も未達 となります。 - 分解手順
(i) “施設ID” が決める属性を切り離し、関係 施設 を生成
(ii) “カテゴリコード → カテゴリ名” を分離し、関係 カテゴリ を生成
(iii) 残りを “周辺施設” とし、主キーを “駐車場ID+施設ID” に保持 - 外部キー定義
・施設.カテゴリコード は カテゴリ.カテゴリコード への外部キー
・施設.施設エリアコード は エリア.エリアコード への外部キー(【問題文】“駐車場及び施設は、いずれか一つのエリアに属する。”)
・周辺施設.施設IDは 施設.施設IDへの外部キー
・周辺施設.駐車場IDは 駐車場.駐車場IDへの外部キー
以上で全属性が主キーに完全従属し、非キー属性間の推移従属が排除され、第3正規形が達成されます。 - 正規形の結論
分解前の “周辺施設” は、全ての属性が単一値をとるので第1正規形ですが、手順2の部分関数従属があるので第2正規形ではありません。したがって解答は「第1正規形」です。
誤りやすいポイント
- “カテゴリ名” を独立させず 施設 の列に残してしまい推移従属を温存する
- 主キーを誤って “駐車場ID+施設ID+カテゴリコード” としてしまい、部分従属を見落とす
- 所要時間 が “駐車場ID+施設ID” に従属することを忘れ、別表に分けてしまう
- 外部キーを明示せず減点される
FAQ
Q: “第2正規形” だけを満たす設計ではダメでしょうか?
A: ダメです。推移従属 “カテゴリコード → カテゴリ名” が残り、第3正規形の要件「非キー属性はキーに対してのみ従属」を破るためです。
A: ダメです。推移従属 “カテゴリコード → カテゴリ名” が残り、第3正規形の要件「非キー属性はキーに対してのみ従属」を破るためです。
Q: “施設エリアコード” はなぜ 施設 表に置くのですか?
A: 【問題文】“駐車場及び施設は、いずれか一つのエリアに属する。” とあるため、施設ごとに一意に決まる属性であり、主キーに部分従属するので 施設 表に移す必要があります。
A: 【問題文】“駐車場及び施設は、いずれか一つのエリアに属する。” とあるため、施設ごとに一意に決まる属性であり、主キーに部分従属するので 施設 表に移す必要があります。
Q: 経度・緯度は位置変更があると書かれていますが、正規化に影響しますか?
A: 更新可否は関係なく、関数従属の有無で判断します。経度・緯度は “施設ID → 施設緯度、施設経度” の従属を持つため、施設表にまとめるのが正規化の観点から妥当です。
A: 更新可否は関係なく、関数従属の有無で判断します。経度・緯度は “施設ID → 施設緯度、施設経度” の従属を持つため、施設表にまとめるのが正規化の観点から妥当です。
関連キーワード: 正規化、第1正規形、第2正規形、第3正規形、関数従属
(1)図4中の(a)〜(e)に入れる適切な属性名を答えよ。 また、主キー又は外部キーを構成する属性の場合、主キーを表す実線の下線、又は外部キーを表す破線の下線を付けること。(b, cは順不同)
模範解答
a:駐車場エリアコード
b:駐車場ID
c:会員ID
d:ポイント付与フラグ
e:会員ID
解説
解答の導き方
まず図4の空欄がどの関係(表)にあるかを確認し、問題文の記述と図4の属性一覧を突き合わせて決めます。以下は(a)〜(e)それぞれについて、図と本文のどの記述から導いたかを段階的に示します。
a(駐車場の表の空欄)
- 図4の駐車場には (a) の空欄があります。問題文には「駐車場及び施設は、いずれか一つのエリアに属する」とあり、エリアを一意に識別するのは「エリアコード」です。
- したがって、駐車場表はエリアを参照する属性を持つ必要があります。表の属性名として明示的に「駐車場」と結びつく名前にするのが分かりやすいため、(a) を 駐車場エリアコード とします。
- この属性はエリア表の主キー(エリアコード)を参照する外部キーなので、外部キーとして破線の下線を付けます。
- 回答:(a) 駐車場エリアコード(外部キー)
b, c(月極駐車場契約の空欄、順不同)
- 図4の月極駐車場契約には (b),(c) の空欄があります。問題文の月極駐車場の説明に「利用できるのは、契約した会員だけである」や「契約は、会員がC社に契約書類を送付して初回の月額利用料金を振り込み、C社がそれらの内容を確認して、初めて成立する」とあり、契約は「どの駐車場」と「どの会員」を結びつける情報であることが分かります。
- 図4に既に契約を一意に識別する属性として「契約番号」があるため、(b),(c) は駐車場と会員を参照する外部キーでよいです。属性名は図4で使われている名称をそのまま使います。
- 回答(順不同):(b) 駐車場ID(外部キー)、(c) 会員ID(外部キー)
d(月極駐車場利用の空欄)
- 図4の月極駐車場利用の最後の属性が (d) です。問題文に「ポイントが付与されると、ポイント付与の基となった支払データに対して、ポイント付与済みであることが記録される」とあり、支払データにポイント付与済みかどうかを示す属性が必要であることが明示されています。表1にも「ポイント付与フラグ」が意味・制約としてあります。
- したがって (d) は ポイント付与フラグ です(通常の属性で、ここでは主キー・外部キーには該当しません)。
- 回答:(d) ポイント付与フラグ
e(会員時間貸駐車場利用の空欄)
- 図4に「時間貸駐車場利用(駐車場ID, 利用連番, …)」と「会員時間貸駐車場利用(駐車場ID, 利用連番, (e), ポイント付与フラグ)」が並んでいます。時間貸駐車場利用は会員でない利用者の記録も含むため、利用の一意識別子は 駐車場ID+利用連番 であり、この組が時間貸駐車場利用の主キーです。問題文にも「時間貸駐車場: 会員でなくても利用することができる」とあります。
- 会員として利用した場合にのみ追加情報を持つのが会員時間貸駐車場利用なので、会員の識別子である 会員IDを (e) に入れ、会員表の主キーを参照する外部キーとします。ただし会員時間貸駐車場利用の主キーは元の利用を一意に示す 駐車場ID+利用連番 のままにしておき、会員IDは外部キーにとどめます(会員IDを主キーに含めると時間貸駐車場利用の参照整合性が保てなくなるため不適切)。
- 回答:(e) 会員ID(外部キー)
- 重要な明記:会員時間貸駐車場利用の主キーは 駐車場ID+利用連番 のままにする(会員IDは外部キーのみ)。
以上をまとめると、(a)〜(e) は次の通りです。b, cは順不同です。
- a:駐車場エリアコード(外部キー)
- b:駐車場ID(外部キー)
- c:会員ID(外部キー)
- d:ポイント付与フラグ
- e:会員ID(外部キー)
誤りやすいポイント
-
会員時間貸駐車場利用で会員IDを主キーに含める誤り
- 時間貸駐車場利用の主キーは駐車場ID+利用連番であり、会員時間貸駐車場利用はその利用に付随する情報を持つため、会員IDは外部キーで十分です。会員IDを主キーに含めると時間貸駐車場利用との参照が不整合になります。
-
駐車場とエリアの結びつきを忘れて (a) を空欄のままにする、あるいは不適切な名前(例:ただの「エリア名」)を入れる誤り
- 図4に「エリア(エリアコード, エリア名)」があるので、駐車場側にはエリアコードを参照する属性が必要です。属性名は設計方針で変えてよいが、参照先がエリアコードであることを明確にすること。
-
ポイント付与の扱いを誤る:ポイント集計表だけで支払データへのフラグを省略する誤り
- 問題文は「ポイントが付与されると、 ポイント付与の基となった支払データに対して、 ポイント付与済みであることが記録される」と書いているので、支払データ側(月極駐車場利用や会員時間貸駐車場利用)にフラグが必要です。
FAQ
Q: 会員時間貸駐車場利用の主キーは何にすべきですか?
A: 図4の設計意図に従い、主キーは 駐車場ID+利用連番 のままにします。時間貸駐車場利用が先に存在し(会員でない利用もあり得る)、会員時間貸駐車場利用はその利用に対する付加情報を保持するため、会員IDは外部キーとして扱います。
A: 図4の設計意図に従い、主キーは 駐車場ID+利用連番 のままにします。時間貸駐車場利用が先に存在し(会員でない利用もあり得る)、会員時間貸駐車場利用はその利用に対する付加情報を保持するため、会員IDは外部キーとして扱います。
Q: (a) は「エリアコード」でもよいですか?
A: 参照するキー自体はエリアの「エリアコード」なので、技術的には駐車場表の属性名を「エリアコード」としても整合性は取れます。ただし他表との区別や設計の明瞭性のために「駐車場エリアコード」のようにテーブル名を含めた属性名にするのが一般的で、どちらを採るかは命名規約に従ってください。
A: 参照するキー自体はエリアの「エリアコード」なので、技術的には駐車場表の属性名を「エリアコード」としても整合性は取れます。ただし他表との区別や設計の明瞭性のために「駐車場エリアコード」のようにテーブル名を含めた属性名にするのが一般的で、どちらを採るかは命名規約に従ってください。
Q: 支払データ側の「ポイント付与フラグ」はどの粒度で付ければよいですか?
A: 問題文の要件は「ポイント付与の基となった支払データに対して、ポイント付与済みであることが記録される」なので、支払単位(図4では月極駐車場利用のレコード、時間貸で会員カード提示した支払のレコード)ごとにフラグを持たせます。別途、月ごとの集計としてポイント付与テーブル(ポイント付与)が存在します。
A: 問題文の要件は「ポイント付与の基となった支払データに対して、ポイント付与済みであることが記録される」なので、支払単位(図4では月極駐車場利用のレコード、時間貸で会員カード提示した支払のレコード)ごとにフラグを持たせます。別途、月ごとの集計としてポイント付与テーブル(ポイント付与)が存在します。
関連キーワード: 正規化、参照整合性、外部キー、主キー、リレーショナル設計
(2)図3中のエンティティタイプ間のリレーションシップを全て記入せよ。
なお、図に表示されていないエンティティタイプは考慮しなくてよい。また、エンティティタイプ間の対応関係にゼロを含むか否かの表記は不要である。
模範解答

解説
解答の論理構成
- 会員と月極駐車場契約
- 【問題文】では「② 契約は、会員がC社に契約書類を送付して…」とあり、契約が必ず会員に紐付くことが示されています。よって「会員―月極駐車場契約」のリレーションシップを設定します。
- 会員と会員時間貸駐車場利用
- 時間貸駐車場は「① 会員でなくても利用することができる」と記載されています。会員が利用した場合のみポイント付与判定を行うため、会員をキーにした「会員時間貸駐車場利用」エンティティが必要です。したがって「会員―会員時間貸駐車場利用」で接続します。
- 駐車場と月極駐車場/時間貸駐車場
- 駐車場は「月極駐車場と時間貸駐車場のいずれかに分類される」と明記されており、スーパタイプ/サブタイプ構造を組みます。「駐車場―月極駐車場」「駐車場―時間貸駐車場」の2本を張ります。
- 月極駐車場と月極駐車場契約
- 契約は特定の月極駐車場に対して締結される(空き車室数の管理が必要)ため「月極駐車場―月極駐車場契約」のリレーションが生じます。
- 月極駐車場契約と月極駐車場利用
- 利用実績は契約単位で記録されるので「月極駐車場契約―月極駐車場利用」で接続します。
- 時間貸駐車場と時間貸駐車場利用
- 【問題文】「② 利用者は、空いている車室に入庫し…」から各利用は駐車場単位で管理されるため「時間貸駐車場―時間貸駐車場利用」が必要です。
- 時間貸駐車場利用と会員時間貸駐車場利用
- 会員利用分だけを切り出してポイント処理を行う設計なので、全利用(親)と会員利用(子)の間で「時間貸駐車場利用―会員時間貸駐車場利用」を関連付けます。
- 時間貸駐車場と時間帯別料金パターン
- 【問題文】「③ 料金は…曜日ごと時間帯ごとに定められている」とあり、駐車場ごとに複数パターンを持つため「時間貸駐車場―時間帯別料金パターン」とします。
- 時間帯別料金パターンと時間帯別料金設定曜日
- 曜日区分はパターンを細分化する属性群で、「時間帯別料金パターン―時間帯別料金設定曜日」を結びます。
以上をまとめると、図3のエンティティタイプ間リレーションシップは次の10本です。
- 会員―月極駐車場契約
- 会員―会員時間貸駐車場利用
- 駐車場―月極駐車場
- 駐車場―時間貸駐車場
- 月極駐車場―月極駐車場契約
- 月極駐車場契約―月極駐車場利用
- 時間貸駐車場―時間貸駐車場利用
- 時間貸駐車場利用―会員時間貸駐車場利用
- 時間貸駐車場―時間帯別料金パターン
- 時間帯別料金パターン―時間帯別料金設定曜日
誤りやすいポイント
- 「会員時間貸駐車場利用」を独立エンティティではなく単なる属性拡張と見なしてしまい、会員とのリレーションを欠落させる。
- 月極契約と月極利用の関係を「駐車場」と直接結び付けてしまい、契約単位の履歴管理ができなくなる。
- 「曜日区分」を時間帯別料金の単なる属性と誤認し、専用エンティティを設けない。
- 駐車場とサブタイプ(月極/時間貸)の全体―部分構造を書き忘れ、整合性制約(排他制御)が弱まる。
FAQ
Q: サブタイプ化するときのキー継承はどう処理しますか?
A: 「駐車場ID」がスーパタイプ「駐車場」の主キーなので、「月極駐車場」「時間貸駐車場」双方で同じ主キーを継承します。これにより排他性と参照整合性を同時に実現できます。
A: 「駐車場ID」がスーパタイプ「駐車場」の主キーなので、「月極駐車場」「時間貸駐車場」双方で同じ主キーを継承します。これにより排他性と参照整合性を同時に実現できます。
Q: 「時間貸駐車場利用」と「会員時間貸駐車場利用」を分ける利点は?
A: ポイント付与対象(会員利用)と非対象(一般利用)を論理的に分離することで、①ポイント計算ロジックが単純化する、②会員脱退時のデータ削除範囲を限定できる、など運用面のメリットがあります。
A: ポイント付与対象(会員利用)と非対象(一般利用)を論理的に分離することで、①ポイント計算ロジックが単純化する、②会員脱退時のデータ削除範囲を限定できる、など運用面のメリットがあります。
Q: 「時間帯別料金設定曜日」は正規化しなくても困らないのでは?
A: 単純な属性リストにすると、多対多(1パターンが複数曜日、1曜日が複数パターン)を表現できません。独立エンティティにすることでパターン―曜日の組合せを過不足なく保持できます。
A: 単純な属性リストにすると、多対多(1パターンが複数曜日、1曜日が複数パターン)を表現できません。独立エンティティにすることでパターン―曜日の組合せを過不足なく保持できます。
関連キーワード: 正規化, サブタイプ化, 参照整合性, 多対多リレーション, ポイント管理
設問3:関係 “ポイント付与”、“ポイント交換” について、(1)、(2)に答えよ。
問題文を見る(1)関係 “ポイント付与”、“ポイント交換” には、ポイント管理上の不具合がある。 不具合の内容を50字以内で具体的に述べよ。
模範解答
複数の付与年月のポイントを合算してポイント交換を行う場合、ポイントを消費したことを記録できない。
解説
解答の論理構成
- 業務要件の確認
- 【問題文】「交換を行うと、付与年月が古いポイントから順に消費され、その内容が記録される。」
⇒ 交換1件で複数の “付与年月” が対象になり得る。
- 【問題文】「交換を行うと、付与年月が古いポイントから順に消費され、その内容が記録される。」
- 現在の関係スキーマ
- “ポイント付与(会員ID, 付与年月、付与ポイント)”
- “ポイント交換(会員ID, 交換年月日、付与年月、商品コード、数量)”
⇒ 交換1件につき “付与年月” を1つしか保持できない。
- 発生する不具合
- 例)300pt消費で “2015-04”250ptと “2015-05”50ptを使うケース
• “商品コード” と “数量” は1行にまとめたい。
• しかし “付与年月” を2つ登録できず、どちらかが欠落。 - 結果
• “ポイント付与” 残高が正しく減算できない。
• 画面例の「残ポイント」計算も不正確になる。
- 例)300pt消費で “2015-04”250ptと “2015-05”50ptを使うケース
- したがって
「複数の付与年月のポイントを合算してポイント交換を行う場合、ポイントを消費したことを記録できない」ことが不具合である。
誤りやすいポイント
- 商品コードや数量があるから消費ポイントは算出可能と考え、付与年月の多重性を見落とす。
- 残ポイント列を“動的計算すれば良い”と誤解し、月別消費履歴の欠如を見逃す。
- “付与年月”をNULL可にすれば解決できると思い込むが、多対多構造の欠陥は残る。
FAQ
Q: “消費ポイント”列を追加すれば解決しますか?
A: いいえ。列を追加しても1行に1付与年月しか記録できない構造は変わらず、多月分引当ては表現できません。
A: いいえ。列を追加しても1行に1付与年月しか記録できない構造は変わらず、多月分引当ては表現できません。
Q: 別リレーションで“ポイント消費明細”を作る方法は?
A: “交換ID”をPKにした父表と、“付与年月・消費ポイント”を持つ子表を用意すれば、多月分の消費履歴を正規化して管理できます。
A: “交換ID”をPKにした父表と、“付与年月・消費ポイント”を持つ子表を用意すれば、多月分の消費履歴を正規化して管理できます。
関連キーワード: 正規化、主キー設計、多対多関係、在庫引当
設問3:関係 “ポイント付与”、“ポイント交換” について、(1)、(2)に答えよ。
問題文を見る(2)(1)の不具合を解決するために、関係 “ポイント交換” の属性を一つ削除し、新たな関係 “ポイント消費” を追加することにした。
(a)関係“ポイント交換” から削除する属性の属性名を答えよ。
(b)関係 “ポイント消費” の属性名を、表2の行(b)の各列に本文又は図表中の用語を用いて記入せよ。 また、主キー又は外部キーを構成する属性の場合、主キーを表す実線の下線、又は外部キーを表す破線の下線を付けること。
なお、表2の行(b)の列が全て埋まるとは限らない。
(c)図1及び図2に表示されているポイントは、関係 “ポイント消費”ではどのような値となるか。 その値を、表2の行(b)に記入した属性と同じ列に対応付くように、表2の(c)の各行及び各列に記入せよ。
なお、表2の(c)の行が全て埋まるとは限らない。


模範解答

解説
解答の導き方
結論(要点)
- (a)関係“ポイント交換”から削除する属性は「付与年月」です。
- (b)関係“ポイント消費”の属性は 会員ID、付与年月、交換年月日、消費ポイント で、主キーは(会員ID、付与年月、交換年月日)です。
- (c)図1・図2の表示に対応する具体例は表の通りです。
導出手順(図と本文の記述から順を追って)
-
何を記録する必要があるかを本文から読み取る
本文には「交換を行うと、付与年月が古いポイントから順に消費され、その内容が記録される」とあります。これは1回のポイント交換(交換年月日)で複数の「付与年月」にまたがってポイントが消費され得ることを意味します。従って、どの付与年月のポイントがどの交換でいくら消費されたかを、交換とは別に記録できる構造が必要です。 -
なぜ「付与年月」をポイント交換から削除するか(=(a)の理由)
図4には「ポイント交換(会員ID, 交換年月日, 付与年月, 商品コード, 数量)」とあり、現状ではポイント交換の行に「付与年月」が含まれています。しかし1回の交換が複数の付与年月を消費する場合、同じ交換(同一会員・同一交換年月日)の商品情報(商品コード・数量など)を複数行に複製する必要が出てきます。これはデータの冗長・更新異常を招くため、「付与年月」を移して別関係で消費の明細を持つ設計にする必要があります。したがって(a)は「付与年月」です。 -
新関係“ポイント消費”の属性と主キーの決め方(=(b)の理由)
- 記録すべき内容は「どの会員の、どの付与年月のポイントが、どの交換(交換年月日)でいくら消費されたか」です。したがって属性は 会員ID、付与年月、交換年月日、消費ポイント となります。
- 主キーに会員IDを含める理由:付与年月や交換年月日は会員ごとに意味を持つ日付であり、同じ日付が異なる会員に対して重複する可能性があるため、会員IDを含めて一意に識別する必要があります(ポイント付与の関係が「会員ID, 付与年月」で表されていることも根拠になります)。
- 主キーに消費ポイントを含めない理由:消費ポイントは測定値(量)であり、識別子としての安定性や最小性を満たしません。主キーは最小かつ変更されにくい属性の組合せであるべきで、量的属性を含めるのは不適切です。
- よって主キーは(会員ID、付与年月、交換年月日)とします。なお参照整合性としては、(会員ID, 付与年月) は ポイント付与 を参照し、(会員ID, 交換年月日) は ポイント交換 を参照することになります。
(b) 表2の行(b)(属性名を記入し、主キーに下線を付す)
(c) 図1(付与履歴)と図2(交換履歴)からの具体的な割当て手順と表2の(c)記入例
- 図1・図2より会員はT1234567、交換は2015-06-10に300ポイント、2015-07-20に100ポイント消費しています。本文にあるように「付与年月が古いポイントから順に消費される」ため、各交換で古い付与から順に引き落とします。
2015-06-10の300ポイント消費の割当て:- 2015-04の付与250を全消費 → 消費250
- 残り50を2015-05の付与60から消費 → 消費50(2015-05の残は10)
2015-07-20の100ポイント消費の割当て: - まず古い残(2015-05の残10)を消費 → 消費10(2015-05の残0)
- 残り90を2015-06の付与250から消費 → 消費90(2015-06の残160)
表2の(c) に対応する具体例(図表に合わせた記入)
(上表の集計は図1の残ポイント2015-06:160、2015-05:0などと整合します。)
誤りやすいポイント
- 主キーに「消費ポイント」を含めてしまうケース:消費量は識別子にならないため誤りです。主キーは事象の識別に用いる属性で、量的属性を含めるべきではありません。
- 会員IDを主キーに含めない設計:付与年月や交換年月日は会員ごとに意味があるため、会員IDを外すと別会員の同日付データと衝突する可能性があります。
- 「付与年月」をポイント交換に残したままにして多行で表現する:同一交換の繰返し(商品コード・数量の重複)で冗長や更新異常を招きます。
- FIFOルールを適用せず最新付与から消費する誤配分:本文の「付与年月が古いポイントから順に消費される」を正確に実装すること。
- 交換を日付だけで識別してしまう:同一日付に同会員が複数回交換する可能性がある場合は、交換を一意に識別する追加情報(時刻や連番)を考慮する必要があります。
FAQ
Q: 主キーを(会員ID、付与年月、交換年月日)としたが、代わりに単一の自動採番キー(消費ID)を使ってもよいか?
A: 実務ではサロゲートキー(消費ID)を付けることは一般的であり、実装上は許容されます。ただし参照整合性や一意制約として(会員ID、付与年月、交換年月日)の組合せに一意制約を設けるか、論理的に同等の制約を維持する必要があります。設計説明や試験解答では自然キーでの理由付け(なぜその組合せが一意か)を示すことが重要です。
A: 実務ではサロゲートキー(消費ID)を付けることは一般的であり、実装上は許容されます。ただし参照整合性や一意制約として(会員ID、付与年月、交換年月日)の組合せに一意制約を設けるか、論理的に同等の制約を維持する必要があります。設計説明や試験解答では自然キーでの理由付け(なぜその組合せが一意か)を示すことが重要です。
Q: 交換年月日が日付だけ(時刻なし)で表されているが、同一日に複数回の交換が起きたらどうするか?
A: 仕様次第です。図4では交換を交換年月日で表していますが、実運用で同一日に複数回ある可能性があるなら、交換を一意に識別するために時刻や交換連番などを追加して「交換イベント」を一意化する必要があります。試験問題では与えられた属性の範囲で設計を説明することが求められます。
A: 仕様次第です。図4では交換を交換年月日で表していますが、実運用で同一日に複数回ある可能性があるなら、交換を一意に識別するために時刻や交換連番などを追加して「交換イベント」を一意化する必要があります。試験問題では与えられた属性の範囲で設計を説明することが求められます。
Q: ポイント消費を商品単位で分けて記録したい場合は?
A: 商品ごとに消費元を分けて記録する必要があるなら、ポイント消費に商品コード(またはポイント交換側の個別行を参照するキー)を追加して、どの商品行がどの付与年月から消費されたかを明示する設計にします。要件に応じて粒度を上げてください。
A: 商品ごとに消費元を分けて記録する必要があるなら、ポイント消費に商品コード(またはポイント交換側の個別行を参照するキー)を追加して、どの商品行がどの付与年月から消費されたかを明示する設計にします。要件に応じて粒度を上げてください。
関連キーワード: 正規化、複合主キー、参照整合性、外部キー、アソシエーションテーブル





