関係モデルと正規化理論(第1〜第3正規形・BCNFと関数従属の導出)
正規化は、業務上の依存関係を表の構造に反映し、同じ事実の重複記録に伴う更新・挿入・削除の異常を減らす手順です。列名や現在のサンプル行だけで従属を決めず、許されるすべてのデータ状態について成立する業務ルールを根拠にします。
関数従属と属性閉包からキーを求める
X→Yは、Xの値が同じならYの値も同じになることを表します。Xが1列とは限りません。社員番号→氏名が成立しても、氏名→社員番号は通常成立しません。サンプルに同姓同名がいないことは、氏名が将来も一意である根拠にはなりません。
属性集合Xから従属を繰り返し適用して得られる属性の集合がXの閉包です。閉包が表の全属性を含めばスーパーキーで、そこから属性を1つでも除くと全属性を決定できなくなるものが候補キーです。主キーは候補キーから選んだ1つにすぎません。いずれかの候補キーに含まれる属性をキー属性、それ以外を非キー属性として判定します。
1NF・2NF・3NF・BCNFの判定
正規形 | 確認する条件 |
|---|---|
1NF | 各属性値をその表で扱う1つの値として記録する。繰返しの列群や複数項目の詰込みを避ける |
2NF | 1NFで、非キー属性がいずれの候補キーの真部分集合にも従属しない |
3NF | 非自明な従属X→Aごとに、Xがスーパーキー、またはAがキー属性である |
BCNF | 非自明な従属X→Aごとに、Xがスーパーキーである |
「単一主キーだから必ず2NF」とは、ほかにも複合候補キーがある場合には言い切れません。第3正規形も「主キーからの推移的従属がない」という簡略表現だけでなく、右辺が候補キーの一部となる例外を確認します。
注文の例で部分従属と推移的従属を分ける
表R(注文番号, 明細番号, 注文日, 商品コード, 商品名, 数量)を考えます。注文番号→注文日、商品コード→商品名、(注文番号, 明細番号)→商品コード・数量が成立し、ほかに候補キーはないものとします。注文日は複合キーの一部である注文番号に従属するため、2NF違反です。
まず注文(注文番号, 注文日)と明細(注文番号, 明細番号, 商品コード, 商品名, 数量)に分けます。明細には商品コード→商品名が残り、商品コードはスーパーキーではなく商品名は非キー属性なので3NF違反です。商品(商品コード, 商品名)を分けて、明細から商品名を除きます。商品コードが候補キーの一部ではないこの例で、商品名の従属を「部分従属」と呼ばないようにします。
- 1. 注文番号で注文日を決定
- 2. 注文番号と明細番号で識別
- 3. 商品コードで商品名を決定
各表で何を1件として記録するかを明確にします。分解は業務上の従属が成立することを前提とします。
3NFでもBCNFではない例
R(学生S, 科目C, 教員I)で、SC→IとI→Cが成立し、ほかに独立した従属はないとします。候補キーはSCとSIです。I→Cの左辺Iはスーパーキーではありませんが、右辺Cはキー属性なので3NFを満たし、BCNFは満たしません。
(I,C)と(S,I)へ分解すると、共通属性Iが前者を決定するため無損失です。しかし「同じ学生・科目に教員は1人」というSC→Iは、分解した各表の制約だけでは検査できません。無損失性と従属性保存を混同せず、元の制約をどこで検査するかを考えます。アプリケーションの事前確認だけでは並行登録を防げない場合があるため、排他制御や直列化を含めて設計します。
演習1:部分従属を判定する
条件:キーは(注文番号,明細番号)だけ。注文番号→注文日、商品コード→商品名が成立する。
問い:2NF違反を直接示す従属はどれか。
解答例:注文番号→注文日。
根拠:非キー属性の注文日がキーの真部分集合に従属する。商品名は、このキーに対しては商品コードを介する推移的従属として扱う。
演習2:分解の代償
条件:R(S,C,I)を(I,C)と(S,I)へ無損失に分解した。SC→Iは各表の制約だけでは保証できない。
問い:分解後に別途検査すべき業務制約を説明しよう。(35字以内)
解答例:同じ学生と科目に複数の教員を割り当てない。(21字)
根拠:同じ科目の異なる教員を同じ学生に登録できると、元のSC→Iが壊れる。
復習で確かめること
例の数値や業務条件を変えて同じ結論になるか確認してください。用語の定義だけでなく、問題文のどの条件から、どの制約・SQL・対策を選んだのかを自分の言葉で説明できれば、次の過去問に進みます。
出典と仕様を確認する
Database System Concepts 著者公開資料:関係データベース設計
関連するテーマ
次におすすめの学習
編集・検証について
編集・検証:IT資格ラボ編集部
IPAが公開する試験要綱・シラバス・過去問題と、各技術の公式資料を優先して内容を確認しています。制度変更や誤りを確認した場合は、記事を見直して更新します。
編集方針・情報源・訂正方針を見る