データベースの基礎
社員表(社員番号, 氏名, 部署コード, 部署名)の主キーは社員番号で、どの列も1つの値だけを持つ。関数従属は 社員番号 → 氏名、社員番号 → 部署コード、部署コード → 部署名 である。この表の正規形として正しいものはどれか。
- A第2正規形だが、第3正規形ではない
- B第1正規形だが、第2正規形ではない
- C第3正規形である
答えと解説を見る
正解:A. 第2正規形だが、第3正規形ではない
どの列も繰り返しのない1つの値を持つので、第1正規形です。主キーが社員番号の1列だけなので、主キーの一部だけに従属する部分関数従属は起こりえず、第2正規形でもあります。しかし、部署名は 社員番号 → 部署コード → 部署名 のように、主キーではない部署コードを経由して決まる推移的関数従属なので、第3正規形ではありません。このままでは、同じ部署の社員の行ごとに部署名が繰り返し記録され、部署名を変えるときに何行も書き換える必要があります。部署表(部署コード, 部署名)を分け、社員表には部署コードだけを残すと、第3正規形になります。このとき社員表の部署コードは、部署表を参照する外部キーになります。
- A. 正しい。部署コード → 部署名 の推移的関数従属があるので、第3正規形ではありません。
- B. 主キーが1列なので部分関数従属はなく、第2正規形の条件は満たしています。
- C. 部署名が、主キーでない部署コードを経由して決まる推移的関数従属があるので、第3正規形ではありません。