平成30年秋 第28問
「どの非キー属性も、主キーに推移的に関数従属しない」とは?
◇用語解説
用語 | 意味 |
---|---|
主キー | 表(リレーション)の各行を一意に特定するための列(または列の組) |
非キー属性 | 主キーに含まれないその他の列 |
関数従属 | A → B のとき、Aの値が決まればBの値が一意に決まる関係 |
推移的関数従属 | A → B、B → C が成り立つとき、A → C も成り立つ(この間接的な依存を「推移的」と呼ぶ) |
第3正規形(3NF) | 非キー属性が、主キーに推移的に関数従属していない状態のこと |
◇結論
第3正規形とは「非キー属性が他の非キー属性に依存していない状態」を指します。
つまり、「非キー属性は主キーに直接だけ依存していればよく、他の列を経由してはいけない」というルールです。
◇具体例で解説
ダメな構造(第2正規形までは満たしているが、第3正規形ではない)
社員ID(主キー) | 部署ID | 部署名 |
---|---|---|
A001 | D01 | 総務部 |
A002 | D02 | 営業部 |
A003 | D01 | 総務部 |
•社員ID → 部署ID(OK:主キー → 非キー)
•部署ID → 部署名(OK:非キー → 非キー)
•よって 社員ID → 部署名(❌推移的に従属している)
改善された構造(第3正規形)
① 社員表(主キー:社員ID)
社員ID | 部署ID |
---|---|
A001 | D01 |
A002 | D02 |
② 部署表(主キー:部署ID)
部署ID | 部署名 |
---|---|
D01 | 総務部 |
D02 | 営業部 |
→ これで「部署名」は主キーに直接従属せず、別の表に分離されました。
◇あらためて言葉の意味
「どの非キー属性も、主キーに推移的に関数従属しない」
→ 非キー属性は主キーに直接依存するだけにして、他の非キー属性を経由して依存してはいけないということ。
◇なぜそうなのか(なぜダメ?またはなぜ良い?)
問題点(推移的従属がある場合) | 改善点(3NFで推移的従属をなくす) |
---|---|
同じ情報(部署名など)が何度も繰り返される → 冗長性の増加 | 情報が1か所に集約されて、重複がなくなる |
変更時に表の複数行を修正する必要がある → 更新ミスの原因 | 変更が1か所で済む → 整合性が保てる |
挿入や削除で意図しないデータ欠損が発生しやすい | データの挿入・削除が安全にできる |
◇まとめ
•第3正規形は「非キー属性が主キーに推移的に依存していない状態」
•推移的従属があると、冗長性・不整合・データ欠損の原因になる
•正しく正規化することで、保守性・一貫性・拡張性が高くなる
•非キー属性 → 非キー属性 の関係を見つけたら、表を分割する!