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

ITパスポート 2017年 春期 69


問題文

ある会社の社員の情報処理技術者試験の受験状況の一部を次に示す。この表を関係データベースで管理するために、二つの表に分割する方法として、適切なものはどれか。ここで、この会社には同姓同名の社員がいるものとする。
ITパスポート 2017年 春期  問69の問題画像ITパスポート 2017年 春期  問69の選択肢の画像

選択肢

(正解)

🔒 解説は解答すると表示されます

ある会社の社員の試験記録の分割方法【ITパスポート 解説】

正解の理由

表の内容を見ると、「社員に関する情報(社員ID、社員名、生年月日)」は社員ごとに一度だけ持てばよい情報で、「試験ごとの記録(試験種別、試験日、合否)」は社員ごとに何回も繰り返す情報です。関係データベース(relational database:表でデータを管理する仕組み)では、こうした「繰り返すデータ」と「社員固有のデータ」を別の表に分けて管理するのが基本です(正規化:normalization)。
選択肢の中で、社員情報を「社員ID、社員名、生年月日」でまとめ、試験結果を「社員ID、試験種別、試験日、合否」でまとめる構成になっているのは です。
理由は次の通りです。
  • 「社員ID」は主キー(primary key:一意にレコードを識別する項目)として使えるため、社員を確実に識別できます。名前は同姓同名がいるためキーにできません。
  • 社員情報を一箇所にまとめれば、名前変更などの更新を一か所で済ませられ、冗長性(同じデータが何度も保存されること)や更新時の矛盾を防げます。
  • 試験テーブルに社員IDを外部キー(foreign key:別の表の主キーを参照する項目)として持たせれば、社員と試験を結び付けられ、試験日などの「イベント情報」を複数保持できます。
以上から、正しい分割は です。

解法ステップ

  1. 表を見て「繰り返し出てくるデータ」と「社員単位で1つだけのデータ」を区別する。
    • 繰り返す:試験種別、試験日、合否(社員ごとに複数行ある)。
    • 固定:社員ID、社員名、生年月日(同一社員で複数行に繰り返し出ているが内容は同じ)。
  2. 各グループを別の「実体(entity)」として扱う。ここでは「社員(Employee)」と「試験結果(ExamResult)」。
  3. 社員を一意に識別するキーを決める。今回の表では「社員ID」が適切(先頭ゼロを含むので文字列型で扱う)。名前は重複する可能性があるためキーにしない。
  4. 試験結果テーブルは社員IDを外部キーとして持ち、試験日や合否を保持する。複合主キー(社員ID+試験日+試験種別)などで重複を防ぐことも考える。
  5. 選択肢を見て、上の要件を満たす組合せ(社員情報がまとまっている、試験情報が試験ごとに保持される)を選ぶ。

選択肢別の誤答解説

  • ア(正解)
    • 左側に「社員ID・社員名・生年月日」、右側に「社員ID・試験種別・試験日・合否」。
    • 社員情報は一箇所、試験情報は試験ごとに別表へ。社員IDで確実に関連付けでき、冗長性や更新の不一致を防げる。
  • イ(誤り)
    • 右側のキーが「社員名」で表を結び付ける構成になっています(右表:社員名、試験種別、試験日、合否)。
    • 同姓同名の社員が存在する条件では、社員名をキーにするとどの社員の記録か判別できないため不適切。社員IDを使う必要がある。
  • ウ(誤り)
    • 左表に「試験日」が入っており、右表に試験日がない構成になっています。
    • 試験日が社員表側にあると、同じ社員が複数回受けた試験の日付をどう表現するか不明瞭で、情報の欠落や冗長化、または組合せで試験日を復元できない問題が起きる。試験に関する属性はすべて試験側に置くべきです。
  • エ(誤り)
    • 左表に「社員名」がなく、社員の属性が左と右に分断されています(左:社員ID・生年月日・試験日、右:社員ID・社員名・試験種別・合否)。
    • 社員に関するデータが複数の表に散らばると、名前変更時に複数箇所を更新する必要が出たり、同じ社員の情報が複製されるなどの更新異常や冗長性が発生します。社員固有の情報は一箇所にまとめるべきです。

よくある誤解

  • 「社員名で結び付ければ分かるからOK」
    • 名前は見た目で一意に見えても、同姓同名が存在するためキーに使うのは危険です。必ず一意な識別子(社員IDなど)を使いましょう。
  • 「同じデータが並んでいるのは問題ない」
    • 同じ社員名や生年月日が試験ごとに繰り返されると、更新時に全行を修正する必要があり、ミスや不整合の原因になります(更新異常)。
  • 「数字の先頭ゼロは数値型でよい」
    • 先頭ゼロ(0001など)を保持したい場合は文字列型で保存します。数値型だと先頭ゼロが消えます。

補足コラム

  • 社員IDの扱い
    • 表示上「0001」のように先頭ゼロを保存したい場合は、データベースでは文字列(CHAR/VARCHAR)として扱います。見た目と内部値が変わらないように注意してください。
  • 試験種別をさらに整理する場合
    • 試験種別(ITパスポート、基本情報など)自体に説明やカテゴリ(試験コード、試験区分など)を持たせたいなら、試験種別を別の「試験マスタ」表に分けることもあります(マスタ表を参照する形)。
  • 例:テーブル定義イメージ(SQL)
-- 社員テーブル(社員を一意に管理)
CREATE TABLE Employee (
  employee_id CHAR(4) PRIMARY KEY, -- '0001' など
  name VARCHAR(50),
  birth_date DATE
);

-- 試験結果テーブル(試験は複数行持つ)
CREATE TABLE ExamResult (
  employee_id CHAR(4), -- Employee.employee_id を参照
  exam_type VARCHAR(50),
  exam_date DATE,
  result CHAR(1), -- '合' or '否'
  PRIMARY KEY (employee_id, exam_type, exam_date),
  FOREIGN KEY (employee_id) REFERENCES Employee(employee_id)
);

FAQ

Q1. 社員IDがないデータしかないときはどうする?
A1. 社員を一意に識別できるキーが無い場合は、DB側で代理キー(サロゲートキー: 自動連番など)を付けて一意化します。ただし元データに社員を特定する情報(名前+生年月日など)を組合せて一意にできるか検討します。
Q2. 「試験種別」も別表に分けたほうがいいですか?
A2. 試験種別に説明やコード、配点など追加属性があるなら別表(マスタ)にすると保守性が上がります。今回の問題では、試験ごとの結果を管理する形で十分です。
Q3. 社員名を表示したいときはどうやって出す?
A3. 社員名は社員テーブルにあるので、試験テーブルと社員テーブルを社員IDで結合(JOIN)すれば表示できます。例:社員IDで紐付けて SELECT で必要な列を取り出す。

関連キーワード: 関係データベース、正規化、主キー、外部キー、冗長性、更新異常、社員ID、試験結果、マスタ設計
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

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

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