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

次の関係スキーマは第1正規形(1NF)を満たしているが、第2正規形(2NF)を満たしていない。この理由として、正しいものはどれか。  関係スキーマ: 受注明細(受注番号, 商品コード, 商品名, 数量)  主キー: {受注番号, 商品コード}

ア.商品名が,複合主キーの一部である商品コードにのみ関数従属しているから正解
イ.数量が,複合主キーの一部である受注番号にのみ関数従属しているから
ウ.受注番号から商品コードを経由して商品名が決まる,推移的関数従属性があるから
エ.主キーを構成する受注番号と商品コードの間に関数従属性があるから

解説

2NF違反の正体は「複合主キーの一部だけで決まる属性がいる」こと。宅配便の伝票で例えると、「伝票番号+商品ID」が一緒になって初めて意味をなすのに、商品名だけが商品IDを見ればわかってしまう——そんな「ズル」をしている属性が問題です。

なぜ ア が正解か

2NFの定義は「すべての非キー属性が、主キー全体に完全関数従属している」こと。この表では商品名は{受注番号, 商品コード}という複合主キー全体ではなく、商品コードだけで一意に決まります(どの受注番号であっても商品コードが同じなら商品名は同じ)。これを部分関数従属といい、2NF違反の定義そのものです。解消するには受注明細(受注番号, 商品コード, 数量)と商品(商品コード, 商品名)の2つに分解します。

なぜ イ は間違いか

数量は「ある受注(誰が)のある商品(何を)を何個頼んだか」を表すため、受注番号と商品コードの両方がそろわないと決まりません。つまり主キー全体に完全関数従属しており、2NF違反の原因にはなりません。「数量が怪しい」という直感を利用した典型的な引っかけです。

なぜ ウ は間違いか

推移的関数従属(A→B→C の連鎖)は第3正規形(3NF)違反の条件です。また、受注番号→商品コードという依存はそもそも成立しません(1件の受注に複数の商品コードが紐づくため)。2NFと3NFを混同させることを狙った選択肢です。

なぜ エ は間違いか

主キーの構成要素どうしが関数従属している(受注番号→商品コード など)場合はありますが、それは主キーの設計の問題であり、2NFの定義が扱う「非キー属性の部分従属」とは別の話です。この表では受注番号と商品コードは互いに独立しており、そもそもこの状況は存在しません。

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