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

次の関係スキーマを第2正規形に変換するための操作として、最も適切なものはどれか。 受注明細(受注番号, 商品コード, 商品名, 単価, 数量) 主キー:{受注番号, 商品コード}

ア.商品マスタ(商品コード, 商品名, 単価) と 受注明細(受注番号, 商品コード, 数量) の2つの関係に分解する正解
イ.受注(受注番号, 商品コード) と 商品明細(商品名, 単価, 数量) の2つの関係に分解する
ウ.受注番号を単独の主キーとし、商品コードを外部キーに変更する
エ.商品名と単価に NOT NULL 制約を設け、受注番号ごとにデータの整合性を管理する

解説

第2正規形とは「複合主キーの一部だけで値が決まる属性(部分関数従属)を別テーブルへ引っ越しする」ルールです。商品名・単価は商品コードだけあれば決まるので、引っ越し対象になります。

なぜ ア が正解か

商品名と単価は「商品コード → 商品名, 単価」という部分関数従属を持っています。複合主キーの片方だけで決まる属性が残っていると、同じ商品名を何十行も書き続ける羽目になり(冗長性)、商品名を変更する際に全行を更新しなければならない更新異常が生じます。この解消策が商品マスタへの分解です。一方、数量は「どの受注の、どの商品を何個買ったか」なので受注番号+商品コードが揃って初めて確定する完全関数従属であり、受注明細側に残します。

なぜ イ は間違いか

分解自体は試みていますが、受注テーブルが{受注番号, 商品コード}だけになり、情報を何も持たないテーブルになります。また商品明細側には独自の主キーがなく、結合で元に戻せなくなります。「テーブルを2つに割れば正規化」という誤解から生まれる典型的な誤りです。

なぜ ウ は間違いか

これは第2正規形の話ではなく、テーブル設計の都合で主キーを単純化する操作です。商品コードを外部キーにしても、商品名・単価は同じテーブルに残ったままなので部分従属は何も解消されません。制約の種類を変えることと、関数従属を分解することは別の話です。

なぜ エ は間違いか

NOT NULL制約はNULL値の混入を防ぐための整合性ルールであり、正規化とは無関係です。第2正規形が狙っている「更新異常・挿入異常・削除異常の排除」はスキーマ(テーブル構造)を分解することでしか達成できません。制約を強化しても、商品名の冗長な繰り返しはそのまま残ります。

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