戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2015年 午後1 問02


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

 D社は、電気設備工事を受注し、自社で施工する会社である。 D社では、今回、工事案件を管理するシステム (以下、案件管理システムという) を構築することになった。   〔対象業務の概要〕 1.組織の管理  (1) 三つの営業部と九つの工事部がある。 部は、部コードで一意に識別する。  (2) 年度当初に、営業部の当年度目標受注額と、工事部の当年度目標原価率を設定して管理する。
2.社員の管理  (1) 社員は、社員番号で一意に識別する。  (2) 社員は、営業部又は工事部のいずれか一つの部に所属する。
3.顧客の管理  (1) 顧客は、顧客番号で一意に識別する。  (2) 顧客を類別する顧客グループを設ける。 顧客グループは、顧客グループコードで一意に識別する。  (3) 顧客は、顧客グループのいずれか一つに所属する。
4.顧客グループと営業部の関係  (1) 一つの営業部は、複数の顧客グループを担当する。 一つの顧客グループを、複数の営業部が担当することはない。  (2) 1人の営業部社員は、一つの顧客グループを担当する。 一つの顧客グループを、複数の営業部社員が担当する場合がある。
5.案件の管理  (1) 案件は、営業活動の単位である。 案件は、案件番号で一意に識別する。  (2) 案件ごとに、案件名、案件状態('商談中'、'受注'、'失注'、'消滅')、案件内容、案件開始日、顧客、受注見込額、担当営業部などを記録する。 案件状態が'失注' 又は '消滅' となった案件は無効とする。  (3) 商談が進み、案件を担当する工事部が決定した時点で、案件詳細を記録する。   ① 案件詳細は、案件詳細全体で一意な案件詳細番号で識別し、案件詳細名、工事開始予定日、工事終了予定日、担当工事部、売上見込額、見込原価(労務費、材料費など) などを記録する。   ② 受注した案件の規模・難易度・期間などによって、複数の工事部が担当することになった場合、工事部ごとに案件詳細を記録する。   ③ 複数の案件詳細を記録した後に、作業内容の見直しによって担当工事部が減った場合、担当から外れた工事部の案件詳細は無効とする。   ④ 一つの案件に対応する無効としていない案件詳細の売上見込額の合計は、案件の受注見込額と一致させる。  (4) 案件の詳細化によって、一つの案件を複数に分割する場合がある。 逆に、複数の案件を一つに統合する場合がある。 ただし、案件の分割と統合が、同時に行われることはない。 案件ごとに、分割の場合は分割元案件番号を、統合の場合は統合先案件番号を記録する。 また、案件の統合後、不要となった案件は無効とする。  (5) 案件を分割した場合、分割前の案件詳細が分割後の案件のいずれかに対応付けられたり、案件詳細が分割前の案件に対応付けられたままとなったりすることがある。  (6) 複数の案件を一つに統合した場合、統合前の案件詳細が統合後の案件に対応付けられる。これらの案件詳細のうち、工事部が同じものは一つに統合し、不要となった案件詳細は無効とする。  (7) 案件の変更は、担当営業部の社員が実施する。 案件詳細の変更は、担当営業部の社員又は担当工事部の社員のいずれかが実施する。 案件の変更時、その変更履歴及び変更を実施した社員を記録する。 案件詳細についても同様に記録する。
6.受注の記録  案件状態が‘受注’となった時点で、案件ごとに受注として記録する。 これ以降、案件及び案件詳細が変更されることはない。 受注は、受注番号で一意に識別する。 受注ごとに、受注名、受注日、契約開始日、契約終了日、受注額、契約種別('請負'、'保守'など)、対応する案件番号などを記録する。 また、受注明細として、担当工事部ごとの受注明細名、受注明細額などを記録する。受注明細は、受注番号、受注明細番号で一意に識別する。
7.案件の集計  (1) 顧客グループ名ごと案件状態名ごとに、受注見込額を集計する。  (2) 顧客グループ名ごと案件状態名ごと工事部名ごとに、売上見込額を集計する。   〔概念データモデルと関係スキーマ〕  〔対象業務の概要〕 に基づいて作成した、案件管理システムの概念データモデルを図1に、関係スキーマを図2に示す。
データベーススペシャリスト試験(平成27年 午後1 問2 図1) ↩設問1(1) ↩設問1(2)
 解答に当たっては、巻頭の表記ルールに従うこと。

設問1:図1の概念データモデル及び図2の関係スキーマについて、(1)、(2)に答えよ。

問題文を見る
(1)図2中の(a)〜(h)に入れる適切な外部キーとなる属性の属性名を答えよ。(cとdは順不同)

模範解答

a:顧客グループコード b:担当営業部コード c:分割元案件番号 d:統合先案件番号 e:社員番号 f:社員番号 g:案件番号 h:担当工事部コード

解説

解答の論理構成

  1. 営業部社員と顧客グループの紐付け
    • 【問題文】4.(2) “1人の営業部社員は、一つの顧客グループを担当する。”
    • 顧客グループは “顧客グループコードで一意に識別する。”(3.(2))
    • よって (a) は 顧客グループコード。
  2. 顧客グループと営業部の紐付け
    • 【問題文】4.(1) “一つの営業部は、複数の顧客グループを担当する。”
    • 営業部は “部コードで一意に識別する。”(1.(1))
    • 顧客グループ表側に営業部を示す外部キーが必要 → (b) は 担当営業部コード。
  3. 案件の分割・統合
    • 【問題文】5.(4) “分割の場合は分割元案件番号を、統合の場合は統合先案件番号を記録する。”
    • 案件表に二つの自己参照外部キーを置く → (c) 分割元案件番号、(d) 統合先案件番号。
    • “同時に行われることはない” とあるためNULL可能属性で対処。
  4. 変更履歴に誰が関与したか
    • 【問題文】5.(7) “案件の変更時…変更を実施した社員を記録する。”
    • 同箇所で “案件詳細についても同様に記録する。”
    • よって (e)(f) ともに 社員番号。
  5. 受注と案件の関連
    • 【問題文】6. “受注…対応する案件番号などを記録する。”
    • 受注表に外部キー → (g) 案件番号。
  6. 受注明細と工事部の関連
    • 【問題文】6. “受注明細として、担当工事部ごとの受注明細名、受注明細額などを記録する。”
    • 受注明細表に工事部識別子 → (h) 担当工事部コード。

誤りやすいポイント

  • 営業部社員が担当するのは「顧客」ではなく「顧客グループ」。
  • 顧客グループ側に入るのは「部コード」ではなく「担当営業部コード」と命名することで用途を明示。
  • 案件の自己参照は2種類ある。属性名と意味を取り違えると1行で ×。
  • 受注明細は「担当工事部単位」。営業部コードを入れたくなるミスに注意。
  • (e)(f) は同じ社員番号でもテーブルが違う。履歴系をまとめて一つと誤解すると失点。

FAQ

Q: 分割と統合が同時に行われないなら、属性を1つにまとめてフラグで区別してはいけませんか?
A: “分割元案件番号” と “統合先案件番号” は意味も参照先も異なるため、NULL可能な2属性に分離した方が可読性と整合性制約の設定が容易です。
Q: (b) に「部コード」を入れても正しいのでは?
A: 部コードは営業部と工事部を区別できません。仕様4.(1) で営業部限定と明記されているため、ビジネスルールを表す命名 “担当営業部コード” が適切です。
Q: 履歴テーブルで社員番号が外部キーにならない場合がありますか?
A: 社員退職後に無効日を持つケースでも番号自体は存続するため外部キー制約を維持できます。履歴保持の観点からも社員番号をFKとする実装が一般的です。

関連キーワード: 外部キー、自己参照、変更履歴、NULL許容、エンティティ分割

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問1:図1の概念データモデル及び図2の関係スキーマについて、(1)、(2)に答えよ。

問題文を見る
(2)図1のリレーションシップは未完成である。 必要なリレーションシップを全て記入し、図を完成させよ。 ここで、図2の関係 “案件変更履歴” の案件名以降の属性に対応するリレーションシップ、及び関係 “案件詳細変更履歴” の案件詳細名以降の属性に対応するリレーションシップの表記は不要である。また、エンティティタイプ間の対応関係にゼロを含むか否かの表記は不要である。  なお、識別可能なサブタイプが存在する場合、他のエンティティタイプとのリレーションシップは、スーパタイプ又はサブタイプのいずれか適切な方との間に記述せよ。

模範解答

データベーススペシャリスト試験(平成27年 午後1 問2 設問1-2解答)

解説

解答の論理構成

  1. エンティティの抽出
    • 【対象業務の概要】にある管理対象語句をそのままエンティティに採用します。
      例: “顧客は、顧客番号で一意に識別する。” → エンティティ「顧客」。
    • 階層表現が必要なものはスーパタイプとサブタイプに分けます。
      例: “三つの営業部と九つの工事部がある。” → スーパタイプ「部」、サブタイプ「営業部」「工事部」。
  2. 主キー確認
    • 全てのエンティティに“○○番号”や“○○コード”が明示されているため、主キーは問題文をそのまま採用します。
      例: “案件は、案件番号で一意に識別する。” → 主キー「案件番号」。
  3. リレーションシップ決定
    ① 部と社員
    • “社員は、営業部又は工事部のいずれか一つの部に所属する。”
    • 1部 - N社員。
      ② 顧客グループと営業部
    • “一つの営業部は、複数の顧客グループを担当する。 一つの顧客グループを、複数の営業部が担当することはない。”
    • 1営業部 - N顧客グループ。
      ③ 顧客グループと営業部社員
    • “1人の営業部社員は、一つの顧客グループを担当する。 一つの顧客グループを、複数の営業部社員が担当する場合がある。”
    • 1顧客グループ - N営業部社員。
      ④ 顧客グループと顧客
    • “顧客は、顧客グループのいずれか一つに所属する。”
    • 1顧客グループ - N顧客。
      ⑤ 顧客と案件
    • “案件ごとに … 顧客 … を記録する。”
    • 1顧客 - N案件。
      ⑥ 営業部と案件
    • “案件ごとに … 担当営業部 … を記録する。”
    • 1営業部 - N案件。
      ⑦ 案件状態と案件
    • “案件状態(‘商談中'、'受注'、 '失注'、‘消滅') … を記録する。”
    • 1案件状態 - N案件。
      ⑧ 案件と案件詳細
    • “案件詳細は … 案件詳細番号で識別し … 案件番号 … を記録する。”
    • 1案件 - N案件詳細。
      ⑨ 工事部と案件詳細
    • “担当工事部 … を記録する。”
    • 1工事部 - N案件詳細。
      ⑩ 案件と受注
    • “案件状態が‘受注’となった時点で、案件ごとに受注として記録する。”
    • 1案件 - 1受注(0-1を表記しない指示なので1:1相当)。
      ⑪ 受注と受注明細
    • “受注明細は、受注番号、受注明細番号で一意に識別する。”
    • 1受注 - N受注明細。
      ⑫ 変更履歴
    • “案件の変更時、その変更履歴 … を記録する。”
    • N案件変更履歴 - 1案件。
    • “案件詳細についても同様に記録する。”
    • N案件詳細変更履歴 - 1案件詳細。
  4. スーパタイプ/サブタイプの接続
    • “社員は、営業部又は工事部のいずれか一つの部に所属する。”と併せ、“営業部社員”“工事部社員”というサブタイプが定義済み。
    • リレーションシップはスーパタイプ「社員」またはサブタイプのどちらか“適切な方”と結ぶ指示なので、
      ・部 ←→ 社員
      ・顧客グループ ←→ 営業部社員
      とする。
  5. 図1完成形
    • 上記 ①〜⑫ を全てER図へ落とし込むと、【模範解答】画像と一致します。

誤りやすいポイント

  • 顧客グループと営業部の関係をN:Nと誤認し、余分な中間表を作成する。問題文“複数の営業部が担当することはない”がヒントです。
  • 案件と受注を1:Nとしてしまうケース。“案件ごとに受注として記録する”ため多重度は1:1(ゼロ側の表記不要)。
  • スーパタイプ/サブタイプをすべて個別に他エンティティへ接続し、線が乱立するミス。指示通り“いずれか適切な方”で一本にまとめます。

FAQ

Q: 営業部社員が顧客グループを複数担当する例外は考慮しなくてよいのですか?
A: 問題文“1人の営業部社員は、一つの顧客グループを担当する。”と明記されており、例外を許容する要件は提示されていません。したがってN:1の設定とします。
Q: 案件の“分割”と“統合”は追加のリレーションシップが必要ですか?
A: 必要ありません。“案件ごとに、 分割の場合は分割元案件番号を、統合の場合は統合先案件番号を記録する。”とあるため、自己参照型の外部キーで表現でき、別リレーションシップを図示する指示は出ていません。
Q: スーパタイプとサブタイプを階層で描く根拠は?
A: “三つの営業部と九つの工事部がある。”“社員は、営業部又は工事部のいずれか一つの部に所属する。”のように共通知識を持つ上位集合と、属性追加や制約の異なる下位集合がはっきりしているため、スーパー/サブタイプ構造が最も自然です。

関連キーワード: 正規化、外部キー、カードィナリティ、サブタイプ、ERモデル

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:図2の関係スキーマを、テーブルとして定義する。 ここで、サブタイプの関係とスーパタイプの関係は、スーパタイプの関係にまとめたテーブルとして定義することを前提として、案件の集計について(1)、(2)に答えよ。

問題文を見る
(1)図3中の(ア)〜(シ)に入れる適切なテーブル名又は列名を答えよ。 データベーススペシャリスト試験(平成27年 午後1 問2 設問2-1)

模範解答

ア:顧客グループ名 イ:案件状態名 ウ:案件 エ:顧客 オ:顧客グループ カ:案件状態 キ:顧客番号 ク:顧客グループコード ケ:案件状態コード コ:部名 サ:案件詳細 シ:部

解説

解答の論理構成

  1. 集計対象の特定
    • 問題文では「顧客グループ名ごと案件状態名ごとに、 受注見込額を集計する」と明記されています。
    • また、「案件状態が失注” 又は ‘消滅” となった案件は無効とする」とあるため、関係スキーマに設けられた列「無効フラグ」で有効/無効を判定します。
  2. SELECT 句
    • 「顧客グループ名」はテーブル「顧客グループ」の列、
    • 「案件状態名」はテーブル「案件状態」の列です。
      したがって
      sql SELECT 顧客グループ名, 案件状態名, …
    となり、ア=顧客グループ名、イ=案件状態名と決まります。
  3. FROM 句と結合経路
    • 案件を起点に「顧客」→「顧客グループ」、「案件状態」をたどる必要があります。
    • 業務要件より
      • 「案件ごとに…顧客…担当営業部などを記録する」
      • 「顧客は、顧客グループのいずれか一つに所属する」
      • 「案件状態」マスタが存在する
      よって
      sql FROM 案件, 顧客, 顧客グループ, 案件状態
    となり、ウ=案件、エ=顧客、オ=顧客グループ、カ=案件状態です。
  4. WHERE 句の外部キー対応
    • 「案件」の列「顧客番号」が「顧客」の主キー「顧客番号」を参照する → キ=顧客番号
    • 「顧客」の列「顧客グループコード」が「顧客グループ」の主キー「顧客グループコード」を参照する → ク=顧客グループコード
    • 「案件」の列「案件状態コード」が「案件状態」の主キー「案件状態コード」を参照する → ケ=案件状態コード
      これで
      sql 案件.顧客番号 = 顧客.顧客番号
      顧客.顧客グループコード = 顧客グループ.顧客グループコード
      案件.案件状態コード = 案件状態.案件状態コード
    が完成します。
  5. GROUP BY 句
    • 集計軸は SELECT 句と同一ですから「顧客グループ名, 案件状態名」でグループ化します。
  6. ②のSQL(案件詳細まで含める集計)
    • ①に「案件詳細」「部」が増えるだけで基本ロジックは同じです。
    • 「案件詳細」の外部キー「担当工事部コード」が「部」の主キー「部コード」を参照している点を押さえれば、
      コ=部名, サ=案件詳細, シ=部 となります。
  7. 最終的な穴埋め
    • ア:顧客グループ名
    • イ:案件状態名
    • ウ:案件
    • エ:顧客
    • オ:顧客グループ
    • カ:案件状態
    • キ:顧客番号
    • ク:顧客グループコード
    • ケ:案件状態コード
    • コ:部名
    • サ:案件詳細
    • シ:部

誤りやすいポイント

  • 「案件状態名」と「案件状態コード」を混同し、GROUP BY でコードを使ってしまう。結果が読みにくく減点対象です。
  • 「顧客グループ」を経由せず「顧客」テーブルだけで集計しようとする。これでは「顧客グループ名」列を取得できません。
  • 無効フラグの条件を案件詳細側にも入れ忘れるケース。②のSQLでは 案件詳細.無効フラグ = 0が必須です。
  • 「部」テーブルには営業部も工事部も含まれるので、担当工事部を限定せず結合すると集計値が二重計上されます。必ず 担当工事部コード をキーに結合します。

FAQ

Q: 「案件状態」が失注・消滅でも無効フラグは0になりませんか。
A: 問題文の「案件状態が失注” 又は ‘消滅” となった案件は無効とする」により、状態遷移時に無効フラグが1に設定される設計が想定されています。したがってSQLでは無効フラグでフィルタします。
Q: アルファベット別名(例:A, B)を付けてもよいですか。
A: 実務や試験のSQL記述欄では別名を付与しても構いません。ただし本設問は「穴埋め」であり、列・テーブル名をそのまま答える形式なので別名は不要です。
Q: なぜ「部」テーブルを ① では使わず ② でだけ使うのですか。
A: ①の集計軸に「部名」は含まれておらず、案件詳細も参照しません。②では「工事部名ごと」の集計が要求されており、案件詳細の「担当工事部コード」を補足するために「部」テーブルが必要になります。

関連キーワード: 集計関数, 外部キー, 結合条件, GROUP BY, 無効フラグ

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

設問2:図2の関係スキーマを、テーブルとして定義する。 ここで、サブタイプの関係とスーパタイプの関係は、スーパタイプの関係にまとめたテーブルとして定義することを前提として、案件の集計について(1)、(2)に答えよ。

問題文を見る
(2)図3中の①と②のSQL文を実行すると、①の受注見込額の合計と、②の売上見込額の合計が一致しない場合がある。 その理由を45字以内で述べよ。

模範解答

・案件を担当する工事部が決まっていない場合、案件詳細が記録されないから ・案件と案件詳細を記録する契機が異なる場合があるから

解説

解答の論理構成

  1. 集計対象の確認
    • ①では“受注見込額”を持つ“案件”テーブルを、②では“売上見込額”を持つ“案件詳細”テーブルをそれぞれ集計しています。
  2. テーブル生成の契機
    • “案件”は【問題文】「5.(1) 案件は、営業活動の単位である。」の時点で作られる。
    • “案件詳細”は【問題文】「5.(3) 商談が進み、案件を担当する工事部が決定した時点で、案件詳細を記録する。」の条件を満たして初めて作られる。
  3. タイムラグが生む不一致
    • 工事部が未決定の案件は“案件詳細”が無いので②の合計に加算されず、①の合計だけが増える。
  4. まとめ
    • 従って「案件を担当する工事部が決まっていない場合、案件詳細が記録されないから」両者に差が生じる。

誤りやすいポイント

  • “無効フラグ”による除外と勘違いし、記録タイミングを見落とす。
  • 「案件詳細は必ず存在する」と思い込み、案件と案件詳細を1対多ではなく1対1と誤認する。
  • 分割・統合の話題に引っ張られ、根本原因から離れて説明してしまう。

FAQ

Q: 案件詳細が後で追加されたら集計差は解消されますか?
A: はい。工事部が決まり“案件詳細”が登録されれば②の合計に組み込まれるため、最終的には一致します。
Q: 無効フラグ付きのレコードは集計に含めるのですか?
A: 通常の業務設計では“無効フラグ=1”の行をWHERE句で除外します。ただし本設問は“案件詳細が無いケース”を問題にしており、無効フラグの有無は直接の原因ではありません。

関連キーワード: 集計タイミング、粒度の違い、サブタイプ設計、テーブル間依存、ビジネスルール

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリストを
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

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

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について