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

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


データベースの設計に関する次の記述を読んで、設問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年 午後1 問1 図1)
データベーススペシャリスト試験(平成29年 午後1 問1 図2)
〔データモデルの設計〕 S君は、概念データモデル (図3) 及び関係スキーマ (図4) の設計を行った。
図4の関係スキーマの主な属性とその意味・制約を、表1に示す。
〔T部長の指摘事項〕  S君の上司であるT部長は、S君が設計した成果物を確認し、次の事項を指摘した。
 指摘事項①:ロールを管理するデータ構造が設計されていないので、ロールを用いて承認者を指定することができない。  指摘事項②:承認処理を行う際に、不具合が発生するおそれがある。

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

問題文を見る
(1)関係 “電子会議投稿” の候補キーを全て答えよ。 また、部分関数従属性、推移的関数従属性の有無を、“あり” 又は “なし” で答えよ。 “あり” の場合は、次の表記法に従って、その関数従属性の具体例を一つ示せ。 データベーススペシャリスト試験(平成29年 午後1 問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正規形、推移従属、部分従属

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

この設問をAIに質問する

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

設問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正規形へ分解
    分野(分野番号、分野名) 電子会議(電子会議番号、議題、分野番号、表示順、作成者ユーザID) 投稿(電子会議番号、投稿番号、投稿本文、投稿者ユーザID)
    • 下線:主キー
    • 点線下線:外部キー
  6. 以上により、すべての非キー属性が主キーに対して非推移的かつ完全関数従属となり、第3正規形が達成される。

誤りやすいポイント

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

FAQ

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

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

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

この設問をAIに質問する

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

設問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図、正規化、関係スキーマ

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

この設問をAIに質問する

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

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

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

模範解答

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

解説

解答の導き方

  1. 記号の読み方を決める
    図3の線端にある記号は最小カーディナリティ(対応関係にゼロを含むか否か)を表していると読みます。ここでは以下の読み方で統一します。
    • 黒丸 ● :対応関係にゼロを含まない(必須、最小値は1)
    • 白抜き丸 ○ :対応関係にゼロを含む(任意、最小値は0)
      この読み方に従って、図3の各線について「どちらのエンティティ側に●/○が付いているか」をそのまま写していきます。
  2. 図3の線を一つずつ読む手順(実際の適用例)
    • 図3に表示された全エンティティを確認します(問題文の図3説明で9個のエンティティが列挙されています)。「なお、図3に表示されていないエンティティタイプは考慮しなくてよい」とあるので、図3に描かれている線だけを扱います。
    • 各線について、線の両端(または線端と中間)にある「黒丸/白抜き丸」の位置を正確に読み取ります。図3の説明には例えば次のような記述があります。
      • 「線端に「ユーザ」側が黒丸●、中間側(スケジュール予約先側)が白抜き丸◯」
      • 「線端に「ユーザ」側が黒丸●、中間側(兼務グループ側)が白抜き丸◯」
      • 「線端に「メッセージ」側が黒丸●、中間側(メッセージ送信先側)が白抜き丸◯」
      • 「線端に「設備」側が黒丸●、中間側(設備予約先側)が白抜き丸◯」
      • 「右上方に斜め上向きの線が伸び、「兼務グループ」に接続 – 線端に「グループ」側が黒丸●、中間側(兼務グループ側)が白抜き丸◯」
    • それぞれの記述を上の記号読み方に当てはめ、対応関係の「エンティティA側:●/○、エンティティB側:●/○」を決定します。
  3. 図3から読み取れるリレーションシップ(結論)
    図3の線の記述に従って得られる関係は次の5本です(左側→右側の順で、各側のゼロ含有を示します)。各行は「関係:左側 (ゼロ含むか) → 右側 (ゼロ含むか)」という形式です。
    • ユーザ — スケジュール予約先:ユーザ側 ●(ゼロを含まない) → スケジュール予約先側 ○(ゼロを含む)
      • 根拠(図3の記述):「線端に「ユーザ」側が黒丸●、中間側(スケジュール予約先側)が白抜き丸◯」
    • ユーザ — 兼務グループ:ユーザ側 ●(ゼロを含まない) → 兼務グループ側 ○(ゼロを含む)
      • 根拠(図3の記述):「線端に「ユーザ」側が黒丸●、中間側(兼務グループ側)が白抜き丸◯」
    • グループ — 兼務グループ:グループ側 ●(ゼロを含まない) → 兼務グループ側 ○(ゼロを含む)
      • 根拠(図3の記述):「右上方に斜め上向きの線が伸び、『兼務グループ』に接続 – 線端に『グループ』側が黒丸●、中間側(兼務グループ側)が白抜き丸◯」
    • 設備 — 設備予約先:設備側 ●(ゼロを含まない) → 設備予約先側 ○(ゼロを含む)
      • 根拠(図3の記述):「線端に『設備』側が黒丸●、中間側(設備予約先側)が白抜き丸◯」
    • メッセージ — メッセージ送信先:メッセージ側 ●(ゼロを含まない) → メッセージ送信先側 ○(ゼロを含む)
      • 根拠(図3の記述):「線端に『メッセージ』側が黒丸●、中間側(メッセージ送信先側)が白抜き丸◯」
    注意:上は「図3に描かれている線とその記号」をそのまま読み取った結果です。図4(関係スキーマ)や問題文中の業務ルールと照合すると、実務的に期待される最小カーディナリティ(例えば「ユーザが主務グループに必ず所属する」など)と図3の表記が一致しない箇所があることがあるため、後続の設問では図3・図4・本文を合わせて矛盾箇所を見つける必要があります。

誤りやすいポイント

  • 記号の「どちら側に付いているか」を誤って逆に読む
    → 線のどの位置に黒丸/白丸があるか(エンティティ側か中間か)を必ず確認すること。端の記号はその直近のエンティティの参加要件を示す。
  • 黒丸/白抜き丸の意味を取り違える
    → 本問では「黒丸 ● = ゼロを含まない(必須)」「白丸 ○ = ゼロを含む(任意)」で統一して読む。
  • 結合エンティティ(兼務グループ、メッセージ送信先、設備予約先、スケジュール予約先など)を「単なる属性集合」と見なして関係を省略する
    → 図上で別エンティティ(長方形)になっている場合は独立した参加要件があるため、線と記号を個別に読む。
  • 図3の表示だけに頼って業務ルールと矛盾しても気付かない
    → 図4(関係スキーマ)や本文の業務要件と照合して、図に抜けや誤りがないかチェックする癖を付ける。

FAQ

Q: 黒丸●と白抜き丸○のどちらが「0を含む(任意)」ですか?
A: 黒丸●は「ゼロを含まない(必須)」、白抜き丸○は「ゼロを含む(任意)」と読みます。図3で黒丸がエンティティ側にあれば、そのエンティティは必ず対応関係を持つことを意味します。
Q: 図3に線が描かれていない関係(例えば「予約」と他)が図4では定義されている場合、図3でどう扱えばよいですか?
A: 小問の指示に従い「図3に表示されているエンティティタイプ間のリレーションシップを記入」します。ただし、設計の整合性確認や後続設問では図4や本文の業務要件と突合して「図3に欠落がある」ことを指摘する必要があります。
Q: 兼務グループやメッセージ送信先のような中間的なエンティティの扱いで注意すべき点は?
A: 中間エンティティの各側(例えば兼務グループのユーザ側/グループ側)は独立に「ゼロを含むか」を持ちます。図上の各線の記号を個別に読み、どちらの側が必須か任意かを正確に示してください。

関連キーワード: 最小カーディナリティ、結合エンティティ(連接テーブル)、外部キー、多対多、NULL許容性

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

この設問をAIに質問する

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

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

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

模範解答

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

解説

解答の導き方

(1) 指摘事項①への対応(何を追加すべきか、なぜか)
  1. 根拠の確認
     問題文に「ロールは、ロールIDで一意に識別し、ロール名をもつ。」とあり、また「ユーザには、必要に応じて一つ又は複数のロールを付与でき、一つのロールを複数のユーザに付与することもできる。」とあります。これらからロールは独立に管理する必要があり、ユーザとロールの関係は多対多であることが分かります。多対多を表現するためにロールテーブルとユーザとロールを結ぶ橋渡しテーブルが必要です。
  2. 追加すべき関係(スキーマの決定)
     上の結果から最小限で必要な関係は次の二つです。主キー・外部キーは次の通りに決めます。
     - ロール:ロールIDを主キーとする。属性はロールID(主キー)、ロール名。
      理由:問題文にある「ロールIDで一意に識別」に対応するためです。
     - ロール付与先:ユーザとロールの割当を保持する橋渡しテーブル。主キーは (ロールID, ユーザID)。外部キーはロールID→ロール(ロールID)、ユーザID→ユーザ(ユーザID)。
      理由:ユーザとロールは多対多なので複合主キーで重複を防ぎ、参照整合性を保つために外部キーを張ります。
  3. 決裁ルート側の属性追加の必要性と外部キーの向き
     問題文に「ステップには、 承認可能なユーザ、 グループ又はロールを指定する。 ユーザ、グループ又はロールのいずれで指定されているかは、承認者区分で識別する。」とあります。既存の決裁ルートには承認ユーザID・承認グループIDがあるため、ロール指定を記録するために決裁ルートにロール参照用の属性を追加します。追加する属性名は承認ロールIDとし、これをロール(ロールID) を参照する外部キーとして定義します(向きは 決裁ルート.承認ロールID → ロール.ロールID)。
  4. NULL取扱いと排他条件の明示(重要)
     決裁ルートの同じ行で「承認ユーザID」「承認グループID」「承認ロールID」が混在すると曖昧になります。したがって承認者区分の値に応じて使用する属性を限定するチェック制約を設けます。例示すると次のような論理になります(実装はDBのCHECK句やトリガで実現)。
     - 承認者区分 = 'ユーザ' のとき:承認ユーザIDは NOT NULL、承認グループIDと承認ロールIDはNULL。
     - 承認者区分 = 'グループ' のとき:承認グループIDは NOT NULL、他はNULL。
     - 承認者区分 = 'ロール' のとき:承認ロールIDは NOT NULL、他はNULL。
     これによりどの列が有効かが明確になり、外部キー参照の意味も一意に保たれます。
  5. 承認実行時の整合性チェック(補足)
     承認処理(承認テーブルへの登録)では、実際に承認したユーザ(承認.承認者ユーザID)が、決裁ルートで指定されたグループもしくはロールに属することを確認する必要があります。これは単純な外部キーでは表現しにくいため、トリガやストアドプロシージャ、アプリケーション側でのチェックを実装して参照整合性を保証します。
最終的な追加・変更(答え)
  • 関係スキーマ(追加)
    • ロール(ロールID: 主キー、ロール名)
    • ロール付与先(ロールID, ユーザID) 主キー:(ロールID, ユーザID)、外部キー:ロールID→ロール(ロールID)、ユーザID→ユーザ(ユーザID)
  • 関係名(属性追加)
    • 決裁ルート に 属性 承認ロールID を追加(外部キー:決裁ルート.承認ロールID → ロール.ロールID。承認者区分に応じたNULL取扱いをCHECKで保証)
以上が、指摘事項①に対応するための関係スキーマの追加と属性の追加です。

誤りやすいポイント

  • 「承認ロールID」の意味をあいまいにする
    • 誤り:承認ロールIDを決裁ルート側の単なる識別子と考え、ロール(ロールID) への外部キーを定義しない。
    • 正解:決裁ルート.承認ロールIDはロール(ロールID) を参照する外部キーであることを明確にする。
  • ロールとユーザの関係を1対多で設計してしまう
    • 誤り:ユーザテーブルにロールID列を追加して1ユーザ1ロールにしてしまう。
    • 正解:問題文にある通り多対多なのでロール付与先(橋渡しテーブル)が必要。主キーは (ロールID, ユーザID)。
  • 承認者区分に応じたNULL/NOT NULLの扱いを書かない
    • 結果:どの列が有効か不明瞭になり参照整合性が壊れる。CHECK制約で明確にする。
  • 承認時に実際に承認したユーザが指定されたロール・グループのメンバーかを検証しない
    • 結果:権限漏れ/不正承認が発生する。トリガやアプリ側チェックで必ず確認する。

FAQ

Q: ロール付与先の主キーはどうすればよいですか?
A: 主キーは複合主キー (ロールID, ユーザID) です。これで同じユーザに同じロールが重複して登録されるのを防げます。
Q: 決裁ルートの承認ロールIDがNULLのままの行があってもよいですか?
A: 承認者区分により許容が変わります。承認者区分がロール指定のときは承認ロールID を NOT NULL にし、逆にユーザ指定・グループ指定のときは NULL にするという CHECK 制約で運用するのが安全です。

関連キーワード: 外部キー制約、チェック制約、多対多関係、ロール、決裁ルート

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

この設問をAIに質問する

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

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

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

模範解答

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

解説

解答の導き方

  1. 問題文から事実を抽出します。図4に「承認」関係があり、属性に「承認連番」が定義されています。本文には「承認連番は申請ひな形番号ごと・申請連番ごとに1から始まり、承認処理を行うごとに1ずつ加算される番号」とあります。さらに承認処理について「承認処理を行うと、その都度処理内容がデータベースに新規登録される。」とあり、決裁の流れには「差戻し : 一つ前のステップに戻す。」が存在します。これらを合わせて考えます。
  2. 事実の意味付けをします。承認連番は「ある申請(申請ひな形番号+申請連番)」ごとに増える番号であり、承認処理ごとに新しいレコードを登録するため、承認履歴の各レコードを一意にする識別子として機能します。差戻しにより同じステップで再度承認処理が発生することがあり得ます。
  3. 不具合が起きる状況を導きます。もし「承認」関係の主キーが(申請ひな形番号、申請連番、ステップ番号)など承認連番を含まない構成になっていると、差戻し後に同じステップで再承認した際に既存の主キーと衝突して挿入できないか、前の承認記録を上書きしてしまいます。したがって不具合は「一度承認した申請が差戻しされ、再度承認処理を行うとき」に発生します。
  4. 修正方針を決めます。承認処理は「その都度新規登録」され、承認履歴を重複なく保持するために、承認連番を主キーに含めて各承認イベントを一意に識別する必要があります。また、外部キーは決裁ルート参照が複合キーである点や、承認者が実際に処理したユーザのユーザIDが記録される点を正確に表記します。
(最終的な短文状況と修正後の関係スキーマは下欄に示します。)

誤りやすいポイント

  • 承認連番を主キーに「だけ」する/逆にまったく入れないという誤解
    承認連番は「申請ひな形番号ごと・申請連番ごとに」付与されるので、単独では全体で一意にならない(他の申請と区別できない)。主キーは申請を識別する属性と組にする必要があります。
  • 決裁ルートへの参照を単一属性で表す誤り
    決裁ルートは(申請ひな形番号、ステップ番号)で特定されるため、外部キーも複合で参照する点を忘れると整合性が崩れます。
  • 第3正規形(3NF)の説明混同
    「非キー属性が特定の非キー属性に従属する」ような推移従属が存在しないことを示す必要があり、単に「承認連番に従属する」と書くだけでは不十分です。非キー属性は主キー全体に対して完全従属し、非キー→非キーの関数従属がないことを確認します。
  • 承認者の取り扱いの取り違え
    決裁ルートで承認者がグループやロールで指定されていても、承認履歴には「承認処理を行ったユーザのユーザID」を記録するという点(問題文の定義)を見落とすと参照先を誤ります。

FAQ

Q: 承認連番を主キーに含める理由は何ですか?
A: 「承認連番は申請ひな形番号ごと・申請連番ごとに1から始まり、承認処理を行うごとに1ずつ加算される番号」とあるため、同一申請に対する各承認イベントを一意に識別するために必要です。差戻しで同一ステップが再度処理される場合も新規行として記録する必要があります。
Q: ステップ番号も主キーに入れるべきですか?
A: ステップ番号は承認イベントの属性ですが、承認連番が申請内で連続する番号になっているため、主キーは最小性を考え(申請ひな形番号、申請連番、承認連番)とするのが適切です。ステップ番号を主キーに含めると冗長になります。
Q: 外部キーの表記で注意すべき点は?
A: 決裁ルート参照は複合参照である点を明記します。具体的には (申請ひな形番号, ステップ番号) → 決裁ルート(申請ひな形番号, ステップ番号) とする必要があります。また 承認者ユーザIDは ユーザ(ユーザID) を参照します。

状況:一度承認を行った申請が差戻しされた後、再度承認処理を行ったとき
修正後の関係スキーマ:
承認(申請ひな形番号、申請連番、ステップ番号、承認連番、承認処理結果、コメント、承認者ユーザID、承認日時)
主キー:(申請ひな形番号、申請連番、承認連番)
外部キー:
  • (申請ひな形番号、申請連番) → 申請(申請ひな形番号、申請連番)
  • (申請ひな形番号、ステップ番号) → 決裁ルート(申請ひな形番号、ステップ番号)
  • 承認者ユーザID → ユーザ(ユーザID)
第3正規形の適合性の説明:
主キー(申請ひな形番号、申請連番、承認連番)は各承認イベントを一意に識別します。承認処理結果、コメント、承認者ユーザID、承認日時、ステップ番号はすべてその承認イベントの属性であり、主キー全体に対して完全関数従属します。承認者ユーザIDはユーザテーブルを参照する外部キーであり、承認テーブル内でさらに別の非キー属性を決定するような推移従属は存在しないため、第3正規形を満たします。
関連キーワード: 正規化、第三正規形、第3正規形、複合主キー、外部キー、推移従属

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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