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


受注管理システムのデータベース設計に関する次の記述を読んで, 設問1〜3に答えよ。

 A社は,個人宅を訪問し、 主にキッチン, 浴室,洗面所、トイレなどの清掃をサービスとして提供する業者である。 A社では,受注管理システムを新たに構築することになり, B君がデータベース設計を任された。  
〔業務概要〕 1.組織の特性  (1) 地域ごとに店舗があり, 本店及び各店舗はそれぞれ店舗番号で一意に識別される。  (2) 本店は顧客からの引合いを受け付け,各店舗は引合いのあった顧客の見積りを行い、注文が確定した後, サービスを実施する。 2.会員の特性  顧客は,最初の注文時に会員登録される。 会員は,会員番号で一意に識別される。 3.サービスの特性  (1) サービスは,サービスコードで一意に識別される。  (2) サービスには,個別サービス, セットサービス及びオプションサービスの3種類があり,サービス区分でどの種類のサービスかが識別される。   ① 個別サービスとは, キッチン清掃, レンジフード清掃, 浴室清掃など, 1 か所の清掃を指す。 個別サービスのサービス内容,標準価格,標準作業時間数は決まっている。 個別サービスの例を表1に示す。   ② セットサービスとは,個別サービスを複数組み合わせたもので,個別サービスそれぞれの標準価格の合計よりも割安な価格で提供する。 セットサービスに対して,選択可能な個別サービス群,選択可能数,標準価格は決まっている。一つの個別サービスは、複数の異なるセットサービスに組み込まれることがある。セットサービスの例を表2に示す。   ③ オプションサービスとは,会員の依頼によって個別サービスに追加する清掃で,単独では提供しない。 オプションサービスのサービス内容,適用可能な個別サービス,標準価格,標準作業時間数は決まっている。一つのオプションサービスを適用できる個別サービスは,一つだけである。 一つの個別サービスに対して,複数のオプションサービスを追加できる。 セットサービスで選択した個別サービスに対しても, オプションサービスを追加できる。 オプションサービスの例を表3に示す。
データベーススペシャリスト試験(平成25年 午後I 問2 表1)
データベーススペシャリスト試験(平成25年 午後I 問2 表2)
データベーススペシャリスト試験(平成25年 午後I 問2 表3)
4.注文の特性 (1) 注文は,注文番号で一意に識別される。 (2) 注文にはスポット注文と継続注文があり,注文区分で識別される。  ① スポット注文とは,1回だけ清掃を行うケースの注文である。  ② 継続注文とは,同じ清掃を複数回にわたって行うケースの注文である。   ・会員は, 期間,回数及び曜日を選択する。   ・会員は,期間と回数について、24週間に6回,48週間に6回,48 週間に 12回など,あらかじめ決められた組合せの中から選択する。   ・期間,回数,曜日の組合せは,継続パターンコードで識別される。また,それによって継続割引率は異なる。
(3) 一つの注文で、複数のサービスを指定できる。また,個別サービスとセットサービスを一緒に指定することもできる。
5.引合い,見積り, 注文の確定の流れ (1) 本店で受け付けた引合いは,地域ごとの店舗に割り当てられる。割り当てられた店舗は,会員宅を訪問して見積りを行う。 (2) 見積りによって,サービスごとの実施項目,適用価格が確定する。継続注文の場合,この確定内容は,2 回目以降も継続する前提である。適用価格は,標準価格と異なる場合がある。 (3) 見積りにおいて,予定年月日,予定開始時刻,予定終了時刻を決定する。継続注文の場合,予定開始時刻と予定終了時刻は2回目以降もこの決定が適用されるが,予定年月日は初回だけに適用される。 (4) 見積り結果は,セットサービスで選択した個別サービス,及び個別サービスに追加したオプションサービスの対応関係が分かるように, サービス名の前に記号を付け,関係するサービスを並べて表示する。 また,同一の清掃を複数箇所に対して行う場合,それぞれを識別できるようにするために,実施場所に,所在を表示する。 見積り結果の例を図1に示す。 (5) 会員が見積り結果を確認し、同意すれば注文が確定する。
データベーススペシャリスト試験(平成25年 午後I 問2 図1)
6.実施の流れ (1) 会員宅を訪問して注文内容に従って清掃を行う単位を, “実施”と呼ぶ。 スポット注文では1回の注文で1回の実施が発生し、継続注文では1回の注文で複数回の実施が発生する。 (2) 1回の実施に対して,一意となる実施番号が付与される。 1回の実施には一つ又は複数のサービスが含まれ, サービスごとに実施明細番号が付与される。 (3) 注文確定によって, スポット注文と継続注文の初回の実施予定を決定し, 登録する。 その際,個別サービス, オプションサービスごとに,予定作業時間数を割り当てる。 (4) 継続注文の2回目以降は, 実施時に次回の予定年月日を決め、 その時点で次回の実施予定を登録する。 (5) 1回の実施で予定していた, 全ての清掃が終了した時点で、 実施年月日, 実施開始時刻,実施終了時刻を登録する。 また, 個別サービス, オプションサービスごとに実施作業時間数を登録する。 (6) サービスごとの実施作業時間数は,サービスの作業改善, 標準作業時間数の見直しのために,過去の実績を分析する場合に照会する。  
〔データベースの設計〕  B君は,現在の業務概要と次の方針に基づいて, テーブル構造を図2のように設計することにした。 (1) セットサービスで選択された個別サービスも, 単品で選択された個別サービスも, “注文明細” テーブルには同様の形式で格納する。 (2) 注文の確定時に“注文” テーブル及び “注文明細” テーブルに行を作成する。実施予定登録時に “実施” テーブル及び “実施明細” テーブルに行を作成する。 (3) “実施” テーブルの行から対応する “注文” テーブルの行, “実施明細” テーブルの行から対応する “注文明細” テーブルの行を特定するために, 外部キーを設定する。   データベーススペシャリスト試験(平成25年 午後I 問2 図2)
〔継続注文の変更〕  検討中のテーブル構造では,継続注文について, 初回の実施後,継続する 2 回目以降にオプションサービスの追加及び取消しを行いたくても対応できない。この点について、会員からの要望を満たせていないことが判明した。 そこで, B君は, 2 回目以降の実施に対して, オプションサービスの追加及び取消しを行えるように,次の対応を考えた。 (1) 次回の実施予定を決定するときに, 変更の要望を確認し、変更があれば必要な見積りを実施して,適用価格と変更の要望に伴う予定開始時刻及び予定終了時刻の変更を決定する。 (2) 当初の注文確定時点の情報を含め、変更履歴を注文変更年月日ごとに保存する。
 解答に当たっては, 巻頭の表記ルールに従うこと。  なお,テーブル構造の表記は, “関係データベースのテーブル (表) 構造の表記ルール” を用いること。 さらに, 主キー及び外部キーを明記せよ。  また,新たに追加するテーブル名及び列名は,本文中で与えられた語句を用いて適切な名称とすること。

設問1(1)図2の“サービス” テーブルと “継続パターン” テーブルについて,(1)〜(3)に答えよ。

“サービス” テーブルには, セットサービス, 個別サービス及びオプションサービスの3種類のサービスが格納される。 そこで, “サービス” テーブルを,3 種類のサービスに共通の列をもつ“サービス共通” テーブルと,各サービスに固有の列をもつテーブルに分割することにした。 列が冗長にならないように,各テーブルの構造を記述せよ。
模範解答
サービス共通(サービスコード,サービス区分,サービス名,標準価格) 個別サービス(サービスコード,サービス内容,標準作業時間数) セットサービス(サービスコード,個別サービス選択可能数) オプションサービス(サービスコード,サービス内容,標準作業時間数,個別サービスコード
解説

模範解答のキーワードと論点整理

  1. スーパークラス/サブクラス構造(垂直分割)
    • “サービス”を共通属性を持つ「サービス共通」と,各種固有属性を持つ「個別サービス」「セットサービス」「オプションサービス」に分割する。
  2. 主キーの共有と外部キー参照
    • 各サブクラスは共通キー「サービスコード」を主キーとして持ち,親である「サービス共通」のサービスコードを外部キー参照する。
  3. 固有属性の切り出し
    • 各サービス種別にだけ必要な列をサブクラス側に定義し,冗長性を排除する。

テーブル構造

以下のように4つのテーブルを定義します。主キー(PK)と外部キー(FK)を明記しています。

サービス共通

カラム名制約
サービスコードPK
サービス区分
サービス名
標準価格

個別サービス

カラム名制約
サービスコードPK, FK → サービス共通(サービスコード)
サービス内容
標準作業時間数

セットサービス

カラム名制約
サービスコードPK, FK → サービス共通(サービスコード)
個別サービス選択可能数

オプションサービス

カラム名制約
サービスコードPK, FK → サービス共通(サービスコード)
サービス内容
標準作業時間数
個別サービスコードFK → 個別サービス(サービスコード)

解答に至る論理的説明

  1. サービスには,個別サービス, セットサービス及びオプションサービスの3種類があり,サービス区分でどの種類のサービスかが識別される。」(問題文)
    → 3種類のサービスを1つのテーブルに詰め込むと,列の空白や冗長が発生する。そこで共通属性と固有属性を分ける。
  2. 各種サービスの固有属性は次の通りです。
    • 個別サービス:「サービス内容, 標準作業時間数」が決まっている(問題文)
    • セットサービス:「個別サービス選択可能数」が決まっている(問題文)
    • オプションサービス:「サービス内容, 標準作業時間数, 適用個別サービス」が決まっている(問題文より「オプションサービスのサービス内容, 適用可能な個別サービス, 標準価格, 標準作業時間数は決まっている」)
  3. 列が冗長にならないように,各テーブルの構造を記述せよ。」との指示より,
    • 重複する「サービス名」「標準価格」は「サービス共通」に集約
    • 各種サービスにしかない列はサブテーブルへ
  4. 主キー・外部キー
    • サブクラスはスーパークラスの主キーを兼ね,FK参照を張ることで整合性を担保します。

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

  • 「オプションサービス」と「個別サービス」は列名が似ているため,両者をマージしがちですが,オプションは“適用可能な個別サービス”を持つ点で個別サービスとは異なる役割です。
  • セットサービスの「選択可能な個別サービス群」は多対多の関係になるため,実際には別に中間テーブルが必要ですが,小問では「個別サービス選択可能数」のみ問われています。
  • 主キーと外部キーの定義忘れ。

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

  1. スーパークラス/サブクラス分割(垂直分割)の考え方
    • 共通属性は親テーブルへ,固有属性は子テーブルへ
  2. 主キー共有型の参照方式
    • 子テーブルの主キーに親テーブルの主キーを兼用させ,FK制約を張る
  3. 問題文中のキーワードを正確に拾う
    • 「サービス区分」「固有の属性」「冗長にならないように」など
  4. ER設計とテーブル設計の橋渡し
    • 多対多や集合として示された属性は,設問の範囲に応じてどう表現するか切り分ける
これらを意識すれば,類題への応用も可能になります。

設問1(2)図2の“サービス” テーブルと “継続パターン” テーブルについて,(1)〜(3)に答えよ。

“継続パターン” テーブルの候補キーを全て答えよ。なお,複数の列から構成される候補キーは{ }でくくること。
模範解答
継続パターンコード,{期間,回数,曜日}
解説

キーワードと論点の整理

  • 候補キー(Candidate Key):関係において各行を一意に識別できる最小の属性(列)の組合せ
  • 問題文の記述から把握すべきポイント
    • 「会員は,期間,回数及び曜日を選択する。」
    • 「期間,回数,曜日の組合せは,継続パターンコードで識別される。」

解答の根拠と論理的説明

  1. 主キーとして「継続パターンコード」が想定されている
    問題文の「期間,回数,曜日の組合せは,継続パターンコードで識別される。」から,
    継続パターンを一意に識別するためにまず用意されるのが「継続パターンコード」であることが分かります。
  2. 候補キーの要件
    • 一意性を満たす
    • 最小性(不要な属性を含まない)を満たす
  3. 属性 {期間, 回数, 曜日} の組合せも一意性を持つ
    問題文に「会員は,期間,回数及び曜日を選択する。…期間,回数,曜日の組合せは,継続パターンコードで識別される。」とあるので,
    同じ「期間」「回数」「曜日」の組合せが重複して登録されることはなく,結果としてこれら3つの列が重複なく各行を識別できます。
  4. ほかの列を含める必要がない(最小性)
    • 「継続割引率」は同一パターンごとに決まる既定の値であり,識別に必要な属性ではありません。
    • 「継続パターンコード」はこれ自体が主キーですが,属性の最小集合としてはコード単独または{期間, 回数, 曜日}のいずれかです。
以上より,候補キーは以下の2つとなります。
  1. 継続パターンコード
  2. {期間, 回数, 曜日}

継続パターン表の構造例

カラム名キー種別意味
継続パターンコード主キー(候補キー)継続パターンを一意に識別するコード
期間継続期間(例:24週間, 48週間)
回数実施回数(例:6回, 12回)
曜日実施曜日(例:日曜日)
継続割引率パターンに対応する割引率

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

  • 「継続割引率」をキーに含めてしまう
    → 割引率はパターンに依存する値だが,同じ期間・回数・曜日であれば割引率も同じため,一意性のために必要な属性ではありません。
  • 候補キーの定義と主キーの混同
    → 主キーは1つだが,候補キーは「主キーとなり得るキー」の集合を指します。

試験対策としてのまとめ

  • 候補キーを問われたら,まず「一意性」と「最小性」の要件を意識する。
  • 問題文中の「識別される」「一意に」「識別子」といった表現を手掛かりにする。
  • 属性の組合せで識別可能かを,重複登録が起こり得るか否かで判断する。
  • 主キー=候補キーではない点を押さえ,複数の候補キーの存在を見逃さない。

設問1(3)図2の“サービス” テーブルと “継続パターン” テーブルについて,(1)〜(3)に答えよ。

“継続パターン” テーブルは,第1正規形,第2正規形,第 3 正規形のうち,どこまで正規化されているか。 また, 部分関数従属性,推移的関数従属性の有無を,“あり” 又は “なし”で答えよ。“あり” の場合は,その関数従属性の具体例を、次の表記法に従って示せ。 データベーススペシャリスト試験(平成25年 午後I 問2 設問1-3)
模範解答
正規形:第3正規形 部分関数従属性の有無:なし 推移的関数従属性の有無:なし
解説

1. 模範解答に至るキーワード・論点整理

論点キーワード・着眼点
テーブル構造継続パターン(継続パターンコード, 期間, 回数, 曜日, 継続割引率)
主キー継続パターンコード(単一属性)
関数従属性継続パターンコード → 期間, 回数, 曜日, 継続割引率
正規形判定主キーが単一 ⇒ 部分関数従属性なし
非キー属性間に従属性もなし ⇒ 推移的関数従属性なし
結論第3正規形・部分/推移とも「なし」

2. なぜその解答になるのか ― 論理的な説明

2.1 問題文から読み取れる仕様

期間, 回数, 曜日の組合せは, 継続パターンコードで識別される。また, それによって継続割引率は異なる
この記述から
• 「継続パターンコード」が表の主キー
• 割引率も含めて 全ての列は継続パターンコードだけに従属
という2点が確定します。

2.2 第1正規形(1NF)

– 繰り返し属性や複数値を含む列は存在しない。
→ 1NF は満たす。

2.3 第2正規形(2NF)

– 2NF で問題となる「部分関数従属性」は 主キーが複合キーのとき にだけ発生。
– 本テーブルの主キーは単一属性(継続パターンコード)。
→ 部分関数従属性は そもそも起こり得ない =「なし」
→ 2NF を満たす。

2.4 第3正規形(3NF)

– 3NF で問題となる「推移的関数従属性」は
 非キー属性 → 別の非キー属性 という従属性がある場合。
– 問題文では「割引率は期間・回数に応じて決まる」とは書かれておらず、
 むしろ “継続パターンコードによって決まる” と明言。
– 従って
 期間, 回数, 曜日 → 継続割引率 という推移従属性は成立しない。
→ 推移的関数従属性「なし」
→ 3NF を満たす。
以上より、模範解答
「正規形:第3正規形/部分関数従属性:なし/推移的関数従属性:なし」
となります。

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

誤りやすい観点なぜ間違えるか正しい考え方
① 主キーを (期間, 回数, 曜日) と決めつける“期間×回数×曜日の組合せ” が一意に見えるため問題文に「継続パターンコードで識別」と明示。主キーはコード列
② 割引率は期間・回数で決まると想像実際のビジネス上“あり得そう”だから仕様に記載が無い関数従属性は 仮定しない。設計書に書かれた従属性のみで判断
③ 単一キーでも 2NF を意識する“正規化=必ず1 → 2 → 3と調べる” と覚えている主キーが単一なら 2NF は自動的にクリア。部分従属性の有無を改めて書く必要はあるが、内容は「なし」

4. 試験対策:覚えておきたいポイントまとめ

  1. 【主キーが単一か複合か】をまず確認する。
    – 単一主キーなら 2NF の部分従属性は必ず「なし」。
  2. 正規化のチェック手順
    ① 1NF:非原子値・繰返しグループの排除
    ② 2NF:複合キーの部分従属性排除
    ③ 3NF:非キー属性間の推移従属性排除
  3. 関数従属性は “問題文(又は設計書)に書かれているものだけ” で判断する。
    – 「業務的にありそう」な従属性を自分で追加しない。
  4. 定義暗記
    • 部分関数従属性:{複合キーの一部} → 非キー属性
    • 推移的関数従属性:主キー → 非キー属性A → 非キー属性B
  5. 模範解答の表形式指示
    – 本問のように「あり/なし」「具体例空欄」まで答案欄が決まっているケースが多い。書式ミスで失点しないよう注意。
これらを押さえておけば、本問レベルの正規化問題は確実に得点できます。

設問2(1)図2の“注文明細” テーブルについて,(1),(2)に答えよ。

注文明細のサブタイプ構造を図3に示す。この3種類のサブタイプは,一つの注文の中で対応関係をもち得る。 その対応関係を示すリレーションシップを図 3 に記入せよ。 その場合, 対応関係にゼロを含むか否かを区別して表現する場合の表記ルールを用いること。 データベーススペシャリスト試験(平成25年 午後I 問2 図3)
模範解答
データベーススペシャリスト試験(平成25年 午後I 問2 設問2-1解答)
解説

キーワードと論点整理

  • 注文明細のサブタイプ構造
    「セットサービス注文明細」「個別サービス注文明細」「オプションサービス注文明細」の3つのサブタイプが,スーパークラスである「注文明細」から分岐している。
  • 対応関係(リレーションシップ)
    1)セットサービス→個別サービス
    2)個別サービス→オプションサービス
  • カーディナリティ(多重度)
    • ゼロを含むか(○ = 0許容,●=必須)
    • 最小/最大数(縦線=1,三又=多)

解答の理由と論理的説明

  1. 「セットサービス」と「個別サービス」の対応関係
    【問題文】より引用
    「見積り結果は, セットサービスで選択した個別サービス …の対応関係が分かるように…」
    「② セットサービスとは,個別サービスを複数組み合わせたもので…」
    → 1つのセットサービス注文明細に対して,選択された個別サービス注文明細が複数(最大はセット定義の「選択可能数」)存在し得る。
    → 一方,個別サービス注文明細は「単品で選択」される場合もあり得るため,必ずしもセットサービス注文明細に属さない(0~1)。
    したがって,
    • セットサービス注文明細 … 個別サービス注文明細 : 1対多 (1…N)
    • 個別サービス注文明細 … セットサービス注文明細 : 0または1
  2. 「個別サービス」と「オプションサービス」の対応関係
    【問題文】より引用
    「一つのオプションサービスを適用できる個別サービスは,一つだけである。 一つの個別サービスに対して,複数のオプションサービスを追加できる。」
    → 個別サービス注文明細1件に対して,オプションサービス注文明細が複数(0件以上)関連する。
    → オプションサービス注文明細は必ずどれか1つの個別サービス注文明細に紐付く。
    したがって,
    • 個別サービス注文明細 … オプションサービス注文明細 : 1対多 (1…N)
    • オプションサービス注文明細 … 個別サービス注文明細 : 必須1

対応関係のまとめ

以下の表で,サブタイプ間のリレーションシップとカーディナリティを示します。
関係元(親側)関係先(子側)親側の多重度子側の多重度
セットサービス注文明細個別サービス注文明細10…N (○…●│三又)
個別サービス注文明細オプションサービス注文明細10…N (○…●│三又)
  • 「0…N」は「○―三又」で表記
  • 「1…N」は「●―三又」,「1」は「●―│」で表記

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

  1. 単品選択の個別サービスを忘れる
    個別サービス注文明細は〈セットに属さない単品選択〉を含むため,「必ずセット注文明細と関連する」と誤解しないこと。
  2. オプションサービスの必須・任意を取り違える
    オプションは「追加したいときのみ」なので,個別サービスに対しては0件も許容するが,オプション側から見れば必ずどこかの個別サービスに帰属することを押さえる。
  3. カーディナリティ下限の値
    「多重度でゼロを含むか否か」は○/●で明確に区別するルールを守る。

試験対策としてのまとめ

  • スーパークラスとサブタイプ間では「識別リレーションシップ」を用い,各サブタイプを識別するキー設計を理解する。
  • 仕様文中の「一つの…に対して, 複数の…が~できる」「~だけである」は,多重度を導くキーワード。
  • カーディナリティ(多重度)を「最小・最大」「ゼロ含むか」で二段階に整理し,モデリング表記(○/●, 縦線/三又)で確実に描けるように練習する。

設問2(2)図2の“注文明細” テーブルについて,(1),(2)に答えよ。

(1)で答えたリレーションシップを成り立たせるために,現在の“注文明細”テーブルに列を二つ追加することにした。 それらの列に設定する値の意味を、具体的にそれぞれ40字以内で述べよ。
模範解答
①・選択された個別サービスの元となったセットサービスの注文明細番号 ②・追加されたオプションサービスの元となった個別サービスの注文明細番号
解説

模範解答案のキーワードと論点整理

模範解答では,以下の2つのリレーションを自己参照的に実現するための「親注文明細番号」を追加しています。
  1. セットサービス→個別サービス
  2. 個別サービス→オプションサービス
これにより,
  • セットサービスの注文明細から展開された個別サービス明細をリンク
  • 個別サービス明細に追加されたオプションサービス明細をリンク
    という階層構造を注文明細テーブル1つで管理できます。

解答の根拠と問題文の引用

1.セットサービス→個別サービスのリンク

問題文には,
「セットサービスで選択した個別サービスも, 単品で選択された個別サービスも, “注文明細” テーブルには同様の形式で格納する。」
とあり,
「一つの個別サービスは、複数の異なるセットサービスに組み込まれることがある。」
とも記載されています。
したがって,「どのセットサービスから展開された明細か」を識別するために,
① “選択された個別サービスの元となったセットサービスの注文明細番号”
という参照先を持つ必要があります。

2.個別サービス→オプションサービスのリンク

同様に,
「オプションサービスを追加できる」
「一つのオプションサービスを適用できる個別サービスは,一つだけである。」
とあることから,オプション明細には「どの個別サービス明細に追加されたのか」を示す必要があります。
そこで,
② “追加されたオプションサービスの元となった個別サービスの注文明細番号”
という参照先が必要です。

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

  • 「セットサービス」と「オプションサービス」のリンク方向を逆に考えてしまう
    → 親子関係は〈セットサービス明細〉→〈個別サービス明細〉,〈個別サービス明細〉→〈オプションサービス明細〉です。
  • 列の意味を「発注元」「変更元」など曖昧に表現してしまい,どのレコードを指すのか不明になる
    → 「注文明細番号」という具体的な外部キーを明記しましょう。

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

  • 階層的なサービス構成(セット→個別→オプション)は自己参照(自己結合)で管理できる
  • 「元となった明細」を追跡するには,自テーブルの主キーを外部キーとして持つ列を追加
  • 問題文中の
    • 「~の元となった~番号」
    • 「~に追加された~番号」
      などの表現をそのまま列の説明に活かすと正確性が高まる
  • ER図やリレーションシップ図で親子関係を整理し,必要な外部キーを演繹する訓練を積むこと

以上の考え方で,設問の40字要件に収まるように①, ②を記述すれば正解となります。

設問3(1)注文と実施の管理について(1),(2)に答えよ。

“実施明細” テーブルの行は “注文明細”テーブルの行に基づいて作成される。その際に,“実施明細” テーブルに反映する必要がない “注文明細” テーブルの行がある。 その行を15字以内で述べよ。 また, 反映する必要がない理由を20字以内で述べよ。
模範解答
行:セットサービス注文明細の行 理由:セットサービスは実施対象ではないから
解説

1. 模範解答のキーワードと論点整理

  • 注文明細テーブル(“注文明細”テーブル)
  • 実施明細テーブル(“実施明細”テーブル)
  • セットサービス注文明細の行
  • 実施対象のサービス
  • 「セットサービスは実施対象ではないから」

2. 解答の理由/根拠

  1. 【注文明細テーブル】には,注文確定時に以下の行がすべて格納されます。
    「個別サービス」「オプションサービス」「セットサービス」それぞれについて,
    “セットサービスで選択された個別サービスも, 単品で選択された個別サービスも, “注文明細” テーブルには同様の形式で格納する。”
    (設計方針(1))
  2. 一方,【実施明細テーブル】には,実際に会員宅で清掃を行うサービスだけが反映されます。
    業務概要6(実施の流れ)によれば,
    “1回の実施には一つ又は複数のサービスが含まれ, サービスごとに実施明細番号が付与される。”
    実際に実施されるのは「個別サービス」と「オプションサービス」であり,
    セットサービスそのものは清掃対象として実行されないため,
    実施明細を作成する必要がありません。
  3. したがって,
    「実施明細テーブルの行は注文明細テーブルの行に基づいて作成されるが,
    実際の清掃実行対象でないセットサービス注文明細の行だけは反映しない」
    という理解に至ります。

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

誤りやすいポイント理由・対策
「オプションサービス注文明細の行」を選ぶオプションも追加/取消しが発生するため,実施明細に必ず反映されるから不正解
「個別サービス注文明細の行」を選ぶ個別サービスは実際に行う清掃であるため,実施明細に反映が必要
「セットサービス」を「実施内訳」欄に見る見積段階では表示されるが,実行段階では構成要素(個別+オプション)のみが対象になる
■ 試験でのチェックポイント
  • 注文明細と実施明細の対応関係
  • 実施対象に含まれるサービス区分
  • 問われているのは“何を反映しないか”なので,逆パターンに注意する

4. 試験対策におけるまとめ

  • 注文明細テーブルには注文サービス(個別・セット・オプション)のすべてが登録される。
  • 実施明細テーブルには,実際に清掃を行う「個別サービス」「オプションサービス」のみを反映。
  • 「セットサービス」はあくまで価格設定・見積り用の集合体であり,実作業対象ではない。
  • 設問文中の「実施対象」「実施明細」をキーワードに正誤を切り分ける練習をする。
  • 設問の指示字数まで意識しつつ,キーワードは正確に暗記する。

設問3(2)注文と実施の管理について(1),(2)に答えよ。

〔継続注文の変更〕 に対応するために、 次の方針でテーブルの構造を見直すことにした。  ・新たなテーブルは追加せず、 図2のテーブル構造を変更する。  ・テーブル構造の変更は、変更対象のテーブルに対して、 同じ役割の列を一つだけ追加する。  この方針で見直した場合の追加する列について, 役割を表す適切な列名を答えよ。 また, 変更すべきテーブル名を全て答え,それらのテーブルごとに, 追加する列が主キーを構成する場合は主キー欄に “○”, 外部キーを構成する場合は外部キー欄に“○” を記入して、次の表を完成させよ。  なお,表の欄は全て埋まるとは限らない。 データベーススペシャリスト試験(平成25年 午後I 問2 設問3-2)
模範解答
列名:注文変更年月日 テーブル: データベーススペシャリスト試験(平成25年 午後I 問2 設問3-2解答)
解説

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

  • 注文変更年月日:継続注文の変更履歴を「注文変更年月日ごとに保存する」という要件から生まれるキー
  • バージョニング(版管理):同じ「注文」や「注文明細」を変更前後で履歴管理する必要性
  • 主キーの拡張:履歴として同一の注文番号で異なるバージョンを区別できるように主キーに列を追加
  • 外部キーの整合性:履歴付きの「注文」「注文明細」と常に参照整合性を保つため、子テーブルにも変更日を持たせる

2. 解答が「注文変更年月日」となる理由の論理的説明

問題文に
「当初の注文確定時点の情報を含め、変更履歴を注文変更年月日ごとに保存する」
とあるように、注文内容の履歴を残すためには、何度も同じ「注文番号」をキーにして行を追加しなければなりません。
そのため、履歴のバージョンを一意に特定する「注文変更年月日」を主キーの一部としてテーブルに加えます。
さらに、「注文明細」「実施」「実施明細」はそれぞれ「注文」や「注文明細」を参照しています(外部キー設定済み)。
履歴を正しくたどるためには、参照先のバージョンを含めて紐付ける必要があり、これらのテーブルにも「注文変更年月日」を外部キーとして追加します。
───
■ 注文テーブル
  • 元の主キー:注文番号
  • 追加列:注文変更年月日 → ×××(注文番号+注文変更年月日)でバージョンごとのレコードを区別
  • 主キーに含む:○
  • 外部キー:不要
■ 注文明細テーブル
  • 元の主キー:注文番号+注文明細番号
  • 追加列:注文変更年月日 → 親「注文」をどのバージョンで参照したかを示す
  • 主キーに含む:○
  • 外部キーに含む:○
───
■ 実施テーブル
  • 元の主キー:実施番号
  • 追加列:注文変更年月日 → どのバージョンの注文に基づく実施かを示す
  • 主キーに含まない:-
  • 外部キーに含む:○
■ 実施明細テーブル
  • 元の主キー:実施番号+実施明細番号
  • 追加列:注文変更年月日 → どのバージョンの注文明細に対応する実施かを示す
  • 主キーに含まない:-
  • 外部キーに含む:○

追加後の構造一覧

テーブル名追加列主キー外部キー
注文注文変更年月日○(注文番号+注文変更年月日)
注文明細注文変更年月日○(注文番号+注文明細番号+注文変更年月日)○(注文番号+注文変更年月日→注文)
実施注文変更年月日○(注文番号+注文変更年月日→注文)
実施明細注文変更年月日○(実施番号+注文変更年月日→実施)

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

  • 「履歴管理をどう実現するか?」で、 主キーに追加する列と外部キーに追加する列を区別できていない
  • 「注文変更年月日をどのテーブルに入れるか?」で、 実施・実施明細に入れないと参照整合性が取れない という点を見落とす
  • 「新規テーブルを作る」と早合点しがちだが、 設問の方針は既存4テーブルへの列追加のみ

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

  • 【バージョン管理/履歴管理】は主キーを拡張して過去レコードを保持し、外部キーにも同じバージョンキーを持たせて参照整合性を保つ
  • 主キーか外部キーかは、そのテーブル内で一意にレコードを識別する必要があるか(主キー)、参照先のキーと合わせる必要があるか(外部キー) で判断
  • 問われた方針(「既存テーブルに列を一つ追加」「新規テーブル不可」など)をよく確認し、余計な設計変更を行わないこと
← 前の問題へ次の問題へ →

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