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

データベーススペシャリスト 2014年 午後1 問01


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

 A社は、ソフトウェアパッケージの開発及び販売を主力事業としている会社である。 A社ではこれまで、ソフトウェアの開発中に発生したバグの管理に表計算ソフトを用いてきたが、大規模なBソフトウェアパッケージ開発プロジェクト (以下、Bプロジェクトという)の立上げを機に、新たにバグ管理システムを構築することになった。バグ管理システムの設計担当には、C君が任命された。   〔Bプロジェクトの概要〕  Bプロジェクトの概要は、次のとおりである。
(1) 組織は、階層構造の複数のチーム編成である。 (2) チームは、チームIDで一意に識別され、チーム名、リーダを任されたメンバ、上位階層のチームが定められている。 (3) メンバは、メンバIDで一意に識別され、所属するチームが定められている。 メンバは、主担当として必ず一つのチームに所属するほか、他の一つ又は複数のチームを兼任する場合もある。 (4) 開発モデルは、ウォータフォールモデルを採用している。 開発工程は、工程IDで一意に識別され、工程名、工程の順序番号が定められている。 (5) 各開発工程では、設計書、ソースコードなどの様々な成果物が作成される。 成果物は、成果物IDで一意に識別される。 成果物には、成果物名、成果物の作成工程、作成担当チームが記される。   〔バグ管理の概要〕  Bプロジェクトにおけるバグ管理の概要は、次のとおりである。 (1) ソフトウェアのテストを実施し、期待するテスト結果と実際のテスト結果にかい離があり、何らかの対応が必要と考えられる現象をバグと呼ぶ。 (2) バグ種別とは、バグの原因を分類するための区分であり、バグ種別名及び成果物の修正有無が定められている。 (3) バグが発見されたら、表1のプロセスに従って解決する。 (4) ソフトウェアの品質分析を行うメンバは、登録されたバグの集計及び分析を行う。品質分析の対象とするバグは、成果物の修正が必要なバグ種別が設定されたバグである。
データベーススペシャリスト試験(平成26年 午後1 問1 表1)
〔データモデルの設計〕  C君は、バグ管理システムの構築に当たり、具体例を用いて、概念データモデル (図1)及び関係スキーマ (図2) の設計を行った。   データベーススペシャリスト試験(平成26年 午後1 問1 図1) ↩設問2(1) ↩設問2(2) ↩設問2(3) ↩設問2(4)
 図2の関係スキーマの主な属性とその意味 制約を表2に示す。図4は、図3の関数従属性の表記法に従って、関係 “優先度” の属性間の関数従属性を示したもの である。表3〜5は、関係 “バグ”、“工程”、“バグ種別” の具体例である。
データベーススペシャリスト試験(平成26年 午後1 問1 表2)
データベーススペシャリスト試験(平成26年 午後1 問1 表4)
〔D部長の指摘事項〕  C君の上司のD部長はC君が設計した内容をレビューし、次の指摘をした。
 指摘事項① 図1は、リレーションシップが記入されていない。 また、図2の関係スキーマの一部も未記入である。  指摘事項② 関係 “チーム”、“メンバ”には、プロジェクトの組織構造の一部を管理できない不具合がある。  指摘事項③ 成果物と、バグの修正を行ったときに修正した成果物の情報を管理する関係スキーマが設計されていない。   〔バグの集計及び分析〕  C君は、バグの集計及び分析を行う際に使用する、関係 “バグ”、“工程”、“バグ種別” に対する検索内容と関係代数演算について検討した。 表6は、関係代数演算の表記法を示したものであり、表7は、表3〜5の具体例を用いて検討した検索内容及び関係代数演算である。
 解答に当たっては、巻頭の表記ルールに従うこと。 関係スキーマの解答に当たっては、主キー及び外部キーを明記せよ。

設問1:図2及び図4の関係 “優先度” について、(1)、(2)に答えよ。

問題文を見る
(1)関係“優先度” の候補キーを全て答えよ。 また、部分関数従属性、推移的関数従属性の有無を、“あり” 又は “なし” で答えよ。“あり”の場合は、その関数従属性の具体例を、図3中の意味の欄に示した表記法に従って示せ。

模範解答

候補キー:{緊急度コード、重大度コード} 部分関数従属性の有無:あり 推移的関数従属性の有無:あり 部分関数従属性:  ・緊急度コード → スケジュール影響度  ・重大度コード → ソフトウェア影響度 推移的関数従属性:  {緊急度コード、重大度コード} → 優先度コード → リソース投入度

解説

解答の導き方

設問は、関係「優先度」について候補キーを全て特定し、部分関数従属性・推移的関数従属性の有無を判定して、あれば具体例を図3の表記法に従って示すことを求めています。まず関係の属性と図4の矢印が示す関数従属性を整理します。
  1. 属性の確認
    図2に「優先度(緊急度コード、 スケジュール影響度、 重大度コード、 ソフトウェア影響度、 優先度コード、 リソース投入度)」とあるため、関係の属性は次の6つです:
    緊急度コード、スケジュール影響度、重大度コード、ソフトウェア影響度、優先度コード、リソース投入度。
  2. 図4から読み取れる関数従属性(FD)の抽出
    図4の矢印は属性間の関数従属性を示しているため、図4から次の4つのFDが読み取れます(矢印の向きに注意して読み取ること):
  • 緊急度コード → スケジュール影響度
  • 重大度コード → ソフトウェア影響度
  • {緊急度コード、重大度コード} → 優先度コード
  • 優先度コード → リソース投入度
  1. 候補キーの判定(段階的に)
    候補キーは「その集合から全属性が決定でき、かつ最小である集合」です。図4のFDを使って、主要候補を検証します。
  • {緊急度コード、重大度コード} の閉包を求める(つまりこの集合から導ける属性を順に追加する)と:
    1. 初期:X = {緊急度コード、重大度コード}
    2. 緊急度コード → スケジュール影響度 よりXに スケジュール影響度 を追加 → X = {緊急度コード、重大度コード、スケジュール影響度}
    3. 重大度コード → ソフトウェア影響度 よりXに ソフトウェア影響度 を追加 → X = {緊急度コード、重大度コード、スケジュール影響度、ソフトウェア影響度}
    4. {緊急度コード、重大度コード} → 優先度コード よりXに 優先度コード を追加 → Xに 優先度コードを追加
    5. 優先度コード → リソース投入度 よりXに リソース投入度 を追加
    6. 最終的にXは関係の全属性を含むため、{緊急度コード、重大度コード} はスーパーキーであり、かつ最小性を以下で確認します。
  • 最小性の確認(部分集合がスーパーキーでないこと)
    • 緊急度コード 単独の閉包は 緊急度コード と スケジュール影響度 にとどまり、全属性にならない。
    • 重大度コード 単独の閉包は 重大度コード と ソフトウェア影響度 にとどまり、全属性にならない。
    • 優先度コード 単独の閉包は 優先度コード と リソース投入度 にとどまり、全属性にならない。
    • 優先度コード を含む他の組合せ(例:{優先度コード、緊急度コード})も、図4に「優先度コード → 重大度コード」のような逆方向のFDが示されていないため、重大度コードを導けず全属性にならない。図4では「優先度コード」から「緊急度コード/重大度コード」へ向かう矢印は示されていませんので、優先度コード単独や優先度コードを含む組合せがキーになることはありません。
これらから、最小性を満たす候補キーは唯一つであり、候補キーは {緊急度コード、重大度コード} であると判断できます。
  1. 部分関数従属性・推移的関数従属性の判定と具体例(図3表記法に従う)
  • 部分関数従属性の定義:複合候補キーの一部が非キー属性を決定する場合に「部分関数従属性がある」と言います。今回の候補キーは複合キー {緊急度コード、重大度コード} なので、その一部が非キー属性を決定しているかを調べます。図4により次が成り立つため、部分関数従属性は存在します。
    • 緊急度コード → スケジュール影響度
    • 重大度コード → ソフトウェア影響度
    図3の表記法に従うとそれぞれ「A → B」型で表せます(上記のとおり)。
  • 推移的関数従属性の定義:候補キーが非キー属性を決定し、その非キー属性がさらに別の非キー属性を決定するような連鎖がある場合に「推移的関数従属性がある」と言います。図4から次の連鎖が読み取れるため、推移的関数従属性は存在します。
    • {緊急度コード、重大度コード} → 優先度コード → リソース投入度
以上の論理展開により、候補キー・部分従属性・推移的従属性は次のとおり判定できます(説明の流れで示した結論です)。

誤りやすいポイント

  • 「コード」という属性名だから必ず候補キーだと誤判断する。属性名だけで判定せず、図や与えられた関数従属性に基づいて決定可能性を確認すること。
  • 属性説明(列の説明文)だけでFDを決めつけない。FDは図4の矢印や問題文で明示された関係から読み取るのが正しい判断基準です。
  • 部分関数従属性と推移的関数従属性を混同する。部分従属性は「複合キーの一部 → 非キー」、推移的は「候補キー → 非キーA → 非キーB」のような連鎖を探すこと。
  • 図3の表記法に従って書き表すのを忘れると減点につながる。出力形式は問題の指定に合わせること。

FAQ

Q: 優先度コードが「コード」なので候補キーにならないか確かめる簡単な方法は?
A: 図4の矢印の向きを見てください。図4には「優先度コード」から「緊急度コード/重大度コード」へ向かう矢印は示されていません。つまり「優先度コード」からそれらを導けないため、優先度コード単独では全属性を決定できず候補キーになりません。
Q: 部分関数従属性と推移的関数従属性の見分け方を簡潔に教えてください。
A: 部分関数従属性は「複合候補キーの一部が非キー属性を決定するか」を見ます。推移的関数従属性は「候補キーが決定する非キー属性がさらに別の非キー属性を決定する連鎖があるか」を見ます。今回の例では前者が 緊急度コード → スケジュール影響度 等、後者が {緊急度コード、重大度コード} → 優先度コード → リソース投入度 の形で現れます。
Q: この関係は正規化の観点でどう評価しますか?(実務的な補足)
A: 部分関数従属性が存在するため2NFではありません。さらに推移的関数従属性があるため3NFにも違反しています。正規化するなら、部分従属性と推移的従属性を取り除くように関係を分割します。

関連キーワード: 関数従属性、候補キー、部分関数従属性、推移的関数従属性、正規化

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

この設問をAIに質問する

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

設問1:図2及び図4の関係 “優先度” について、(1)、(2)に答えよ。

問題文を見る
(2)関係“優先度”は、第1正規形、第2正規形、第3正規形のうち、どこまで正規化されているかを答えよ。 また、第3正規形でない場合は、第3正規形に分解した関係スキーマを示せ。

模範解答

正規形:第1正規形 関係スキーマ:  緊急度(緊急度コード、スケジュール影響度)  重大度(重大度コード、ソフトウェア影響度)  優先度変換(緊急度コード、重大度コード、優先度コード)  優先度(優先度コード、リソース投入度)

解説

解答の論理構成

  1. 関係 “優先度” の候補キー決定
    • 図4より「{緊急度コード、重大度コード} → 優先度コード → リソース投入度」が成り立つ。
    • さらに「緊急度コード → スケジュール影響度」「重大度コード → ソフトウェア影響度」。
    • {緊急度コード、重大度コード} だけで全属性を導出でき、これが主キー。
  2. 正規形の判定
    • 第1正規形は属性が単一値で満たす。
    • 第2正規形:非キー属性は主キー全体に完全関数従属していなければならない。
      • スケジュール影響度 は 緊急度コード のみで決定
      • ソフトウェア影響度 は 重大度コード のみで決定
      → 部分関数従属があるため第2正規形を満たさない。
    • よって現状は第1正規形。
  3. 第3正規形への分解
    • 部分関数従属を解消
      • 緊急度 と 重大度 の各リストを分離。
    • 推移関数従属を解消
      • 優先度コード → リソース投入度 により「緊急度コード、重大度コード → 優先度コード → リソース投入度」がある。
      優先度コードを別表にし、リソース投入度をそこへ移す。
    • 得られた四つの関係は上記スキーマであり、すべて第3正規形を満たす。

誤りやすいポイント

  • 「優先度コード」を主キーと誤認し、第2正規形と判断してしまう。
  • 先に優先度コード表を切り出しただけで満足し、部分関数従属の解消を忘れる。
  • 分解後の外部キーを明記しないため減点される。

FAQ

Q: 「緊急度コード」と「重大度コード」の組に重複がある場合でも正規化は必要ですか?
A: はい。重複の有無ではなく、関数従属性に基づいて正規形を判定します。部分関数従属が存在する限り第2正規形にはなりません。
Q: 「優先度変換」表の主キーは何ですか?
A: 「緊急度コード、重大度コード」の複合キーです。図4よりこの組み合わせで一意に「優先度コード」が決まります。
Q: 第3正規形とボイス・コッド正規形(BCNF)の違いは気にするべきですか?
A: この問題では第3正規形までを求めています。図4の依存性では得られた四関係はBCNFも満たしますが、設問範囲外です。

関連キーワード: 正規化、関数従属性、候補キー、部分関数従属、データベース設計

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

この設問をAIに質問する

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

設問2:図1,図2及び 〔D部長の指摘事項〕 について、(1)〜(4)に答えよ。

問題文を見る
(1)指摘事項 ① について、図1のエンティティタイプ間のリレーションシップを全て記入せよ。 同一のエンティティタイプ間に異なる役割をもつ複数のリレーションシップが存在する場合、役割の数のリレーションシップを表す線を記入すること。  なお、図に表示されていないエンティティタイプは考慮しなくてよい。 また、エンティティタイプ間の対応関係にゼロを含むか否かの表記は不要である。

模範解答

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

解説

解答の論理構成

  1. バグと工程
    • バグには「発見工程ID」「作り込み工程ID」「発見すべき工程ID」の3つの外部キー候補があります【表2】。
    • いずれも「工程ID」を参照するため、エンティティタイプ“工程”と“バグ”の間にリレーションシップを引きます。役割(発見・作り込み・発見すべき)が異なるので、同一対のエンティティに3本の線を描きます。
  2. バグとバグ(自己参照)
    • 「同一原因バグID」は「既知のバグと同一原因のバグの場合は、その既知のバグを記録」【表1バグの原因調査】と定義されています。
    • これは“バグ”が別の“バグ”を指す自己参照関係なので、バグの箱から戻るループ線で表します。
  3. バグとバグ種別
    • 「バグ種別ID」で“バグ種別”を参照するため、両者を結ぶリレーションシップが必要です【表2】。
  4. バグと対応
    • 「バグID」と「対応連番号」の組で“対応”の主キーを構成する【表2】ので、1つのバグに複数の対応がぶら下がる関係(1対多)となります。
  5. バグとメンバ(発見者)
    • 「発見メンバID」が「バグを発見したメンバ」【表1バグの登録】を示すため、発見者用のリレーションシップを引きます。
  6. 対応とメンバ(担当者)
    • 「対応区分ごとにメンバを1人割り当てて登録」【表1バグへの対応】とあるので、対応担当者用のリレーションシップを追加します。
  7. 対応と調査・修正・確認
    • “調査”、“修正”、“確認”は対応の区分ごとに発生するサブタイプです。Y字に分かれる線で1:N関係(1つの対応は調査・修正・確認のいずれか1つ)を示します。
以上を図示したものが模範解答のER図です。

誤りやすいポイント

  • 「同一原因バグID」を見落とし、自己参照リレーションシップを描かない。
  • 工程が3役(発見・作り込み・発見すべき)あるのに1本しか線を引かない。役割数だけ線が要ることに注意。
  • 発見メンバと対応担当メンバの区別をつけず、メンバとバグ/対応を1本の線で済ませてしまう。
  • 調査・修正・確認が“対応”のサブタイプであることを忘れ、独立エンティティとして描く。

FAQ

Q: 「工程」と「バグ」の線は3本とも必ず必要ですか?
A: はい。「発見工程ID」「作り込み工程ID」「発見すべき工程ID」は別々の意味を持つ外部キーなので、ER図では3つの異なる役割として表現します。
Q: 自己参照リレーションシップはループ線以外で表しても良いですか?
A: ER図の記法によりますが、本試験では箱から戻るループ線で描くのが推奨されています。【同一原因バグID】がその根拠です。
Q: 「調査」「修正」「確認」はテーブル分割せず1つのテーブルにしては?
A: 「各対応を開始したら開始日時を…」「対応区分ごとにメンバを1人割り当てて登録」【表1】とあるため、汎用テーブル“対応”で区分を持たせ、詳細はサブタイプに分ける設計が自然です。

関連キーワード: 自己参照, 外部キー, サブタイプ, 1対多, ER図

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

この設問をAIに質問する

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

設問2:図1,図2及び 〔D部長の指摘事項〕 について、(1)〜(4)に答えよ。

問題文を見る
(2)指摘事項 ① について、図2中の(a)〜(d)に入れる属性名を答えよ。(a, bは順不同、c, dは順不同)

模範解答

a:ステータス b:完了日 c:対応区分 d:対応メンバID

解説

解答の論理構成

  1. バグ表に必要な属性の洗い出し
    • 【問題文】「登録時のバグのステータスは『未着手』」
    • 「ステータスが『解決済』のバグについて完了日を記録し、ステータスを『クローズ済』に更新」
    • よってバグの状態管理には“ステータス”と“完了日”が不可欠 → (a)(b) に充当。
  2. 対応表に必要な属性の洗い出し
    • 【問題文】「その対応がどの作業であるかを、対応区分として記録」
    • 「対応区分ごとにメンバを1人割り当てて登録」
    • 作業種別を示す“対応区分”と割り当てられた“メンバID”が要件 → (c)(d) に充当。
  3. 順不同指定の確認
    • 問題指示により“a,bは順不同”“c,dは順不同”なので、ペア内の並びは評価に影響しない。

誤りやすいポイント

  • “完了日”を対応側に置いてしまうミス。完了日はバグ全体のライフサイクル終了を示すためバグ表に属する。
  • “対応メンバID”を氏名で設計する誤り。IDでないと他表(メンバ)との参照整合性が取れない。
  • “対応区分”と“ステータス”を混同するミス。前者は作業種別、後者はバグ解決プロセス全体の状態。

FAQ

Q: “完了日”はなぜ対応ではなくバグ表に置くのですか?
A: 【問題文】の「ステータスが『解決済』のバグについて完了日を記録」という文が“バグ”に対する操作であるためです。
Q: “対応メンバID”を外部キーとする根拠は?
A: 「対応区分ごとにメンバを1人割り当てて登録」という要件から、メンバ表と参照整合性を保つ必要があるためです。
Q: ステータスはコード化すべきですか?
A: 試験問題では文字列記録ですが、実システムではコード化し状態遷移表で管理する方が整合性を高められます。

関連キーワード: 外部キー、関係スキーマ、状態遷移、正規化、データモデリング

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

この設問をAIに質問する

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

設問2:図1,図2及び 〔D部長の指摘事項〕 について、(1)〜(4)に答えよ。

問題文を見る
(3)指摘事項 ②の不具合を二つ挙げ、それぞれ25字以内で述べよ。また、不具合を解消した関係スキーマを示せ。

模範解答

不具合:① チームの上位階層のチームを管理できない。     ② メンバが兼任しているチームを複数管理できない。 関係スキーマ:チーム(チームID、チーム名、リーダメンバID、上位チームID)        メンバ(メンバID、氏名、主担当チームID)        兼任(メンバID、兼任チームID)

解説

解答の導き方

  1. 要件から抜き出す
    • 「チームは、チームIDで一意に識別され、チーム名、リーダを任されたメンバ、上位階層のチームが定められている。」とあるため、チームは同じチームの別レコードを参照して「上位階層」を表現できる属性が必要です。図2のチームには 上位チームIDがないので、この要件を満たしていません。
    • 「メンバは、メンバIDで一意に識別され、所属するチームが定められている。メンバは、主担当として必ず一つのチームに所属するほか、他の一つ又は複数のチームを兼任する場合もある。」とあるため、メンバとチーム間に「主担当(1つ)」と「兼任(0~複数)」の関係があることが分かります。図2のメンバに単一の 兼任チームID属性しかないと複数兼任を表せず、関係モデルとして不適です。
  2. 不具合の特定(設計上の論理)
    • 要件が「上位階層のチームが定められている」と明示しているのにチーム表に上位を示す属性がない → 上位チームを管理できない。
    • 要件が「他の一つ又は複数のチームを兼任する場合もある」と明示しているのにメンバ表が単一の兼任チームIDで表現している → 複数兼任を管理できない。
  3. 解消方法の検討と決定
    • 「上位階層のチーム」は同じチーム表内の別の行を参照する自己参照外部キー(上位チームID)で表現します。別表として分離すると同一のチーム情報が分散して更新整合性を損なうため、自己参照が適切です。
    • 「兼任」はメンバとチームの多対多関係なので、中間表(兼任)で表現します。中間表は (メンバID, 兼任チームID) の複合主キーを持ち、両者を外部キーで参照します。
    • さらに、チームのリーダはメンバの存在を参照するため、リーダメンバIDを メンバ.メンバIDへの外部キーとします。主担当は必須なので 主担当チームIDは NOT NULLとしてチームを参照します。
  4. 最終的な解答(簡潔表示)
    不具合:① チームの上位階層のチームを管理できない。
    不具合:② メンバが兼任しているチームを複数管理できない。
    関係スキーマ(修正版)
    • チーム(チームID PK, チーム名, リーダメンバID FK→メンバ.メンバID, 上位チームID FK→チーム.チームID)
      • 備考:上位チームIDはトップ階層の場合NULLを許す。リーダメンバIDは既存のメンバを参照する外部キーとする。
    • メンバ(メンバID PK, 氏名, 主担当チームID FK→チーム.チームID NOT NULL)
      • 備考:要件により主担当チームIDは必須とする。
    • 兼任(メンバID, 兼任チームID)
      • 主キー:PK = (メンバID, 兼任チームID)
      • 外部キー:メンバID FK→メンバ.メンバID、兼任チームID FK→チーム.チームID

誤りやすいポイント

  • 兼任をメンバ表の単一属性(兼任チームID)で表すと第一正規形に反し、複数値を扱えない。
  • 上位チームを別表に分けるとチーム情報が分散し更新・削除の整合性が難しくなる(自己参照が適切)。
  • リーダメンバIDを外部キーにし忘れると、存在しないメンバをリーダに指せて整合性が崩れる。
  • 主担当チームIDをNULL許可にすると「必ず一つ」の要件を満たさない。
  • 兼任の中間表で主キーを設定しないと同一組合せの重複登録を防げない。

FAQ

Q: 上位チームを自己参照することで循環参照が発生しますか?
A: チーム.上位チームIDは自己参照外部キーで問題ありません。トップはNULLにしておき、挿入順序(親を先に作る、あるいは一旦NULLで挿入して後で更新)や遅延制約で対応します。
Q: リーダが必ずそのチームのメンバであることをDBレベルで保証できますか?
A: 完全には単純な外部キー制約だけでは保証できません(リーダが別チームの主担当である可能性など)。「リーダがそのチームの主担当か兼任であること」を保証するにはチェック制約やトリガでメンバと兼任の組合せを検査する必要があります。
Q: 兼任表に主担当のチームが混ざるのは許容されますか?
A: 設計としては主担当と兼任は区別して管理するのが望ましく、主担当はメンバ表の主担当チームID、兼任は中間表で管理します。重複を禁止する場合は追加の制約や運用ルールが必要です。

関連キーワード: 自己参照外部キー、参照整合性、多対多関係、複合主キー、正規化

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

この設問をAIに質問する

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

設問2:図1,図2及び 〔D部長の指摘事項〕 について、(1)〜(4)に答えよ。

問題文を見る
(4)指摘事項 ③ で設計されていないとしている関係スキーマを設計せよ。

模範解答

成果物:(成果物ID、成果物名、作成工程ID、作成担当チームID) 修正成果物:(バグID、対応連番、成果物ID)

解説

解答の論理構成

  1. 成果物を表すエンティティの必要性
    • 【問題文】(5) で「成果物は、成果物IDで一意に識別される」とある。したがって、成果物IDが主キーとなる基本表「成果物」を設ける。
    • 同じ段落に「成果物名」「成果物の作成工程、作成担当チーム」が列挙されているため、属性として追加。
    • 「作成工程」は表4「工程」、「作成担当チーム」は“チーム”と参照関係を持つため、それぞれ外部キー (FK) を設定。
  2. バグ修正と成果物の多対多関係
    • 【問題文】「バグの修正担当に割り当てられたメンバは…一つ又は複数の成果物の修正を行う」とあり、1回の修正対応が複数成果物に影響します。
    • 逆に、同一成果物が複数のバグ修正に関与する可能性もあるため、多対多 (n:m) 関係を解消する中間表が必須。
    • 修正作業は“対応”で管理され、図2に「対応(バグID, 対応連番、…)」が既に存在する。主キーは (バグID、対応連番)。
    • よって、中間表「修正成果物」を作成し、主キーを (バグID、対応連番、成果物ID) として三つを全て外部キーにする。
  3. 主キー・外部キーの整理
    • 成果物
    • PK:成果物ID
    • FK1:作成工程ID → 工程.工程ID
    • FK2:作成担当チームID → チーム.チームID
      • 修正成果物
    • PK:バグID、対応連番、成果物ID
    • FK1:(バグID, 対応連番) → 対応.(バグID, 対応連番)
    • FK2:成果物ID → 成果物.成果物ID

誤りやすいポイント

  • 成果物の属性を“対応”や“バグ”に直接追加してしまい、第3正規形を崩す。
  • 「修正成果物」の主キーに 対応連番 を含め忘れ、1バグ1成果物しか登録できない設計にしてしまう。
  • 「作成工程ID」をNULL可と考えてしまうが、【問題文】に「作成工程」が必ず定められるとあるため非NULLとする。

FAQ

Q: 「修正成果物」に修正日時や修正担当者を持たせる必要はありませんか?
A: 修正作業の時系列情報や担当者は既に“対応”で保持されます。【問題文】「開始日時」「終了日時」「対応区分ごとにメンバを1人割り当て」より、冗長になるため追加不要です。
Q: “成果物” と “対応” を直接結合する設計でも良いのでは?
A: “成果物” と “対応” は多対多関係です。正規化の原則では、直接結合できないため中間表「修正成果物」で解消します。

関連キーワード: 多対多、主キー、外部キー、正規化、トレーサビリティ

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

この設問をAIに質問する

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

設問3:表3〜7及び 〔バグの集計及び分析〕 について、(1)〜(3)に答えよ。

問題文を見る
(1)表7中の項番 ②、③の検索を行うためには、どのような関係代数演算を行えばよいか。 表7中の項番 ①の例に倣って、(e)〜(j)に入れる適切な字句を答えよ。  なお、関係代数演算の表記法は、表6に従うこと。(i, jは順不同)

模範解答

e:バグ[発見工程ID = 発見すべき工程ID] f:バグ g:バグ種別ID h:バグ種別 i:修正有無 j:‘あり’

解説

解答の論理構成

  1. 項番②の条件確認
    【問題文・表7】
    “バグが発見された工程と、そのバグを本来発見すべきと考えられる工程が同一のバグ”
    → 同一関係 “バグ” に含まれる “発見工程ID”、“発見すべき工程ID” を比較。
    → 表6「選択」の書式:R〔X = Y〕
    したがって
    e:バグ〔発見工程ID = 発見すべき工程ID〕
  2. 射影部は例①から踏襲
    ・選択演算の直後に 〔バグID〕 を付けるので、演算対象となる関係名は「バグ」。
    f:バグ
  3. 項番③の条件確認
    【問題文】
    “品質分析の対象とするバグは、成果物の修正が必要なバグ種別が設定されたバグである。”
    ・“成果物の修正が必要” ⇒ 表2 “修正有無” が “あり”
    ・“バグ種別が設定されたバグ” ⇒ “バグ種別ID” により “バグ” と “バグ種別” を結合する必要がある。
  4. 関係代数演算の組み立て
    (1) 結合条件
    表6「結合」:R〔RA = SA〕S
    RA:バグ種別ID(バグ側)
    SA:バグ種別ID(バグ種別側)
    よって
    g:バグ種別ID
    (2) 結合する相手の関係
    h:バグ種別
    (3) 選択条件
    “修正有無 = ‘あり’”
    i:修正有無
    j:あり
  5. 全体式(括弧配置の説明)
    ① f(バグ)とh(バグ種別)をg(バグ種別ID)で結合
    ② その結果に対しi = j(修正有無 = ‘あり’)で選択
    ③ 射影で 〔バグID〕 を取り出す
    表7が示す多重括弧はこの順序を表している。

誤りやすいポイント

  • “同一のバグ” を別関係との結合と誤読し、不要な 工程 との結合を書いてしまう。
  • “修正有無” を “なし” と逆に書くミス。設問は “修正が必要” と明示している。
  • 選択と結合の括弧位置を省略し、演算の優先順位で減点される。

FAQ

Q: バグ種別IDの結合条件は左右どちらが先でも良いですか?
A: はい。表6の書式はR〔RA = SA〕Sですが、SA = RAと左右を入れ替えても等価です。
Q: 選択演算で文字列定数を比較する場合、シングルクォーテーションは必須ですか?
A: 表7の例①が '2013-07-19' と示しているので、文字列リテラルはクォーテーションで囲むのが慣例です。数値の場合は不要でもかまいません。
Q: “修正有無” の取り扱いを数値化(0/1)していても理屈は同じ?
A: 同じです。関係代数では定数の比較に過ぎないため、修正有無 = 1のようにデータ型が異なっても演算手順は変わりません。

関連キーワード: 関係代数、射影、選択、結合、属性比較

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

この設問をAIに質問する

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

設問3:表3〜7及び 〔バグの集計及び分析〕 について、(1)〜(3)に答えよ。

問題文を見る
(2)表7中の項番④の関係代数演算式は、どのようなバグを検索するために行うものか。kに入れる適切な字句を、工程名を含めて20字以内で、(l)に入れる適切な字句を15字以内で、それぞれ具体的に述べよ。

模範解答

k:・プログラム設計工程よりも前の工程  ・基本設計又は詳細設計工程 l:原因を作り込んだ

解説

解答の論理構成

  1. 表4よりK3の 工程名 は「プログラム設計」、順序番号 は3である。
  2. 式 (工程〔順序番号 < 順序番号〕 (工程〔工程ID = 'K3'〕)) は、自己結合を用いて 順序番号 が3より小さい工程を抽出している。よって「基本設計(K1)」と「詳細設計(K2)」が対象。
  3. バグ〔作り込み工程ID = 工程ID〕 との結合により、作り込み工程IDがこれら前工程を示すバグのみ残る。
  4. したがってkは「プログラム設計工程よりも前の工程・基本設計又は詳細設計工程」と説明できる。
  5. 作り込み工程IDは表2で「バグの原因を作り込んだと考えられる工程」を示すため、lは「原因を作り込んだ」となる。

誤りやすいポイント

  • 順序番号 < 順序番号 を単なる誤記と勘違いし、比較元が同一タプルだと解釈してしまう。
  • 作り込み工程IDを「修正工程」と誤読し、バグ修正時点の工程と混同する。
  • 「前工程」と聞いて「テスト工程より前」など別の基準を想像してしまう。

FAQ

Q: 自己結合かどうかはどこで判断できますか?
A: 関係代数式で同じ関係名が重ねて書かれ、別名が付いていない場合でも比較する属性が同名であれば自己結合を示します。今回の 工程〔順序番号 < 順序番号〕 が典型です。
Q: 作り込み工程IDと 発見工程IDの違いは?
A: 発見工程IDは実際にバグが見つかった工程、作り込み工程IDは「バグの原因を作り込んだと考えられる工程」です。前者は結果、後者は原因を特定する分析情報です。
Q: 「基本設計」と「詳細設計」は必ず対象になりますか?
A: 表4で 順序番号 が1と2の工程名がそれぞれ「基本設計」「詳細設計」なので、K3より小さい順序番号を条件にすると常にこの2工程が対象になります。

関連キーワード: 関係代数、自己結合、射影、選択、主キー

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

この設問をAIに質問する

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

設問3:表3〜7及び 〔バグの集計及び分析〕 について、(1)〜(3)に答えよ。

問題文を見る
(3)表3〜5の具体例について 表7中の項番 ②〜④の検索を行った場合の、(ア)〜(ウ)に入れる検索結果を表7中の項番 ①の例に倣って答えよ。

模範解答

ア:B1, B4 イ:B1, B4, B5 ウ:B1, B5

解説

解答の論理構成

  1. 項番②(ア)
    • 検索内容:「バグが発見された工程」と「発見すべき工程」が同一。
    • 判断基準:バグのタプルで「発見工程ID = 発見すべき工程ID」。
    • 【表3】より
      • B1:K5=K5 → 該当
      • B4:K6=K6 → 該当
      • B2, B3, B5はNULLもしくは不一致 → 非該当
    • 結果:B1, B4
  2. 項番③(イ)
    • 検索内容:「成果物の修正が必要なバグ種別」が設定されたバグ。
    • 判断基準:
      • 【問題文】(4)「成果物の修正が必要なバグ種別が設定されたバグ」
      • 【表5】で「修正有無」が「あり」のバグ種別IDはS1, S2, S4, S6。
    • 【表3】より
      • B1:S2 → あり
      • B4:S4 → あり
      • B5:S1 → あり
      • B2:NULL、B3:S3(なし) → 除外
    • 結果:B1, B4, B5
  3. 項番④(ウ)
    • 関係代数式読解
      • 工程〔工程ID = 'K3'〕で得たタプルの「順序番号」は3。
      • そのサブクエリ外側の「工程〔順序番号 < 順序番号〕」は3より小さい工程 → 順序番号1, 2(K1, K2)。
      • バグ〔作り込み工程ID = 工程ID〕で「作り込み工程ID」がK1またはK2のバグを抽出。
    • 【表3】より
      • B1:作り込み工程ID = K2 → 該当
      • B5:作り込み工程ID = K1 → 該当
      • B2, B3(NULL)、B4(K3) → 非該当
    • 結果:B1, B5

誤りやすいポイント

  • NULL比較は常に偽になるため「K5 = NULL」は成立しないことを忘れがちです。
  • 「修正有無」は“バグ”ではなく“バグ種別”に属する属性であり、直接バグ表を見ても判断できません。
  • 順序番号の大小比較を読み違え、「≤」と誤解してK3を含めてしまうミスが頻発します。

FAQ

Q: NULLが含まれる列を等号比較に使うとどう扱われますか?
A: SQL同様、関係代数でもNULLと任意の値の比較結果は偽になるため、そのタプルは選択条件を満たしません。
Q: 「修正有無」をバグ表にコピーしておけば検索は簡単になりますか?
A: 冗長性が高まり更新不整合のリスクがあるため、正規化の観点からはバグ種別表で保持し、検索時に結合・選択する設計が望ましいです。
Q: 順序番号の比較で基準値を動的に取りたい場合、関係代数ではどう書きますか?
A: 本問のように「工程〔工程ID = 'K3'〕」で得たサブリレーションから比較対象の属性値を取得し、その結果を外側の選択で用います。

関連キーワード: 関係代数、関数従属性、正規化、NULL処理、結合条件

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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