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

選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
第2正規形と第3正規形【午前2解説】
正解の理由
表の中で ウ は、第2正規形(2NF)を満たしつつ第3正規形(3NF)を満たしていない典型例です。理由は次の通りです。
- 主キーが単一属性(社員番号)であるため、部分関数従属(主キーの一部に依存する非キー属性)は存在せず、2NFの要件を満たします。
- しかし、所属コード → 勤務地 という関数従属が与えられており、社員番号 → 所属コード → 勤務地 のように非キー属性(勤務地)が別の非キー属性(所属コード)に依存する推移的関数従属が生じています。これは3NFの禁止条件に抵触するため、3NFを満たしません。
以上により、問題の条件に合致する選択肢は ウ です。
解法ステップ
- 各表で主キーを確認する(図の下線、または文脈で明示)。
- まず1NFの確認:繰返し項目や複合値がないかを見る。1NF違反なら以降の判定対象外(2NF/3NFを満たさない)。
- 2NF判定:主キーが複合キーの場合、非キー属性が主キーの一部にのみ依存していないか(部分関数従属)をチェック。主キーが単一属性なら部分従属は発生しない。
- 3NF判定:非キー属性が他の非キー属性に依存している(推移的従属)か、左辺が候補キーでない関数従属がないかをチェック。存在すれば3NF違反。
- 各選択肢に対して上の順で当てはめ、条件に合う表を選ぶ。
選択肢別の誤答解説
-
ア(学生番号|講義名|担当教員|成績)
主キーは(学生番号, 講義名)の複合キーと解釈されます。担当教員は講義名によって一意に定まるため、担当教員は主キーの一部(講義名)に依存する「部分関数従属」を生じます。したがってこの表は2NFを満たしません(従って3NFも満たさない)。前回の誤った説明と異なり、部分従属の有無を正しく判定する必要があります。 -
イ(社員番号|氏名|入社年月日|電話番号)
主キーが社員番号の単一属性であり、氏名・入社年月日・電話番号はいずれも社員番号に対して直接依存しています。さらに非キー属性同士の依存(推移的従属)も想定されないため、2NF・3NFの要件を満たします。よってこの表は3NF適合です。 -
ウ(社員番号|社員名|所属コード|勤務地)
主キーは社員番号(単一)。所属コードは社員番号に依存する非キー属性で、さらに所属コード → 勤務地 の関係があるため勤務地は非キー→非キーの推移的従属を受けます。結果、2NFは満たすが3NFは満たさない、問題の条件に合致します。 -
エ(社員番号|身長|体重|趣味({…}))
趣味が {テニス, ゴルフ} のような繰返し項目(多値属性)として示されているため、1NF(各属性が単一値を持つこと)に違反しています。1NF違反の表は2NF/3NFの判定対象にならず、そのままでは2NFや3NFを満たしていないと扱うのが正しい判断です。
よくある誤解
- 誤解1:主キーが単一なら必ず3NFである。
→ 単一主キーでも、非キー属性間の依存(推移的従属)があれば3NF違反になります(ウがその例)。 - 誤解2:多値属性(繰返し項目)は2NF/3NFの対象外だから無視してよい。
→ 多値属性はまず1NF違反であり、正規化の第一歩として分解が必要です。1NF違反の表はそのまま2NF/3NFの判定対象になりません。 - 誤解3:部分従属と推移的従属を混同する。
→ 部分従属は「複合キーの一部に依存」することで2NF違反、推移的従属は「非キー属性が別の非キー属性から決まる」ことで3NF違反です。
補足コラム
正規化の実務的対応(3NFにするための分解例):
- アの改善:
- Enrollment(学生番号, 講義名, 成績)
- Lecture(講義名, 担当教員)
- ウの改善:
- Employee(社員番号, 社員名, 所属コード)
- Department(所属コード, 勤務地)
- エの改善(1NFへの修正):
- Employee(社員番号, 身長, 体重)
- Hobby(社員番号, 趣味) — 趣味を1行1趣味の行に分ける
補足として、3NFを更に厳密化したBCNF(ボイス・コッド正規形)は関数従属の左辺が常に候補キーであることを要求します。実務では運用上は3NFで十分な場合も多いですが、整合性要件に応じてBCNFを検討します。
FAQ
Q1: 「候補キー」と「主キー」はどう違う?
A1: 候補キーは表の中で一意性を満たす最小の属性集合すべてを指し、その中から1つを選んだものが主キーです。正規化では候補キーを基準に依存関係を判断します。
A1: 候補キーは表の中で一意性を満たす最小の属性集合すべてを指し、その中から1つを選んだものが主キーです。正規化では候補キーを基準に依存関係を判断します。
Q2: 多値属性がある場合、まず何をすべきか?
A2: まず1NFを満たすために多値属性を別の行・別表に分解します(1行1値にする)。その後に2NF, 3NFの判定と分解を行います。
A2: まず1NFを満たすために多値属性を別の行・別表に分解します(1行1値にする)。その後に2NF, 3NFの判定と分解を行います。
Q3: 実際の設計でどこまで正規化すべき?
A3: データ整合性重視なら3NF以上(場合によりBCNF)、性能やクエリの効率を重視するなら意図的に非正規化することもあります。要件に応じてトレードオフを検討してください。
A3: データ整合性重視なら3NF以上(場合によりBCNF)、性能やクエリの効率を重視するなら意図的に非正規化することもあります。要件に応じてトレードオフを検討してください。
関連キーワード: 正規化、第2正規形、第3正規形、部分関数従属、推移的関数従属、多値属性、分解、関数従属

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

