データベーススペシャリスト 2017年 午前2 問07
問題文
第2正規形であるが第3正規形でない表はどれか。ここで、講義名に対して担当教員は一意に決まり、所属コードに対して勤務地は一意に決まるものとする。また、{ }は繰返し項目を表し、実線の下線は主キーを表す。

選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
第2→第3正規形判定【午前2解説】
正解の理由
選択肢の中で、第2正規形(2NF)を満たしつつ第3正規形(3NF)を満たさないのはウです。理由は次の通りです。ウの表では主キーが単一属性の「社員番号」であるため、部分関数従属(主キーの一部に依存する非キー属性)は存在せず、2NFの条件は満たします。一方で「所属コード」が非キー属性であり、所属コードに対して勤務地が一意に決まる(所属コード → 勤務地)ことから、社員番号 → 所属コード → 勤務地 のような推移的関数従属が生じます。推移的関数従属は3NFの禁止条件に該当するため、3NFを満たしていません。
解法ステップ
- 各表の主キーを確認する(図の下線や文脈から判断)。
- 1NFの確認:繰返し項目や非原子値がないかを見る。
- 2NFの確認:主キーが複合キーなら、非キー属性が主キーの一部にのみ依存していないかを調べる(部分関数従属)。主キーが単一属性なら2NFは自動的に満たす。
- 3NFの確認:非キー属性同士の依存関係(非キー→非キー)が存在しないかを調べる。非キー属性が別の非キー属性を決定している場合は推移的関数従属となり3NF違反。
- 上記の結果に基づき、2NFだが3NFでない表を選ぶ。
選択肢別の誤答解説
- ア
主キーは(学生番号, 講義名)の複合キーと考えるのが自然です(1人の学生が複数講義を取ること、1講義に複数学生がいることを想定)。この場合「担当教員」は講義名だけで一意に決まるため、担当教員は主キーの一部(講義名)に依存する部分関数従属になります。したがって2NFを満たさず、問題の条件(2NFだが3NFでない)に該当しません。 - イ
主キーは社員番号(単一属性)で、氏名・入社年月日・電話番号は直接社員番号に依存します。非キー属性間に決定関係がないため、2NFも3NFも満たします(3NF違反なし)。 - ウ
主キーは社員番号(単一)であるため2NFは満たします。しかし所属コード → 勤務地 の決定関係があり、社員番号 → 所属コード → 勤務地 の推移的関数従属が発生します。これが3NF違反の原因であり、「2NFだが3NFでない」条件に合致します。 - エ
「趣味」が {テニス、ゴルフ} のように繰返し項目(集合)で表現されているため、まず1NF(各属性は原子値)を満たしていません。1NFを満たさない表は正規形の検討対象外であり、2NFも満たしません。
よくある誤解
- 「主キーが単一なら常に3NFも満たす」
誤りです。単一キーでも非キー属性同士の決定関係(推移的関数従属)があれば3NFは満たしません(今回のウが該当)。 - 「繰返し項目は2NFの話の後で扱えばよい」
繰返し項目は1NFの違反であり、まず1NFを満たしていないと2NFや3NFの検討以前の問題です。 - 「部分関数従属と推移的関数従属を混同する」
部分関数従属は複合主キーの“一部”への依存、推移的は非キー→非キーの依存。判定時に主キーの種別(単一か複合か)を先に確認すると混乱しにくくなります。
補足コラム
正規化による分解の例(ウを3NFに直す一案):
- 元表:(社員番号, 氏名, 所属コード, 勤務地)
- 分解後:
- 社員(社員番号, 氏名, 所属コード)
- 所属(所属コード, 勤務地)
この分解により所属コード→勤務地 の依存は所属表内に閉じ、社員表は推移的従属を持たなくなります。SQLでのテーブル定義例:
CREATE TABLE 社員 (
社員番号 INT PRIMARY KEY,
氏名 VARCHAR(100),
所属コード CHAR(10)
);
CREATE TABLE 所属 (
所属コード CHAR(10) PRIMARY KEY,
勤務地 VARCHAR(100)
);
FAQ
Q1: 部分関数従属と推移的関数従属、どちらが2NF/3NFに対応しますか?
A1: 部分関数従属は2NFの違反原因(複合主キーの場合)。推移的関数従属は3NFの違反原因(非キー属性が別の非キー属性を決定する場合)。
A1: 部分関数従属は2NFの違反原因(複合主キーの場合)。推移的関数従属は3NFの違反原因(非キー属性が別の非キー属性を決定する場合)。
Q2: 主キーが単一なら2NFは自動で満たすのですか?
A2: はい。2NFの定義は「非キー属性が主キーの一部に依存しないこと」なので、主キーが単一属性なら“主キーの一部”が存在せず、2NFは満たされます。
A2: はい。2NFの定義は「非キー属性が主キーの一部に依存しないこと」なので、主キーが単一属性なら“主キーの一部”が存在せず、2NFは満たされます。
Q3: 1NF違反(繰返し項目)があったらどうする?
A3: 繰返し項目は別表に分割して原子化します。例:趣味を別表(社員番号, 趣味)に分けて1行1趣味の構成にする。
A3: 繰返し項目は別表に分割して原子化します。例:趣味を別表(社員番号, 趣味)に分けて1行1趣味の構成にする。
関連キーワード: 正規化、第2正規形、第3正規形、部分関数従属、推移的関数従属、繰返し項目

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

