“受注明細”表は,どのレベルまでの正規形の条件を満足しているか。
ここで,実線の下線は主キーを表す。
受注明細(主キー:受注番号,明細番号)
表/受注番号|明細番号|商品コード|商品名|数量/015867|1|TV20006|20型テレビ|20/015867|2|TV24005|24型テレビ|10/015867|3|TV28007|28型テレビ|5/015868|1|TV24005|24型テレビ|8
正答2
解説
正解は2です。
正規形を判断するには、主キーに対する関数従属の関係を確認します。
受注明細表の主キーは(受注番号、明細番号)の組です。
商品コード、商品名、数量の各列が、何によって一意に決まるかを見ていきます。
【処理の流れ】
各列は繰り返しのない単一の値なので、第1正規形を満たします。
商品コードと数量は、主キー全体(受注番号と明細番号の組)によって決まります。
受注番号だけ、または明細番号だけで決まる列はないので、部分関数従属はなく、第2正規形を満たします。
一方、商品名は非キー属性である商品コードによって決まります。
つまり、主キーが商品コードを決め、その商品コードが商品名を決めるという推移的関数従属があります。
そのため、第3正規形は満たしません。
【選択肢別解説】
1:× 第1正規形は満たしていますが、さらに部分関数従属もないので第2正規形まで満たしています。
第1正規形にとどまるという判断は誤りです。
2:○ 部分関数従属はありませんが、商品コードから商品名への推移的関数従属があります。
そのため、満たしているのは第2正規形までです。
3:× 第3正規形は、非キー属性が主キーにだけ従属し、非キー属性どうしの従属がない状態です。
商品名が商品コードに従属しているので、第3正規形は満たしていません。
4:× 第4正規形は、第3正規形とボイス・コッド正規形を満たしたうえで、多値従属を排除した状態です。
第3正規形を満たしていない以上、第4正規形も満たしません。
【ポイント】
第3正規形にするには、商品コードと商品名を別の商品表に分け、受注明細表には商品コードだけを残します。
部分関数従属は「主キーの一部に従属」、推移的関数従属は「非キー属性に従属」と区別しましょう。