関係データベースを使い“社員”表と“部署”表を作成して社員情報を管理する。“社員”表と“部署”表に,必要に応じて設定する主キーと外部キーの適切な組合せはどれか。ここで,社員は必ず“部署”表に存在する部署に所属するものとし,社員データの追加や更新をするときには,参照制約を利用して整合性を確保するものとする。 社員
| 社員コード | 社員名 | 入社年 | 生年月日 | 部署コード |
|---|
部署
| 部署コード | 部署名 |
|---|
この問題の解説と、これまでの解答の記録です。
関係データベースを使い“社員”表と“部署”表を作成して社員情報を管理する。“社員”表と“部署”表に,必要に応じて設定する主キーと外部キーの適切な組合せはどれか。ここで,社員は必ず“部署”表に存在する部署に所属するものとし,社員データの追加や更新をするときには,参照制約を利用して整合性を確保するものとする。 社員
| 社員コード | 社員名 | 入社年 | 生年月日 | 部署コード |
|---|
部署
| 部署コード | 部署名 |
|---|
主キーの設定は正しいものの、外部キーを「なし」としています。外部キーが無いと参照制約が働かないため、「部署」表に存在しない部署コードを社員データに入力しても DBMS が防げません。設問が求める「参照制約を利用して整合性を確保する」という条件を満たせないので誤りです。
正解 主キーは「表の各行を一意に識別する列」なので、社員1人1行の「社員」表では社員コード、部署1つ1行の「部署」表では部署コードがそれぞれ主キーになります。次に「社員」表の部署コード列は、その社員が所属する部署を表す値であり、「部署」表の主キー (部署コード) の値を指し示しています。このように他の表の主キーを参照する列が外部キーです。外部キーを設定すると参照制約 (参照整合性制約) が働き、「部署」表に存在しない部署コードを社員データに登録・更新しようとすると DBMS が拒否するため、設問の「社員は必ず『部署』表に存在する部署に所属する」という条件を自動的に守れます。したがって、主キーは「社員」表の社員コードと「部署」表の部署コード、外部キーは「社員」表の部署コード、というイが正解です。
「社員」表に主キーが設定されていないため、社員コードが重複した行を登録でき、社員を一意に識別できません。また社員コードは他の表の主キーを参照する列ではないので、外部キーには該当しません。外部キーになり得るのは「社員」表の部署コードだけです。
「社員」表の部署コードを主キーにすると値の重複が許されなくなり、同じ部署に複数の社員が所属できなくなってしまいます。また「部署」表の部署コードは参照される側の主キーであって外部キーではなく、社員コードも他表を参照しないため外部キーになりません。主キーと外部キーの役割が入れ替わった組合せで、参照の向きも逆です。