前回は「候補キー」について勉強しました。
今回はそこから一歩進んで、
候補キー → 主属性 → 部分関数従属 → 第2正規形
という流れを、実際に問題を解きながら勉強しました。
最初は「部分関数従属」という言葉が少し難しく感じましたが、候補キーから順番に考えていくと、だんだん仕組みが見えてきました。
まずは「主属性」と「非主属性」
今回最初に覚えたのが主属性です。
主属性とは、
いずれかの候補キーを構成している属性
です。
例えば、
R(A, B, C, D, E)
候補キー:AB、AC
だった場合、候補キーに登場する属性を全部集めると、
A、B、C
になります。
したがって、
主属性:A、B、C
非主属性:D、E
です。
ここで注意したいのは、主キーを構成する属性だけが主属性なのではないということです。
複数の候補キーがある場合、そのどれか一つでも構成していれば主属性になります。
部分関数従属とは?
次に勉強したのが部分関数従属です。
例えば、次の履修表を考えます。
履修表
(学生番号, 科目番号, 学生名, 科目名, 成績)
候補キー:
(学生番号, 科目番号)
次の関数従属性があるとします。
学生番号 → 学生名
科目番号 → 科目名
(学生番号, 科目番号)→ 成績
「学生名」は学生番号だけで決まります。
つまり、
学生番号 → 学生名
では、複合候補キーである、
(学生番号, 科目番号)
の一部分しか使っていません。
このように、非主属性が候補キー全体ではなく、その一部分だけで決まってしまうことが、第2正規形を考えるときの部分関数従属です。
同じように、
科目番号 → 科目名
も部分関数従属です。
一方、
(学生番号, 科目番号)→ 成績
は両方の属性が必要なので、候補キー全体に完全関数従属しています。
第2正規形とは?
今回のポイントを一言で整理すると、
非主属性が候補キーの一部に部分関数従属していなければ、第2正規形
ということです。
逆に、
非主属性が候補キーの一部だけで決まってしまうと、第2正規形ではない
ということになります。
ここで「非主属性」という言葉が重要です。
受注明細表の問題に挑戦
実際に次の問題を解きました。
受注明細
R(受注番号, 商品番号, 受注日, 商品名, 単価, 数量)
候補キー:
(受注番号, 商品番号)
関数従属性は、
受注番号 → 受注日
商品番号 → 商品名, 単価
(受注番号, 商品番号)→ 数量
です。
まず、候補キーを構成している、
受注番号、商品番号
が主属性です。
それ以外の、
受注日、商品名、単価、数量
が非主属性です。
そして、
受注番号 → 受注日
は候補キーの一部分だけで受注日が決まっています。
また、
商品番号 → 商品名, 単価
も同様です。
したがって、この受注明細表には部分関数従属があります。
つまり、第2正規形ではありません。
第2正規形に分解する
そこで次の3つの表に分けます。
受注表
(受注番号, 受注日)
商品表
(商品番号, 商品名, 単価)
受注明細表
(受注番号, 商品番号, 数量)
これなら、
受注番号 → 受注日
は受注表へ、
商品番号 → 商品名, 単価
は商品表へ移動します。
そして受注明細表には、
(受注番号, 商品番号)→ 数量
が残ります。
数量を決めるには受注番号と商品番号の両方が必要なので、候補キー全体への完全関数従属です。
これで部分関数従属を取り除くことができました。
候補キーが複数ある場合
次は少し難しい問題でした。
R(A, B, C, D, E)
候補キー:AB、AC
関数従属性は、
A → D
B → E
AB → C
です。
候補キーABとACに登場する属性を集めると、
A、B、C
なので、
主属性:A、B、C
非主属性:D、E
となります。
ここで、
A → D
を見ると、非主属性Dが候補キーABやACの一部であるAだけで決まっています。
また、
B → E
では、非主属性Eが候補キーABの一部であるBだけで決まっています。
したがって、部分関数従属が存在するため、この関係は第2正規形ではありません。
ここで学んだのは、
すべての候補キーに対して部分関数従属している必要はなく、いずれかの候補キーの真部分集合に非主属性が依存していれば問題になる
ということです。
最後の問題で間違えた!
最後は、ちょっとした「ひっかけ問題」に挑戦しました。
R(A, B, C, D)
候補キー:AB、AC
関数従属性:
A → B
B → C
AB → D
候補キーから考えると、
主属性:A、B、C
非主属性:D
です。
ここで、
A → B
B → C
があります。
AやBは候補キーの一部分なので、最初は部分関数従属があるようにも見えます。
しかし、BもCも主属性です。
第2正規形で注目するのは、非主属性が候補キーの一部に依存しているかどうかです。
したがって、A→B、B→Cは第2正規形を崩す原因にはなりません。
そして非主属性Dについては、
AB → D
です。
私はここで、
「Dが候補キーABに部分関数従属しているので、第2正規形ではない」
と答えてしまいました。
しかし、これは間違いでした。
「AB → D」は部分関数従属ではない
候補キーはABです。
Aだけ → D ×
Bだけ → D ×
AB → D ○
つまり、Dを決めるには候補キーABの全部が必要です。
したがって、
AB → D
は部分関数従属ではなく、完全関数従属です。
よって、この関係は第2正規形を満たしています。
今回、この問題を間違えたことで、
「候補キーから関数従属している」だけでは部分関数従属ではない
ということがよく分かりました。
第2正規形の判定手順
今回の勉強を、自分なりに次のように整理しました。
① 候補キーを求める
↓
② 主属性を求める
↓
③ 非主属性を求める
↓
④ 非主属性に注目する
↓
⑤ 非主属性が候補キーの
一部分だけで決まらないか確認
↓
YES
↓
⑥ 部分関数従属あり
↓
⑦ 第2正規形ではない
↓
⑧ 表を分解する
この順番で考えると、かなり分かりやすくなりました。
今回の学習で理解できたこと
今回一番大きかったのは、これまで別々に覚えていた、
候補キー
主属性・非主属性
部分関数従属
第2正規形
が、一つの流れとしてつながったことです。
特に、
第2正規形では「非主属性」に注目する
という点は重要だと思いました。
そして、
複合候補キーの一部分 → 非主属性
という関数従属がないかを探す。
これが第2正規形を判断するときのポイントになりそうです。
今日の学習はここまで
今日は、
候補キー → 主属性 → 部分関数従属 → 第2正規形
まで進みました。
最後の問題では間違えてしまいましたが、間違えたことで「部分関数従属」の意味が逆によく分かった気がします。
資格勉強では、正解した問題よりも、なぜ間違えたのかを理解した問題の方が記憶に残るのかもしれません。
次回はいよいよ、
第2正規形 → 推移的関数従属 → 第3正規形
へ進みたいと思います。
正規化について、少しずつ全体像が見えてきました。
59歳からの挑戦。焦らず、一歩ずつ。
データベーススペシャリスト合格を目指して、引き続き頑張ります!

コメント