戦国IT

情報処理技術者試験の過去問対策サイト

データベーススペシャリスト試験 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,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 許容, エンティティ分割

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

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

模範解答

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

解説

解答の論理構成

  1. 組織系リレーション
    • 【対象業務の概要】1.(1) により「三つの営業部と九つの工事部がある。 部は,部コードで一意に識別する。」
    • 2.(2) により「社員は,営業部又は工事部のいずれか一つの部に所属する。」
      ―社員 は 1:N。サブタイプ(営業部,工事部)は識別可能サブタイプなのでスーパタイプ側で関係を張る。
  2. 顧客グループ担当系リレーション
    • 4.(1) 「一つの営業部は,複数の顧客グループを担当する。 一つの顧客グループを,複数の営業部が担当することはない。」
      ⇒ 営業部―顧客グループ は 1:N(営業部側1)。
    • 4.(2) 「1人の営業部社員は,一つの顧客グループを担当する。 一つの顧客グループを、複数の営業部社員が担当する場合がある。」
      ⇒ 営業部社員―顧客グループ は N:1(顧客グループ側1)。
  3. 顧客系リレーション
    • 3.(3) 「顧客は,顧客グループのいずれか一つに所属する。」
      ⇒ 顧客グループ―顧客 は 1:N。
  4. 案件系リレーション
    • 5.(1)(2) 「案件は,案件番号で一意に識別」「…顧客, 受注見込額, 担当営業部などを記録する。」
      ⇒ 顧客―案件, 営業部―案件 はともに 1:N。
    • 5.(2) 「案件状態(‘商談中','受注', '失注',‘消滅')」
      ⇒ 案件状態―案件 は 1:N。
    • 5.(3)② 「複数の工事部が担当することになった場合, 工事部ごとに案件詳細を記録する。」
      ⇒ 工事部―案件詳細 は 1:N。
    • 同⑤ 「案件を担当する工事部が決定した時点で、案件詳細を記録する。」
    • 同④ 「一つの案件に対応する無効としていない案件詳細の売上見込額の合計は,案件の受注見込額と一致させる。」
      ⇒ 案件―案件詳細 は 1:N。
  5. 履歴系リレーション
    • 5.(7) 「案件の変更は,担当営業部の社員が実施する。 …変更履歴及び変更を実施した社員を記録する。」
      ⇒ 案件―案件変更履歴, 社員―案件変更履歴 はともに 1:N。
    • 案件詳細側も同様に、案件詳細―案件詳細変更履歴, 社員―案件詳細変更履歴 を定義。
  6. 受注系リレーション
    • 6. 「案件状態が‘受注’となった時点で, 案件ごとに受注として記録する。」
      ⇒ 案件―受注 は1:1(受注は必ず元案件を持つ)。
    • 同「受注明細…担当工事部ごと」
      ⇒ 受注―受注明細 は 1:N。
  7. (a)〜(h) の外部キー
    図2の空欄は上記リレーションの結果、
    (a) 顧客グループコード
    (b) 営業部コード
    (c) 分割元案件番号
    (d) 統合先案件番号
    (e) 変更社員番号
    (f) 変更社員番号
    (g) 案件番号
    (h) 担当工事部コード
    で埋まる。

誤りやすいポイント

  • スーパタイプとサブタイプの双方に重複して線を引いてしまう
  • 「営業部社員―顧客グループ」を 1:1 と誤解(実際は 4.(2) 後段で N 側が社員)
  • 「案件詳細―工事部」を M:N と考え中間テーブルを想像してしまう
  • 履歴エンティティに社員との関係を作り忘れる
  • 受注を案件詳細と直接結び付けてしまう

FAQ

Q: 顧客グループと営業部社員のリレーションは営業部を経由すれば不要では?
A: 【対象業務の概要】4.(2) に「1人の営業部社員は,一つの顧客グループを担当」と明記され、直接参照する属性 (a) が存在します。正規化の観点でも直接リレーションを置く方が冗長更新を防げます。
Q: 案件―受注 を 1:N としてはいけませんか?
A: 6. に「案件状態が‘受注’となった時点で, 案件ごとに受注として記録する。」とあり、一案件につき受注は最大1件です。逆に受注は必ず元案件を持つので 1:1 が正しいカードィナリティです。
Q: 案件詳細変更履歴に社員とのリレーションが必要な理由は?
A: 5.(7) 「案件詳細の変更は,担当営業部の社員又は担当工事部の社員のいずれかが実施する。 …変更を実施した社員を記録する。」とあるため、変更者を外部キーで保持する必要があります。

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

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

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

模範解答

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

解説

解答の論理構成

  1. 集計の軸(SELECT, GROUP BY)
    “〔対象業務の概要〕 7.(1) 顧客グループ名ごと案件状態名ごとに, 受注見込額を集計する。” と “7.(2) 顧客グループ名ごと案件状態名ごと工事部名ごとに, 売上見込額を集計する。” から
    • ① SELECT と GROUP BY の列は “顧客グループ名”, “案件状態名”。
    • ② ではこれに “部名” を追加。
      よって(ア)顧客グループ名,(イ)案件状態名,(コ)部名 と決定。
  2. FROM 句―ベーステーブル
    受注見込額は “案件” に保持される(5.(2) “受注見込額”)。売上見込額は “案件詳細” に保持される(5.(3)① “売上見込額”)。よって
    • ① FROM には “案件” を置く →(ウ)案件
    • ② FROM には “案件” と “案件詳細” →(ウ)案件,(サ)案件詳細
  3. FROM 句―リレーションを補完
    “案件” は “顧客番号” で “顧客” と結合(4.(1) ~ 5.(2))。“顧客” は “顧客グループコード” で “顧客グループ” と結合(3.(3))。“案件” は “案件状態コード” で “案件状態” と結合(5.(2))。
    よって
    • (エ)顧客
    • (オ)顧客グループ
    • (カ)案件状態
    • 結合列は “顧客番号”, “顧客グループコード”, “案件状態コード” →(キ),(ク),(ケ)
  4. ②における工事部名取得
    “売上見込額” は “担当工事部” 単位で管理(5.(3)①)。担当工事部の名称は “部” テーブルにある(1.(1) “部は,部コードで一意に識別”)。サブタイプ統合の前提より工事部テーブルを用いず “部” を参照。
    • “案件詳細.担当工事部コード = 部.部コード” となるため
      (シ)部
  5. 無効排除条件
    “無効フラグが0である案件(…)を集計” という文に合わせ WHERE 句で “案件.無効フラグ = 0”(②では “案件詳細.無効フラグ = 0” も追加)。

誤りやすいポイント

  • 工事部名取得に 工事部 テーブルを置いてしまう。設問指定でスーパタイプ “部” にまとめるので “部” でなければ不正解になります。
  • “顧客グループ名” ではなく “顧客グループコード” を SELECT してしまい集計軸を誤る。
  • ②の JOIN 条件で “案件番号” の結合を忘れ、重複行で集計値が水増しされる。
  • 無効フラグの判定を “≠ 1” のように書き、NULL 行の扱いで統計が狂う。

FAQ

Q: “担当工事部コード=部コード” を WHERE 句に書くのはINNER JOINと同じですか?
A: はい。同値結合条件を書いてから SELECT する構文でも、INNER JOIN 句を用いても結果は同じです。設問は可読性より穴埋め学習を優先してWHERE句形式にしています。
Q: “部名” を GROUP BY に含めると “工事部” 以外も対象になりませんか?
A: 結合条件に “案件詳細.担当工事部コード=部.部コード” があるため、案件詳細に紐付く部(=工事部)だけが抽出されます。営業部は担当工事部コードで結合されないので結果集合には出現しません。
Q: 無効フラグを参照するテーブルを限定する理由は?
A: ①は “案件” しか数値を持たないため “案件.無効フラグ” だけ、②は “案件” と “案件詳細” 両方に無効データがあり得るため双方の無効フラグをチェックする必要があります。

関連キーワード: 集約関数, テーブル結合, 正規化, サブタイプ統合

設問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句で除外します。ただし本設問は“案件詳細が無いケース”を問題にしており、無効フラグの有無は直接の原因ではありません。

関連キーワード: 集計タイミング, 粒度の違い, サブタイプ設計, テーブル間依存, ビジネスルール
← 前の問題へ次の問題へ →

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