データベーススペシャリスト 2019年 午前2 問05
問題文
四つの表の関係表E-R図のうち、適切なものはどれか。ここで、1 *は1対多の関連を表し、実線の下線は主キーを、破線の下線は外部キーを表す。


選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
E-R図の1対多関係【午前2解説】
正解の理由
適切な選択肢は イ です。理由は各テーブルのキーと参照関係から多対1(1対多)の方向が一意に決まるためです。具体的には、医師テーブルが診療科コードを外部キーとして持っているため「多くの医師が1つの診療科に属する」(医師側が多、診療科側が1)となります。また、診察テーブルは診療科コードと患者番号を複合主キーとして持つと同時にそれぞれが診療科・患者の外部キーであるため、1つの診療科は複数の診察を持ち、1人の患者は複数の診察を受ける(診療科側・患者側が1、診察側が多)ことになり、これらの向きが イ の表現と一致します。
解法ステップ
- 各テーブルのキー情報(主キー・外部キー)を確認する。
- 外部キーを持つ側を「子(多側)」、参照先のテーブルを「親(1側)」と見なす。
- 複合主キーが外部キーを含む場合でも、外部キーの参照方向(親→子)で多側/1側を決める。
- 各関係の向きが選択肢と一致するか照合する。
- 医師(外部キー:診療科コード) → 医師は1つの診療科に所属する → 医師側は多、診療科側は1
- 診療科 ← 診察(診療科コードが診察の主キーかつ外部キー) → 診療科側は1、診察側は多(1つの診療科に複数の診察)
- 患者 ← 診察(患者番号が診察の主キーかつ外部キー) → 患者側は1、診察側は多(1人の患者が複数の診察)
選択肢別の誤答解説
-
ア
- 医師─診療科は正しく「医師側が*、診療科側が1」だが、診療科─診察の向きが逆になっている(診療科側がになっている)。実際は診療科が親(1)で診察が子()である。さらに診察─患者も逆で、患者が親(1)で診察が子(*)であるため不適切。
-
ウ
- 医師─診療科の向きが逆(医師側が1)になっており、現実の外部キー構成と矛盾する。その他の関係もすべて反転しており整合性が取れない。
-
エ
- 診療科─診察および診察─患者の向きは正しいが、医師─診療科が逆になっているため全体として不正解。医師テーブルが診療科コードを持つ設計から、医師側を多とするのが正しい。
よくある誤解
- 「外部キーがあれば参照先が多側になる」と誤解するケース:外部キーを持つのは通常子(多側)であり、参照先が1側となる。逆に考えないこと。
- 「複合主キーになっていると1対1になる」と誤解するケース:複合主キーは一意性を保証するだけで、外部キーとして参照している限り親は1側、子は多側のままである。
- 診療科・患者それぞれが「診察に含まれる=診察側が1」と考える誤り:診察は「診療科と患者の組み合わせで発生する複数レコード」を表すため、診察側が多になるのが自然。
補足コラム
-
複合主キーを用いるパターンは「多対多」を仲介テーブルで表す場合に多く見られますが、本件では診察テーブルが(診療科コード, 患者番号)を主キーにしており、それぞれが外部キーでもあるため、診察は診療科と患者の組合せを一意に表す「子テーブル」です。設計の観点からは、診察に診察日時などの属性が含まれる点からも「診察は独立した多の側」であることが明確です。
-
実務での確認手順(SQL例):
CREATE TABLE 診療科 (
診療科コード INT PRIMARY KEY,
診療科名称 VARCHAR(50)
);
CREATE TABLE 患者 (
患者番号 INT PRIMARY KEY,
患者名 VARCHAR(50)
);
CREATE TABLE 医師 (
医師番号 INT PRIMARY KEY,
医師名 VARCHAR(50),
診療科コード INT,
FOREIGN KEY (診療科コード) REFERENCES 診療科(診療科コード)
);
CREATE TABLE 診察 (
診療科コード INT,
患者番号 INT,
診察日時 DATETIME,
PRIMARY KEY (診療科コード, 患者番号),
FOREIGN KEY (診療科コード) REFERENCES 診療科(診療科コード),
FOREIGN KEY (患者番号) REFERENCES 患者(患者番号)
);
この定義から、医師は診療科に従属(多側)、診察は診療科・患者の両方に従属(診察側が多)であることがSQLレベルでも確認できます。
FAQ
Q. 診察テーブルの複合主キーは「診療科ごと・患者ごとに1件しか診察がない」と読むべきですか?
A. いいえ。複合主キーはその組合せの一意性を保証するだけです。診察日時が別属性としてある限り、同一患者が同一診療科で複数回診察を受けるならば、日時を含めて主キーにするなど設計で対応します(問題文の意図では診療科コード+患者番号が主キーであるため、診察はその組合せごとに1レコードという設計になっていますが、一般的設計では診察IDや日時を主キーに含めることが多いです)。
A. いいえ。複合主キーはその組合せの一意性を保証するだけです。診察日時が別属性としてある限り、同一患者が同一診療科で複数回診察を受けるならば、日時を含めて主キーにするなど設計で対応します(問題文の意図では診療科コード+患者番号が主キーであるため、診察はその組合せごとに1レコードという設計になっていますが、一般的設計では診察IDや日時を主キーに含めることが多いです)。
Q. 外部キーがなければ多対多かどうか判断できませんか?
A. 外部キーや主キー情報は最も確実な判断材料です。図でキーの下線(実線=主キー、破線=外部キー)が示されている場合は、それに従って多/1を決定してください。
A. 外部キーや主キー情報は最も確実な判断材料です。図でキーの下線(実線=主キー、破線=外部キー)が示されている場合は、それに従って多/1を決定してください。
関連キーワード: ER図、リレーション、主キー、外部キー、複合主キー、1対多、子テーブル、参照整合性

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

