メインコンテンツへ
データベース

次のERモデルを関係スキーマに変換したとき、正しい変換結果はどれか。 エンティティ: 顧客(顧客ID, 氏名)、注文(注文ID, 注文日) リレーションシップ: 顧客は複数の注文を行う(1対多)

ア.顧客(顧客ID, 氏名)、注文(注文ID, 注文日)の2テーブルのみ。顧客IDは注文テーブルに入れない
イ.顧客(顧客ID, 氏名, 注文ID)、注文(注文ID, 注文日)の2テーブル。顧客テーブルに注文IDを追加
ウ.顧客(顧客ID, 氏名)、注文(注文ID, 注文日)、顧客注文(顧客ID, 注文ID)の3テーブルで結合テーブルを作成
エ.顧客(顧客ID, 氏名)、注文(注文ID, 注文日, 顧客ID)の2テーブル。注文テーブルに外部キーとして顧客IDを追加正解

解説

1対多の変換ルールは「多の側」に外部キーを置く!注文が多(一人の顧客が複数の注文)なので、注文テーブルに顧客IDを外部キーとして持たせる。

なぜ エ が正解か

1対多のER変換: 「1の側」のプライマリキーを「多の側」テーブルに外部キーとして追加する。顧客(1側)の顧客IDを注文(多側)に追加 → 注文(注文ID, 注文日, 顧客ID)。これで1つの顧客に複数の注文が紐づく構造を表現できる。

なぜ ア は間違いか

外部キーなしでは顧客と注文の関係が表現できない。どの注文が誰の注文かSQLで結合不可能になる。

なぜ イ は間違いか

顧客テーブルに注文IDを入れると1顧客1注文しか管理できない。1対多の「多」側を1側に持たせると正規化違反になる。

なぜ ウ は間違いか

結合テーブル(中間テーブル)が必要なのは多対多の関係の場合。1対多では中間テーブルは不要で冗長。

出典: AI生成問題(学習用)