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


データベースの設計に関する次の記述を読んで, 設問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年 午後I 問2 図1)
データベーススペシャリスト試験(平成27年 午後I 問2 図2)
 解答に当たっては、 巻頭の表記ルールに従うこと。

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

図2 中の(a)〜(h)に入れる属性名を答えよ。(cとdは順不同)
模範解答
a:顧客グループコード b:担当営業部コード c:分割元案件番号 d:統合先案件番号 e:社員番号 f:社員番号 g:案件番号 h:担当工事部コード
解説

キーワードと論点整理

設問は関係スキーマ中の空欄(a)~(h)に、「どの業務ルールを反映した属性名」を入れるかを問うものです。
下表に模範解答をまとめます。(c・dは順不同で可)
空欄属性名
a顧客グループコード
b担当営業部コード
c分割元案件番号
d統合先案件番号
e社員番号
f社員番号
g案件番号
h担当工事部コード

解答の根拠

以下に、問題文の記述を引用しながら対応づけを行います。
  1. a:顧客グループコード
    「1人の営業部社員は, 一つの顧客グループを担当する。」
    → 営業部社員表 (営業部社員) に対応する顧客グループを示す外部キーとして 「顧客グループコード」 を保持
  2. b:担当営業部コード
    「一つの営業部は, 複数の顧客グループを担当する。…一つの顧客グループを, 複数の営業部が担当することはない。」
    → 顧客グループ表 (顧客グループ) にその担当営業部を示す外部キーとして 「担当営業部コード」 を保持
  3. c・d:分割元案件番号/統合先案件番号
    「案件ごとに, 分割の場合は分割元案件番号を, 統合の場合は統合先案件番号を記録する。」
    → 案件表 (案件) 中の空欄 c・d に、「分割元案件番号」「統合先案件番号」 を設定
    (設問では順不同で可)
  4. e:社員番号
    「案件の変更は, 担当営業部の社員が実施する。…案件の変更時, その変更履歴及び変更を実施した社員を記録する。」
    → 案件変更履歴表 (案件変更履歴) に操作社員を示す外部キーとして 「社員番号」 を保持
  5. f:社員番号
    「案件詳細の変更は, 担当営業部の社員又は担当工事部の社員のいずれかが実施する。…変更履歴及び変更を実施した社員を記録する。」
    → 案件詳細変更履歴表 (案件詳細変更履歴) に操作社員を示す外部キーとして 「社員番号」 を保持
  6. g:案件番号
    「受注ごとに, …対応する案件番号などを記録する。」
    → 受注表 (受注) に対応案件を示す外部キーとして 「案件番号」 を保持
  7. h:担当工事部コード
    「受注明細として, 担当工事部ごとの受注明細名, 受注明細額などを記録する。」
    → 受注明細表 (受注明細) に担当工事部を示す外部キーとして 「担当工事部コード」 を保持

誤りやすいポイント

  • c・dの混同
    どちらが「分割元案件番号」でどちらが「統合先案件番号」か迷いやすいが、設問文で「順不同」と明記されているため、両方を埋めれば正解になります。
  • e・fとも「社員番号」
    両履歴表に同じ属性名を使うため、同じキーを2回書くことに違和感を覚えやすいですが、どちらも「変更を実施した社員」を指す外部キーです。
  • gの取り違え
    受注表の g を「顧客番号」としてしまいがちですが、「顧客番号」ではなく「案件番号」を記録します。

試験対策ポイント

  • 業務ルール ⇔ 外部キー
    業務要件で「~を担当する」「~に対応する」と記載されている場合、該当するリレーションに外部キーを追加する設計パターンを確実に押さえましょう。
  • 分割/統合の履歴管理
    分割元・統合先の関係は必ずレコード上に持たせ、「同時実行なし」「無効フラグ」といったルールも合わせてチェックするクセをつけると、スキーマ設計ミスを防げます。
  • 履歴テーブルのキー設計
    変更履歴には必ず「変更を実施した社員番号」を登録する――このルールは案件/案件詳細どちらでも同様です。
  • 試験では順不同表記に注意
    「順不同」「どちらでもよい」といった指示がある場合、正解要素を漏れなく挙げることが重要です。

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

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

模範解答の核心キーワードと論点

  • サブタイプ/スーパタイプ(特殊化・一般化)の扱い
    (例)「部」をスーパタイプとし、「営業部」「工事部」をサブタイプ化
    「社員」をスーパタイプとし、「営業部社員」「工事部社員」をサブタイプ化
  • 業務ルールから導かれるリレーションシップと基数(1:1/1:N/N:1)
    (例)「顧客グループ」と「営業部」は1対N、「顧客」と「顧客グループ」はN対1
  • エンティティ間の履歴管理のリレーション
    (例)「案件」と「案件変更履歴」は1対N、「案件詳細」と「案件詳細変更履歴」は1対N
  • 受注関連の関係
    「案件」と「受注」は1対1(案件ごとに1つの受注を記録)
    「受注」と「受注明細」は1対N
    「受注明細」と「案件詳細」はN対1

各リレーションシップの論理的説明

  1. 部 ⇔ 営業部/工事部(特殊化)
    引用:「三つの営業部と九つの工事部がある。部は,部コードで一意に識別する。」
    → 「部」をスーパタイプ、「営業部」「工事部」をそれぞれサブタイプとして特殊化。
  2. 社員 ⇔ 営業部社員/工事部社員(特殊化)
    引用:「社員は,社員番号で一意に識別する。」「社員は,営業部又は工事部のいずれか一つの部に所属する。」
    → 「社員」をスーパタイプ、「営業部社員」「工事部社員」をサブタイプとして特殊化。
  3. 社員 ⇔ 部(所属関係:N対1)
    引用:「社員は…営業部又は工事部のいずれか一つの部に所属する。」
    → 社員(N) : 部(1)
  4. 営業部 ⇔ 顧客グループ(1対N)
    引用:「一つの営業部は,複数の顧客グループを担当する。 一つの顧客グループを,複数の営業部が担当することはない。」
    → 営業部(1) : 顧客グループ(N)
  5. 営業部社員 ⇔ 顧客グループ(N対1)
    引用:「1人の営業部社員は,一つの顧客グループを担当する。 一つの顧客グループを、複数の営業部社員が担当する場合がある。」
    → 営業部社員(N) : 顧客グループ(1)
  6. 顧客グループ ⇔ 顧客(1対N)
    引用:「顧客は…顧客グループのいずれか一つに所属する。」
    → 顧客グループ(1) : 顧客(N)
  7. 顧客 ⇔ 案件(1対N)
    引用:「案件ごとに…顧客…を記録する。」
    → 顧客(1) : 案件(N)
  8. 案件 ⇔ 案件状態(N対1)
    引用:「案件ごとに…案件状態…を記録する。」
    → 案件状態(1) : 案件(N)
  9. 案件 ⇔ 案件詳細(1対N)
    引用:「案件詳細は…案件詳細全体で一意な案件詳細番号で識別し…記録する。」
    → 案件(1) : 案件詳細(N)
  10. 案件 ⇔ 案件変更履歴(1対N)
    引用:「案件の変更時,その変更履歴及び変更を実施した社員を記録する。」
    → 案件(1) : 案件変更履歴(N)
  11. 案件詳細 ⇔ 案件詳細変更履歴(1対N)
    引用:「案件詳細についても同様に記録する。」
    → 案件詳細(1) : 案件詳細変更履歴(N)
  12. 案件 ⇔ 受注(1対1)
    引用:「案件状態が‘受注’となった時点で、案件ごとに受注として記録する。…対応する案件番号などを記録する。」
    → 案件(1) : 受注(1)
    (受注前はレコードなし、受注後は1件)
  13. 受注 ⇔ 受注明細(1対N)
    引用:「受注明細は、受注番号,受注明細番号で一意に識別する。」
    → 受注(1) : 受注明細(N)
  14. 受注明細 ⇔ 案件詳細(N対1)
    引用:「受注明細として,担当工事部ごとの…記録する。」
    → 担当工事部単位の受注明細は、該当する案件詳細に紐づく
    → 案件詳細(1) : 受注明細(N)

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

  • 「案件⇔受注」を1対1とするか1対Nとするか
    → 問文の「案件ごとに受注として記録する」を読み落とすと、複数受注を想定し誤答しやすい。
  • サブタイプとのリレーションをスーパタイプではなくサブタイプ同士に誤って書く
    → サブタイプ識別可能ならスーパタイプ⇔サブタイプで表現
  • 受注明細と案件詳細の関連を見落とす
    → 「担当工事部ごと」という文言から、工事部単位で分かれた明細は必ず案件詳細と紐づく

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

  • 業務ルールを丁寧に読み、エンティティ間の「主キー」「外部キー」となる属性に着目する
  • 「一つのAは複数のBを…」→A:1、B:N、「Aは一つのBを…複数のAがBを…」→A:N、B:1
  • サブタイプ(特化)/スーパタイプ(一般化)の取り扱い
    → 同じ外部キーを共有する仲間はスーパタイプにまとめ、サブタイプは追加属性のみ管理
  • 履歴管理(変更履歴)は必ず元エンティティとの1対N
  • 受注フェーズに入るとそれ以降は変更されない旨を読んで、1対1の関係とオプショナルキーを理解すること

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

図3 中の(ア)〜(シ)に入れる適切なテーブル名又は列名を答えよ。 データベーススペシャリスト試験(平成27年 午後I 問2 設問2-1)
模範解答
ア:顧客グループ名 イ:案件状態名 ウ:案件 エ:顧客 オ:顧客グループ カ:案件状態 キ:顧客番号 ク:顧客グループコード ケ:案件状態コード コ:部名 サ:案件詳細 シ:部
解説

キーワードと論点整理

本問は,「図3」に示された2つの SQL 文の穴埋め(ア~ケ,コ~シ)を行う設問です。主な論点は以下のとおりです。
  • どのテーブルを使って集計を行うのか
  • テーブル間を結合(JOIN)するための 結合条件(外部キーと主キーの対応)
  • SELECT句およびGROUP BY句に出現させる グルーピング列

解答(穴埋め対応表)

ラベルSQL①SQL②
顧客グループ名顧客グループ名
案件状態名案件状態名
案件案件
顧客顧客
顧客グループ顧客グループ
案件状態案件状態
顧客番号顧客番号
顧客グループコード顧客グループコード
案件状態コード案件状態コード
部名(工事部名)
案件詳細

なぜこの解答になるのか

1. 集計の対象テーブルとグルーピング

  • SQL① の要件
    「有効な案件(無効フラグが0である案件)について,顧客グループ名ごと案件状態名ごとに受注見込額を集計する」
    したがって SELECT,GROUP BY にはまず 顧客グループ名案件状態名 を置きます(ア=顧客グループ名,イ=案件状態名)。
  • SQL② の要件
    「有効な案件及び案件詳細(いずれも無効フラグが0)について,顧客グループ名ごと案件状態名ごと工事内容名ごとに売上見込額を集計する」
    → SELECT と GROUP BY に 顧客グループ名(ア),案件状態名(イ),工事部名(コ)を並べます。
    ※「工事内容名」と書かれていますが,概念モデル・関係スキーマでは工事部を表す「部」テーブルの部名で集計すると解釈できます。

2. テーブル間の結合条件

図中の関係スキーマおよび問題文から,主なリレーションシップは次のとおりです。
(1) 案件 ←→ 顧客
「案件ごとに…顧客…を記録する」
外部キー:案件.顧客番号 = 顧客.顧客番号
→ SQL①・SQL② ともに
・ ウ=案件,キ=顧客番号
・ エ=顧客
(2) 顧客 ←→ 顧客グループ
「顧客は…顧客グループのいずれか一つに所属する」
外部キー:顧客.顧客グループコード = 顧客グループ.顧客グループコード
→ SQL①・SQL② ともに
・ オ=顧客グループ,ク=顧客グループコード
(3) 案件 ←→ 案件状態
「案件…案件状態(‘商談中','受注', '失注',‘消滅’)」
外部キー:案件.案件状態コード = 案件状態.案件状態コード
→ SQL①・SQL② ともに
・ カ=案件状態,ケ=案件状態コード
(4) 案件 ←→ 案件詳細 (SQL②のみ)
「案件詳細は…案件番号を外部キーとして持つ」
→ SQL② で
・ サ=案件詳細
(5) 案件詳細 ←→ 部 (SQL②のみ)
「担当工事部…担当工事部コードを持つ」
→ SQL② の条件
・ サ.担当工事部コード = シ.部コード
・ シ=部

3. WHERE句の組み立て例(SQL①)

FROM 案件 ウ
  JOIN 顧客 エ
    ON ウ.顧客番号 = エ.顧客番号
  JOIN 顧客グループ オ
    ON エ.顧客グループコード = オ.顧客グループコード
  JOIN 案件状態 カ
    ON ウ.案件状態コード = カ.案件状態コード
WHERE ウ.無効フラグ = 0

4. WHERE句の組み立て例(SQL②)

FROM 案件 ウ
  JOIN 顧客 エ
    ON ウ.顧客番号 = エ.顧客番号
  JOIN 顧客グループ オ
    ON エ.顧客グループコード = オ.顧客グループコード
  JOIN 案件状態 カ
    ON ウ.案件状態コード = カ.案件状態コード
  JOIN 案件詳細 サ
    ON ウ.案件番号 = サ.案件番号
  JOIN 部 シ
    ON サ.担当工事部コード = シ.部コード
WHERE ウ.無効フラグ = 0
  AND サ.無効フラグ = 0

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

  1. グルーピング列の取り違え
    • SQL②で「工事内容名」とだけ書かれているので,案件詳細名 と混同しがちですが,実際には「工事部名(部名)」でグループ化します。
  2. テーブル「部」と「工事部」の混同
    • 関係スキーマでは,工事部 部門の属性を持つ「工事部」テーブルとは別に,部コードや部名を持つ「部」テーブルが存在します。
    • 工事部名を取り出すには「部」テーブルの部名カラムを参照します。
  3. JOIN条件の抜け漏れ
    • 外部キー対応を忘れると多重集計や Cartesian product のリスクがあります。
    • SQL②では案件詳細と部の結合条件を必ず入れること。

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

  • 関係データモデルでは,外部キー = 主キー の組合せでテーブルを結合する
  • 集計系SQLは,SELECTとGROUP BYに同じ列を列挙する
  • 問題文の業務要件(「どの属性でグルーピングするか」「無効フラグ=0」など)を抜けなく反映する
  • 類似用語(例:「工事部」 vs 「部」)を混同しないようにスキーマ図を正確に読む
これらを意識して SQL 文を組み立てれば,集計系の穴埋め問題に強くなります。

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

図3 中の①と②の SQL文を実行すると,①の受注見込額の合計と、②の売上見込額の合計が一致しない場合がある。 その理由を 45字以内で述べよ。
模範解答
・案件を担当する工事部が決まっていない場合,案件詳細が記録されないから ・案件と案件詳細を記録する契機が異なる場合があるから
解説

キーワード・論点整理

  • 未記録の案件詳細
  • 登録(記録)タイミングの違い

解説

SQL①は案件の「受注見込額」を集計し、SQL②は案件詳細の「売上見込額」を集計しています。しかし、問題文には
「商談が進み, 案件を担当する工事部が決定した時点で、案件詳細を記録する。」
とあり、工事部が未決定の案件には案件詳細が存在しません
また、
「案件状態が‘受注’となった時点で, …これ以降,案件及び案件詳細が変更されることはない。」
ともあるように、登録先が異なるタイミングでデータが作成されるため、両者の合計値が一致しない場合があります。

受験者のひっかけポイント

  • 「受注見込額」と「売上見込額」の対象テーブル(案件/案件詳細)を混同しやすい
  • 案件詳細登録は“受注”前の段階で行われるという前提を見落とすと、なぜ差異が生じるか理解できない

試験対策ポイント

  • ヘッダ(案件)と明細(案件詳細)の登録契機の違いを必ず確認する
  • データ不整合が起こる典型例として、「登録タイミングのズレ」を押さえる
  • 問題文中の「~時点で記録する」という文言はデータ発生のトリガーを示していると覚えておくこと
← 前の問題へ次の問題へ →

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