ITパスポート 2013年 春期 問55
問題文
関係データベースを使い“社員”表と“部署”表を作成して社員情報を管理する。
“社員”表と“部署”表に、必要に応じて設定する主キーと外部キーの適切な組合せはどれか。ここで、社員は必ず“部署”表に存在する部署に所属するものとし、社員データの追加や更新をするときには、参照制約を利用して整合性を確保するものとする。


選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
関係データベースの主キーと外部キーの設定【ITパスポート 解説】
正解の理由
今回の設問では、社員は必ず既存の部署に所属し、社員の追加・更新時に参照制約(referential integrity:外部キーによって参照先が存在することを保証するルール)で整合性を保つと明記されています。
まず用語をやさしく整理します。
まず用語をやさしく整理します。
- 主キー(primary key):その表の各行(レコード)を一意に識別する列のこと。例えば社員を区別するための「社員コード」が該当します。
- 外部キー(foreign key):他の表の主キーを参照する列のこと。参照先が存在するかをチェックして整合性を保ちます。
「社員は必ず部署表に存在する部署に所属する」という関係は「社員(多) — 部署(1)」の一対多です。この場合、多側(社員)に部署コードを持たせ、その列を外部キーにして部署表の部署コード(主キー)を参照します。
したがって、社員表の主キーは社員コード、部署表の主キーは部署コード、そして社員表の部署コードが外部キーである構成が正しいため、選択肢 イ が正解です。
したがって、社員表の主キーは社員コード、部署表の主キーは部署コード、そして社員表の部署コードが外部キーである構成が正しいため、選択肢 イ が正解です。
解法ステップ
- 表の意味を確認する:社員表は個々の社員を管理、部署表は部署情報を管理。
- 各表で「各行を一意に識別する値」を探す:社員→社員コード、部署→部署コード。これらが主キー。
- リレーション(関係)を確認する:社員は必ず部署に所属 → 「社員(多)→部署(1)」。
- 多側に参照(外部キー)を置く:社員表に部署コードを持たせ、部署表の部署コードを参照(外部キー)にする。
- 問題文の「参照制約を利用して整合性を確保」に合致する選択肢を選ぶ。
これらの手順を順に追えば、正しい組合せを見つけられます。
選択肢別の誤答解説
-
ア:主キーは正しい(社員コード・部署コード)が設定されていますが、外部キーが「なし」になっています。参照制約で整合性を保つ条件に反します。社員が存在しない部署コードを持ったまま登録される可能性があるため不適切です。
-
イ:主キーは社員コード・部署コードで、外部キーが社員表の部署コードになっています。社員は部署表の部署コードを参照しているため、参照制約で整合性を保てます。これが正しい配置です(正答)。
-
ウ:部署表の部署コードを主キーにしている点は良いですが、外部キーとして「社員表の社員コード」と「社員表の部署コード」を指定しています。社員コードを外部キーにする意味がありません。外部キーは参照先(部署表)の主キーを参照する列であるべきで、ここでは逆になっているため誤りです。
-
エ:社員表の主キーが「社員の部署コード」になっています。これは同じ部署に属する複数社員がいる場合に主キーの一意性を満たせません(主キーは各社員を一意に識別できる必要がある)。また外部キーの指定も不適切です。
よくある誤解
- 「両方の表に外部キーが必要」だと思い込む誤り。リレーションの方向を考え、参照される側(ここでは部署)に外部キーは不要で、参照する側(社員)に外部キーを置きます。
- 「外部キーは必ずユニークでなければならない」と思う誤り。外部キーは参照先の主キーを指すため、参照先はユニークですが、外部キー側は同じ部署を複数の社員が参照するので重複してよい(ユニークである必要はない)。
- 「主キーと外部キーは同じもの」と混同する誤り。主キーはその表で行を一意にするための列、外部キーは別表の主キーを参照するための列で、役割が違います。
補足コラム
- 一対多(1:N)の基本パターン:部署(1) ← 社員(N)。多側の表に参照(外部キー)を置くのが基本です。
- 参照制約の運用例:部署が削除されたら所属社員をどうするか。データベースでは「DELETE CASCADE(削除連鎖)」「RESTRICT(制約違反で削除不可)」などの振る舞いを設定できます。多くの業務では、誤って部署を削除して社員データが孤立しないように制約を厳しくすることが多いです。
- 正規化の目安:部署名など同じ情報を繰り返さないため、部署を別表に分ける(第1〜3正規形の考え方)ことでデータの冗長性と矛盾を減らせます。
SQLの例(イメージ):
CREATE TABLE 部署 (
部署コード CHAR(3) PRIMARY KEY,
部署名 VARCHAR(50) NOT NULL
);
CREATE TABLE 社員 (
社員コード CHAR(5) PRIMARY KEY,
社員名 VARCHAR(100),
入社年 INT,
生年月日 DATE,
部署コード CHAR(3) NOT NULL,
FOREIGN KEY (部署コード) REFERENCES 部署(部署コード)
);
-- 正しい部署コードが無いと、社員は登録できない(参照制約で保護)
FAQ
Q1: なぜ社員表に部署コードを持たせるのが自然ですか?
A1: 同じ部署に複数の社員がいるのが普通だからです。部署が1つで社員が多数いる「一対多」の関係では、多側(社員)に参照(部署コード)を置きます。
A1: 同じ部署に複数の社員がいるのが普通だからです。部署が1つで社員が多数いる「一対多」の関係では、多側(社員)に参照(部署コード)を置きます。
Q2: 部署コードはNULLにできるか?
A2: 設問では「社員は必ず部署に所属する」とあるため、社員表の部署コードはNULL不可(NOT NULL)にするのが適切です。
A2: 設問では「社員は必ず部署に所属する」とあるため、社員表の部署コードはNULL不可(NOT NULL)にするのが適切です。
Q3: 外部キーがあるとデータ登録が遅くなる?
A3: 参照整合性チェックにわずかなコストはかかりますが、データの矛盾を防ぐため重要です。業務での信頼性を優先します。
A3: 参照整合性チェックにわずかなコストはかかりますが、データの矛盾を防ぐため重要です。業務での信頼性を優先します。
関連キーワード: 関係データベース、主キー、外部キー、参照制約、一対多、正規化、リレーション設計

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

