応用情報技術者 2010年 春期 午前2 問29
問題文
顧客は一般に複数の銀行に預金するものとして、顧客と銀行の関連を、E-R 図で次のように表現する。このモデルを関係データベース上に “銀行” 表、“口座” 表、“顧客”表として実装する場合の記述として、適切なものはどれか。

選択肢
ア:“銀行”表から “口座”表へのカーディナリティは多対1である。
イ:“銀行”表中に参照制約を課した外部キーがある。
ウ:“口座”表から “顧客”表へのカーディナリティは1対多である。
エ:“口座”表には二つ以上の外部キーがある。(正解)
🔒 解説は解答すると表示されます
口座テーブルの外部キー【午前2解説】
正解の理由
ER図では「口座」が銀行と顧客を結ぶ関係(リレーションシップ)を表しています。関係を関係データベース上に実装する際、関係(多対多や関係に属性がある場合)は独立した表として作成し、その表に関係先の各エンティティを参照する外部キーを持たせます。したがって、口座表には銀行表と顧客表を参照する二つ以上の外部キーが含まれるため、選択肢 エ が妥当です。
解法ステップ
- 図の要素を識別する:長方形はエンティティ(銀行、顧客)、菱形はリレーションシップ(口座)であると確認する。
- カーディナリティを読み取る:一般的に「顧客は複数の銀行に預金する」などの文脈から関係は多対多(ある顧客が複数の銀行に口座を持ち、ある銀行が複数の顧客を持つ)である可能性を考える。
- 実装ルールを適用する:多対多の関係は中間表(関係表)で実装し、その中間表に両側のエンティティを参照する外部キーを設定する。
- 選択肢と照合する:上記の実装から「口座表には二つ以上の外部キーがある」が成立するため選ぶ。
選択肢別の誤答解説
- ア: “銀行”表から “口座”表へのカーディナリティは多対1である。
解説:方向を明確にすると、銀行→口座は「1対多」です(1つの銀行に複数の口座が属する)。選択肢アは「多対1」としており、方向が逆になっているため誤りです。 - イ: “銀行”表中に参照制約を課した外部キーがある。
解説:参照制約(外部キー)は通常、他テーブルを参照する側の表に置かれます。銀行が親(参照される側)であるため、銀行表に口座を参照する外部キーを持つ必要はなく、この記述は誤りです。 - ウ: “口座”表から “顧客”表へのカーディナリティは1対多である。
解説:口座→顧客の向きで読むと、1つの口座は通常1人(または1つ)の顧客に属します。つまり「口座→顧客」は多対1(多くの口座が1人の顧客に属する)であり、選択肢ウの「1対多」は方向を取り違えた誤りです。 - エ: “口座”表には二つ以上の外部キーがある。
解説:口座が銀行と顧客をつなぐ関係(あるいはアソシエイティブエンティティ)で実装されるため、銀行表と顧客表それぞれを参照する外部キーを持つことになり、この記述は正しい(したがって正答は エ)。
よくある誤解
- 「A→Bのカーディナリティ」を表現するときに方向を取り違える:例えば「銀行表から口座表へのカーディナリティ」と書くときは必ず「銀行1に対して口座が多い=1対多」であることを確認する。
- 外部キーは親テーブルに置くと誤解する:外部キーは参照する側(子)に置くのが原則で、参照される側(親)は通常外部キーを持たない。
- 多対多の関係をそのまま2つのテーブルで表現できると考える:多対多は中間表(関係表)が必要で、そこに両側の外部キーが入る。
補足コラム
- 口座(関係)に属性(口座番号、開設日、残高など)があれば、口座は独立した表として実装されるのが普通です。中間表に属性がない場合でも、多対多を解消するため中間表を置く設計が標準です。
- 中間表の主キー設計は2方式がある:両外部キーの組み合わせを主キーとする複合主キー方式、あるいは surrogate key(口座IDなどの単一主キー)を設けておく方式。どちらを選ぶかは運用上の要件(口座の一意性、検索負荷、将来の拡張性など)で決めます。
SQLの実装例(参考)
CREATE TABLE bank (
bank_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE customer (
customer_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE account (
account_id INT PRIMARY KEY, -- サロゲートキー方式
bank_id INT NOT NULL,
customer_id INT NOT NULL,
balance DECIMAL(12,2),
opened_at DATE,
FOREIGN KEY (bank_id) REFERENCES bank(bank_id),
FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
);
FAQ
Q. 口座表に外部キーが2つ必要なのはなぜですか?
A. 口座表は銀行と顧客を結ぶ関係(多対多や関係に属性がある場合の関係)を実装する表であり、両側のエンティティを識別するためにそれぞれを参照する外部キーが必要になります。
A. 口座表は銀行と顧客を結ぶ関係(多対多や関係に属性がある場合の関係)を実装する表であり、両側のエンティティを識別するためにそれぞれを参照する外部キーが必要になります。
Q. 中間表の主キーは必ず複合キーでなければなりませんか?
A. 必須ではありません。複合主キー(bank_id, customer_id)にする方法と、口座IDのようなサロゲートキーを設ける方法のどちらも採用されます。それぞれ一長一短があるため要件に合わせて選択します。
A. 必須ではありません。複合主キー(bank_id, customer_id)にする方法と、口座IDのようなサロゲートキーを設ける方法のどちらも採用されます。それぞれ一長一短があるため要件に合わせて選択します。
関連キーワード: E-R図、カーディナリティ、外部キー、関係テーブル、アソシエイティブエンティティ、正規化、リレーショナルモデル

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

