戦国IT

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

データベーススペシャリスト試験 2017年 午後101


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

 D社は, グループウェア (以下, GW という)を主力商品とするソフトウェア開発会社である。 D社では現在、次期のGW を開発しており, S君がデータベースの設計を行っている。  
〔GW の主な機能〕
1.利用者管理機能  GWでは,ユーザ, グループなどを用いて GW の利用者の情報を管理する。  (1) ユーザとは, GW 上の利用者である。 GW の利用者は, GW上でユーザ登録を行い,ユーザID及びパスワードを使用して GW にログインし、 GW の各機能を利用する。  (2) グループとは, GW 上の組織である。 例えば,営業部, 経理部などである。グループには,上位のグループを一つ定めることができる。  (3) ロールとは, GW 上の役割である。 例えば, 経理担当者, 経理責任者などである。ロールは,ロール ID で一意に識別し,ロール名をもつ。  (4) ユーザは,一つのグループに必ず所属し,これを主務グループと呼ぶ。 ユーザは,一つ又は複数のグループに兼務として所属することができる。また, ユーザには,必要に応じて一つ又は複数のロールを付与でき,一つのロールを複数のユーザに付与することもできる。    なお,上位のグループの中には,ユーザが一人も所属しないグループが存在する。
2.予約機能  GW では,スケジュール予約及び設備予約を行うことができる。 例えば,打合せを行う場合に,出席者のスケジュール予約と会議室の設備予約を行うことができる。
 (1) スケジュール予約とは,ユーザ自身又は他のユーザのスケジュールを予約する機能である。スケジュールを予約されたユーザは, そのスケジュールに参加するか否かを回答することができる。  (2) 設備予約とは,会議室,プロジェクタなど, あらかじめ GWに登録された設備を予約する機能である。 設備には,必要に応じて,当該設備の管理を行うグループを一つ定めることができる。  (3) スケジュール予約及び設備予約は, それぞれを同時に予約することも,いずれか一方を予約することもできる。
3.コミュニケーション機能  GWには, ユーザ間で直接メッセージをやり取りするメッセージ機能, 及び特定のテーマに関してユーザ同士で議論できる電子会議機能が備えられている。
 (1) ユーザは,1人又は複数のユーザにメッセージを送信することができる。 送信先のユーザがメッセージを開封すると, 開封日時が記録される。  (2) 電子会議とは, GW 上の会議の単位である。 電子会議には,例えば“プロジェクタの利用について” などの議題が定められる。 ユーザは,新たな電子会議を作成することができる。  (3) 投稿とは, ユーザが電子会議上に文章を書き込むことである。  (4) 分野とは, 電子会議を分類する単位である。 例えば, 総務, 営業などである。電子会議は,いずれか一つの分野に属し, 分野ごとに定められた表示順に従って一覧表示される。
4.ワークフロー機能  GWには, 簡易なワークフロー機能があり、申請及び承認の流れを定義し, 定型業務として利用できる。  (1) 申請ひな形とは,各種申請のテンプレートである。 例えば,経費申請,交通費申請などの種類がある。  (2) 決裁ルートとは, 申請ひな形ごとに定められた, 申請を処理する承認経路であり,一つ以上のステップによって構成される。  (3) ステップには, 承認可能なユーザ, グループ又はロールを指定する。 ユーザ,グループ又はロールのいずれで指定されているかは、承認者区分で識別する。  (4) ユーザは,申請ひな形を指定して各種申請を行うことができる。 申請を行うと、決裁ルートの最初のステップに進む。  (5) 決裁ルートの各ステップに指定されている承認者は,自身が処理すべき申請に対して,承認処理として次のいずれかの処理を行う。   ・承認 :最後のステップでは,申請状態を決裁済にする。 それ以外のステップでは,次のステップに進める。   ・差戻し : 一つ前のステップに戻す。 ただし, 最初のステップでは,差戻しができない。   ・否認 :申請状態を否認済にする。  (6) 申請を行ったユーザは, 申請中の申請を取り消すことができる。 取消しを行うと, 申請状態は取消済となる。  (7) 承認処理を行うと,その都度処理内容がデータベースに新規登録される。    なお,ステップの承認者をグループ又はロールで指定している場合,そのステップで複数のユーザが同時に承認処理を行うことはできない。  
ワークフロー機能の決裁ルートの例を図1に, 承認画面の例を図2に示す。
データベーススペシャリスト試験(平成29年 午後I 問1 図1)
データベーススペシャリスト試験(平成29年 午後I 問1 図2)
〔データモデルの設計〕 S君は, 概念データモデル (図3) 及び関係スキーマ (図4) の設計を行った。
データベーススペシャリスト試験(平成29年 午後I 問1 図3)
データベーススペシャリスト試験(平成29年 午後I 問1 図4)
図4の関係スキーマの主な属性とその意味 制約を、 表1に示す。
データベーススペシャリスト試験(平成29年 午後I 問1 表1)
〔T部長の指摘事項〕  S君の上司であるT部長は, S君が設計した成果物を確認し、次の事項を指摘した。
 指摘事項①:ロールを管理するデータ構造が設計されていないので,ロールを用いて承認者を指定することができない。  指摘事項②:承認処理を行う際に, 不具合が発生するおそれがある。

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

設問1関係“電子会議投稿”について,(1),(2)に答えよ。

(1)関係 “電子会議投稿” の候補キーを全て答えよ。 また, 部分関数従属性,推移的関数従属性の有無を, “あり” 又は “なし” で答えよ。 “あり” の場合は,次の表記法に従って, その関数従属性の具体例を一つ示せ。 データベーススペシャリスト試験(平成29年 午後I 問1 表1)  なお, 候補キー及び表記法に示されている属性1 属性 3, 属性 4 が複数の属性から構成される場合は,{}でくくること。

模範解答

候補キー:{ 電子会議番号, 投稿番号}, { 分野番号, 表示順, 投稿番号 } 部分関数従属性の有無:あり 推移的関数従属性の有無:あり 部分関数従属性:電子会議番号 → 議題 推移的関数従属性:電子会議番号 → 分野番号 → 分野名

解説

解答の論理構成

  1. 候補キーの導出
    • 表1で「電子会議番号」は電子会議を一意に識別する ⇒ 投稿を区別するには「投稿番号」と組み合わせれば良い。
      よって「{ 電子会議番号, 投稿番号 }」。
    • 同じく表1で「表示順」は「一つの分野内で表示順が重複することはない」。つまり分野内では「{ 分野番号, 表示順 }」が電子会議を一意に決める。そこに「投稿番号」を加えると投稿が一意になる ⇒ 「{ 分野番号, 表示順, 投稿番号 }」。
    • 以上 2 つが候補キー。
  2. 部分関数従属性の検出
    • 候補キーの 1 つ「{ 電子会議番号, 投稿番号 }」に注目。
      【問題文】「電子会議のタイトル」を示す属性は「議題」。電子会議レベルの情報であり、キーのうち「電子会議番号」だけで決まる。
      よって「電子会議番号 → 議題」が部分関数従属性。
  3. 推移的関数従属性の検出
    • 電子会議レベルで「電子会議番号 → 分野番号」が成り立つ(電子会議は 1 つの分野に属する)。
    • さらに分野レベルで「分野番号 → 分野名」が成り立つ(表1より「分野を一意に識別する番号」「分野の名称」)。
    • よって「電子会議番号 → 分野番号 → 分野名」が推移的関数従属性。
  4. 以上により、模範解答と一致する。

誤りやすいポイント

  • 「表示順」は電子会議レベルの属性であり、投稿を識別するキーと誤って単独で使ってしまう。
  • 「{ 分野番号, 表示順 }」が電子会議を一意とする根拠を「表示順が分野ごとに連番」などと誤記し、【問題文】の「重複しない」条件を引用しない。
  • 推移的従属性で「分野番号 → 分野名」を忘れ、「電子会議番号 → 分野名」を直接書いてしまう。

FAQ

Q: 「作成者ユーザID」や「投稿者ユーザID」はキー候補になりませんか?
A: どちらも複数の投稿で同じ値を取る可能性があり、一意性を保証しません。投稿の識別に必要なのは「電子会議番号」「投稿番号」または「分野番号」「表示順」「投稿番号」です。
Q: 「表示順の見直しによって値が変更されることがある」とあるが、キーに使って良いのか?
A: 値が変更されても、その時点で一意性が保たれていればキー条件を満たします。更新時には外部キー側も同時更新する運用・制約が必要ですが、設計上は候補キーとして扱えます。
Q: 部分従属性と推移従属性は同時に存在していて良い?
A: はい。候補キーが複数ある場合、一方の候補キーで部分従属が起き、同時に推移従属も発生することは珍しくありません。

関連キーワード: 関数従属性, 候補キー, 第3正規形, 推移従属, 部分従属

設問1関係“電子会議投稿”について,(1),(2)に答えよ。

(2)関係 “電子会議投稿” は,第1正規形, 第2正規形, 第3正規形のうち,どこまで正規化されているか答えよ。 また, 第3 正規形でない場合は,第3正規形に分解し, 主キー及び外部キーを明記した関係スキーマを示せ。

模範解答

正規形:第1正規形 関係スキーマ:分野(分野番号, 分野名)        電子会議(電子会議番号, 議題, 分野番号, 表示順, 作成者ユーザID)        投稿(電子会議番号, 投稿番号, 投稿本文, 投稿者ユーザID

解説

解答の論理構成

  1. 【表1】により関係 “電子会議投稿(電子会議番号, 議題, 分野番号, 分野名, 表示順, 作成者ユーザID, 投稿番号, 投稿本文, 投稿者ユーザID)” が定義されている。
  2. 主キー候補は “電子会議番号, 投稿番号”(投稿を一意識別)である。
  3. 関数従属性を整理すると
    • “分野番号 → 分野名”(同一分野で名称は一意)
    • “電子会議番号 → 議題, 分野番号, 表示順, 作成者ユーザID”(1 会議 1 レコード)
    • “電子会議番号, 投稿番号 → 投稿本文, 投稿者ユーザID”(投稿内容はこの複合キーで決定)
  4. よって
    • 部分関数従属(例:電子会議番号 → 議題)が存在 → 第2正規形を満たさない。
    • 推移的関数従属(例:分野番号 → 分野名)が存在 → 第3正規形も満たさない。
  5. 第3正規形へ分解
    分野(<u>分野番号</u>, 分野名)
    電子会議(<u>電子会議番号</u>, 議題, <span style="border-bottom: 1px dotted;">分野番号</span>, 表示順, <span style="border-bottom: 1px dotted;">作成者ユーザID</span>)
    投稿(<u>電子会議番号</u>, <u>投稿番号</u>, 投稿本文, <span style="border-bottom: 1px dotted;">投稿者ユーザID</span>)
    
    • 下線:主キー
    • 点線下線:外部キー
  6. 以上により、すべての非キー属性が主キーに対して非推移的かつ完全関数従属となり、第3正規形が達成される。

誤りやすいポイント

  • “表示順” を “分野番号” と直接結びつけてしまい、電子会議に属すると気付かない。
  • 主キーを “電子会議番号” だけと誤認し、第1正規形を見落とす。
  • 外部キー指定を忘れ、正規化後のリレーションが孤立する。

FAQ

Q: 「表示順」はどのテーブルに置くべきですか?
A: 【表1】で「電子会議を一覧表示する際の順序」と明記されており、同一電子会議単位で管理するので “電子会議” 関係に入れます。
Q: “投稿番号” を単独主キーにできませんか?
A: 【表1】に「電子会議番号との組合せで投稿を一意に識別」とあるため、複合キー “電子会議番号, 投稿番号” が必須です。

関連キーワード: 第3正規形, 関数従属, 部分関数従属, 外部キー, 正規化

設問2図3,4及び表1について,(1),(2)に答えよ。

(1)図 4 中の(a)〜(f)に入れる適切な属性名を答えよ。 また, 主キーを構成する属性の場合は実線の下線を, 外部キーを構成する属性の場合は破線の下線を付けること。(d, eは順不同)

模範解答

a:主務グループID b:管理グループID c:送信元ユーザID d:送信先ユーザID e:開封日時 f:参加可否回答

解説

解答の論理構成

  1. (a) ユーザ表の空欄
    • 要件引用:【問題文】「ユーザは,一つのグループに必ず所属し,これを主務グループと呼ぶ。」
    • 主キーではなく, グループ表の「グループID」を参照するため外部キー。
    • よって 主務グループID
  2. (b) 設備表の空欄
    • 要件引用:【問題文】「設備には,必要に応じて,当該設備の管理を行うグループを一つ定めることができる。」
    • グループを参照する外部キー。
    • よって 管理グループID
  3. (c) メッセージ表の空欄
    • 要件引用:【問題文】「ユーザは,1人又は複数のユーザにメッセージを送信することができる。」
    • 送信元ユーザを保持し, ユーザ表を参照する外部キー。
    • よって 送信元ユーザID
  4. (d)(e) メッセージ送信先表の空欄
    • 受信者識別と開封日時が必要
      ・受信者…【問題文】「送信先のユーザがメッセージを開封すると, 開封日時が記録される。」
      ・主キー構造…同一メッセージに対し複数受信者 ⇒ (メッセージID, 受信者ID)で一意
    • 従い (d) は主キー送信先ユーザID、(e) は開封日時。
  5. (f) スケジュール予約先表の空欄
    • 要件引用:【問題文】「スケジュールを予約されたユーザは, そのスケジュールに参加するか否かを回答することができる。」
    • 回答結果を保持する属性が必要 ⇒ 参加可否回答。主キーでも外部キーでもないため下線なし。

誤りやすいポイント

  • (a) を「所属グループID」と書く
    「主務」という語を落とすと兼務との区別が付かず不正確。
  • (d) の下線種別
    受信者IDを外部キーと判断し破線にすると主キー要件を満たせない。
  • (f) を NULL で済むと思い属性自体を作らない
    参加可否の回答結果は履歴ではなく最新値で良いので列が必要。

FAQ

Q: なぜメッセージ表に受信者を置かず分割するのですか?
A: 【問題文】で「1人又は複数のユーザにメッセージを送信」とされており、1件のメッセージに N 件の受信記録がひも付くため正規化上別表が適切です。
Q: 開封日時は主キーに含めなくていいのですか?
A: 開封日時は更新対象であり、同一受信者に対し 1 行で最新状態を保持すれば十分です。主キーに含めると二度目の開封時に別行が作られ冗長になります。
Q: スケジュール参加可否はどの型で実装するのが一般的ですか?
A: “参加”,“不参加”,“未回答”をコード化した ENUM や CHAR(1) が多く、履歴要件がなければ別表にする必要はありません。

関連キーワード: 主キー, 外部キー, ER図, 正規化, 関係スキーマ

設問2図3,4及び表1について,(1),(2)に答えよ。

(2)図3のエンティティタイプ間のリレーションシップを全て記入せよ。 また,リレーションシップには,エンティティタイプ間の対応関係にゼロを含むか否かの表記(“○” 又は “●”)も記入すること。  なお,図3に表示されていないエンティティタイプは考慮しなくてよい。

模範解答

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

解説

解答の論理構成

  1. 業務規約の抜き出し
    • 「ユーザは,一つのグループに必ず所属し」
    • 「ユーザは,一つ又は複数のグループに兼務として所属することができる」
    • 「スケジュール予約及び設備予約は,…いずれか一方を予約することもできる」
    • 「ユーザは,1人又は複数のユーザにメッセージを送信することができる」
      これらがカードィナリティ判定の根拠になる。
  2. 1対多か多対多かの判定
    • 主務グループ:ユーザ側が必須1,グループ側は0以上 → グループ●―○ユーザ
    • 兼務:ユーザとグループは多対多なので中間エンティティ「兼務グループ」を設置し,両端とも“●○”
    • 予約と2種の予約先:1件の予約に対して0以上の予約先が付く → 予約●●→○設備予約先/○スケジュール予約先
  3. “○/●”の付与
    “必須”=●,“任意”=○ と読み替える。例:
    • 「ユーザは,…必ず所属」だからユーザ―グループ間はユーザ側●,グループ側○ではなく逆になることに注意(グループ0件でもユーザが居ない場合がある)。
  4. 以上を全組み合わせに適用し,解答例の11本に帰着する。

誤りやすいポイント

  • 主務と兼務を一つのリレーションシップで済ませてしまい,多対多解消用エンティティを作らない。
  • “ユーザは必ず主務グループに属する”という文からグループ側も必須と誤解する。実際は「上位のグループの中には,ユーザが一人も所属しないグループが存在」し得る。
  • 「予約→設備予約先」「予約→スケジュール予約先」における“0件でも良い”という条件を見落とし“●”を付けてしまう。

FAQ

Q: “○/●”のどちらが必須か任意か覚えにくいです。
A: 本試験では“ゼロを含むか否か”の表記と明示されているので、ゼロを許す=任意=○、ゼロを許さない=必須=●と覚えておくと混乱しません。
Q: 兼務グループを中間テーブルにする根拠は?
A: 多対多関係「ユーザは複数グループに兼務し,グループは複数ユーザを受け入れる」を正規化すると中間エンティティが必要になります。【問題文】の「ユーザは,一つ又は複数のグループに兼務として所属することができる」が直接の裏付けです。
Q: “予約”と“ユーザ”の間に直接リレーションがある理由は?
A: 「予約者ユーザID」が“予約”に存在し,必ず値が入る(予約は必ず誰かが作成する)ためです。従って“予約○―●ユーザ”の1対多関係になります。

関連キーワード: ERモデル, カーディナリティ, 正規化, 多対多, 外部キー

設問3〔T部長の指摘事項〕 について,(1),(2)に答えよ。

(1)指摘事項①に対応するために、 新たな関係を二つ追加し、 既存の関係に属性を一つ追加することにした。 新たに追加する関係の主キー及び外部キーを明記した関係スキーマ, 属性を追加する関係名及び追加する属性名を答えよ。

模範解答

関係スキーマ:ロール(ロールID, ロール名)        ロール付与先(ロールID, ユーザID) 関係名:決裁ルート 属性名:承認ルートID

解説

解答の論理構成

  1. ロールを概念レベルで抽出
    • 原文「(3) ロールとは, GW 上の役割である。」より、独立したエンティティ。主キーは「ロールID」。名称属性として「ロール名」が必要。
  2. ユーザとロールは多対多
    • 原文「ユーザには,必要に応じて一つ又は複数のロールを付与でき,一つのロールを複数のユーザに付与することもできる。」
    • 多対多は中間表で分解→「ロール付与先(ロールID, ユーザID)」を新設。両方が外部キー&複合主キー。
  3. ワークフローとの接続
    • 「決裁ルート」の各行は “申請ひな形 × ステップ” ごとに承認主体を示す。「承認者区分」でロール指定が来たとき、どのロールを示す識別子が必要。
    • よって「決裁ルート」に「承認ルートID」を追加し、外部キーとして「ロールID」を参照させる(模範解答と同じ)。
  4. 主キー・外部キーの明示
    • ロール:主キーロールID
    • ロール付与先:主キーロールID, ユーザID(同時に両列が外部キー)。

誤りやすいポイント

  • 承認者を示す列を「承認ユーザID」や「承認グループID」に統合しようとしてしまう
    → ロールは別概念なので別列が必要です。
  • ロール付与先の主キーを単独列で作る
    → 多対多なので複合主キーにしないと、一人のユーザに同じロールが重複登録できます。
  • 「承認ルートID」を新規テーブルに置くと勘違い
    → 追加先は既存の「決裁ルート」です。

FAQ

Q: ロール付与先に「付与日時」などを入れなくてよいのですか?
A: 本問は“最低限の論理構造を示せ”が目的なので、履歴管理が求められていません。要件に入れば後から列追加で対応できます。
Q: 「承認ルートID」は主キーに含めるべきですか?
A: いいえ。主キーは既に「申請ひな形番号, ステップ番号」で決まっています。「承認ルートID」はロールを参照する外部キーで、主キーには含めません。
Q: 決裁ルートに「承認ユーザID」「承認グループID」があるのに、ロールだけ別列を用意する理由は?
A: 原文で “いずれで指定されているかは、承認者区分で識別する。” とあるため、区分ごとに該当列を使い分ける設計です。ロール指定時は新列「承認ルートID」が値を持ち、他2列はNULLになります。

関連キーワード: 主キー, 外部キー, 多対多, 正規化, エンティティ

設問3〔T部長の指摘事項〕 について,(1),(2)に答えよ。

(2)指摘事項②の不具合はどのようなときに発生するか。 その状況を、具体的に 40字以内で述べよ。 また, 不具合に対応するために、 関係を一つ修正することにした。 修正後の関係の主キー及び外部キーを明記した関係スキーマを答えよ。  なお, 修正後の関係スキーマは,第3正規形の条件を満たしていること。

模範解答

状況:一度承認を行った申請が差戻しされた後、再度承認処理を行ったとき 関係スキーマ:承認(申請ひな形番号, 申請連番, ステップ番号, 承認連番, 承認処理結果, コメント, 承認者ユーザID, 承認日時)

解説

解答の論理構成

  1. 承認履歴は差戻し後も “その都度新規登録”【問題文】により行が追加される。
  2. 現設計では主キー候補が “申請ひな形番号, 申請連番, ステップ番号” のみなので、差戻し後に同じ “ステップ番号” 行を挿入すると主キーが重複=不具合発生。
  3. 同一申請内で承認行を連番管理している属性 “承認連番”【表1】は重複しないため、これを主キーに含めれば各履歴が一意になる。
  4. 第3正規形の観点
    ・主キー以外の属性は “承認連番” に完全従属し、かつ推移従属も生じない。
  5. よって修正後の関係スキーマは次のとおり。
承認(<主キー> 申請ひな形番号, 申請連番, 承認連番,
     <外部キー> ステップ番号, 承認者ユーザID,
     承認処理結果, コメント, 承認日時)

誤りやすいポイント

  • “承認連番” を外部キーと誤解し、主キーに含め忘れる。
  • 第3正規形を意識せず “承認者ユーザID” を主キーに追加してしまう。
  • “差戻し” ではなく “否認” 時に重複すると勘違いする。
  • “承認連番” の採番単位(申請ひな形番号ごと・申請連番ごと)を読み飛ばす。

FAQ

Q: “承認連番” を主キーに含めると採番コストが増えませんか?
A: 採番は申請単位で連続値を付与するだけなので、性能影響はごく小さく、一意性確保のメリットが勝ります。
Q: “ステップ番号” を主キーから外すと検索性能が落ちませんか?
A: 主キーから外しても索引を個別に張れば性能は維持でき、正規化による更新異常防止の効果が得られます。
Q: 承認履歴を別テーブルに分割する方法との違いは?
A: 別テーブルにすると参照結合が増えます。本問は既存テーブルを最小変更で修正することが目的のため、主キー変更が最適です。

関連キーワード: 第3正規形, 主キー設計, 外部キー, ワークフロー, 差戻し
← 前の問題へ次の問題へ →

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