システムアーキテクト 2019年 午前2 問21
問題文
関数従属(A、B)つCが完全関数従属性を満たすための条件はどれか。
選択肢
ア:{A, B} → B又は{A, B} → Aが成立していること
イ:A → B → C 又はB → A → Cが成立していること
ウ:A → C及びB → Cのいずれも成立しないこと(正解)
エ:C → {A, B}が成立しないこと
🔒 解説は解答すると表示されます
完全関数従属性【午前2解説】
正解の理由
関数従属 が「完全関数従属性」であるとは、左辺の複合属性 のどの真部分集合(すなわち または )も右辺 を決定しないことを意味します。したがって、A→C も B→C も成立しない場合にのみ、 は完全関数従属性となります。これが満たされている選択肢は ウ です。
解法ステップ
- まず前提として が成立していることを確認(問題文の条件)。
- 次に、 の各真部分集合(ここでは と )について、それぞれが を決定するかを調べる。
- もし または のいずれかが成立すれば、 は複合キーの一部により決定されるため「部分関数従属」となり、完全関数従属性ではない。
- どちらも成立しなければ「完全関数従属性」である。
- 問題の選択肢が上記の条件を満たすかを当てはめる。
実務的には「全ての真部分集合について従属が成り立たないこと」を確認すればよい、という点がポイントです。
選択肢別の誤答解説
-
ア: {A, B} → B 又は {A, B} → A が成立していること
これは自明従属(trivial dependency)に相当します。左辺に B が含まれているため {A,B}→B は当然成立しますが、これは従属の性質として当たり前であり、完全性(真部分集合が右辺を決定しないこと)については何も示していません。したがってアは「完全であること」の条件になりません。 -
イ: A → B → C 又は B → A → C が成立していること
ここは連鎖(例えば A→B と B→C)を意味すると解釈できます。もし A→B と B→C が成立すれば、推移律により A→C が成立します。すると複合左辺 の真部分集合 が既に を決定しているので、完全関数従属性の要件を満たさなくなります。したがってイは不適切です。 -
ウ: A → C 及び B → C のいずれも成立しないこと
これはちょうど「どの真部分集合も を決定しない」という定義と一致します。従って完全関数従属性の条件を満たします。 -
エ: C → {A, B} が成立しないこと
逆方向の従属( が を決定しないこと)は、 が完全であるかどうかとは無関係です。完全性は左辺の最小性に関する条件であり、右辺から左辺への従属の有無を要求するものではありません。
よくある誤解
-
「{A,B}→A や {A,B}→B が成立しているなら部分従属だ」と勘違いする
実際にはこれらは自明従属であり、部分関数従属(真部分集合が右辺を決定すること)とは別概念です。真に問題となるのは や のように、部分集合が右辺を決定する場合です。 -
推移的な従属を見落とす
A→B と B→C があるときは A→C が成り立ち、これが部分関数従属を引き起こす可能性があります。直接の A→C の記述がなくても推移で成立する場合があることに注意します。 -
完全関数従属性と候補キー/正規化条件を混同する
完全関数従属性は「複合キーの各部分が非キー属性を決定しない」ことの定義であり、これを満たすかは 2NF 等の正規形判定で重要ですが、完全性そのものはキーであるかどうか(候補キー等)を直接主張するものではありません。
補足コラム
- 定義(形式的): が完全関数従属性であるとは、 が成立し、かつ任意の真部分集合 について が成立することを言います。
- 正規化との関係: 2NF は「非キー属性が候補キーの一部に対して部分関数従属していないこと」を要求します。従って複合キーを持つテーブル設計の際に、部分関数従属の検出が重要です。
- 判定の自動化: 属性閉包(attribute closure)を用いると、ある部分集合 が を決定するか()を効率的に判定できます。候補集合のすべての真部分集合について閉包を計算すれば完全性の確認ができます。
FAQ
Q. 自明従属とは何ですか?
A. 左辺に右辺の属性が含まれている場合の従属(例: )を自明従属と言います。定義上成立しますが有用な意味での「決定」の情報は与えません。
A. 左辺に右辺の属性が含まれている場合の従属(例: )を自明従属と言います。定義上成立しますが有用な意味での「決定」の情報は与えません。
Q. 推移律で間接的に左辺の部分が右辺を決める場合はどう扱う?
A. 間接的(推移的)に が成立するなら、それは部分関数従属と同様に扱います。直接の矢印がなくても推移で導出される従属を見落とさないように属性閉包等で確認します。
A. 間接的(推移的)に が成立するなら、それは部分関数従属と同様に扱います。直接の矢印がなくても推移で導出される従属を見落とさないように属性閉包等で確認します。
Q. 完全関数従属性を満たす例を教えてください。
A. 例: 学籍番号(StudentID)と 科目コード(CourseID)から成績(Grade)が決まるが、学籍番号のみまたは科目コードのみでは成績を決められない場合は は完全関数従属性です。
A. 例: 学籍番号(StudentID)と 科目コード(CourseID)から成績(Grade)が決まるが、学籍番号のみまたは科目コードのみでは成績を決められない場合は は完全関数従属性です。
関連キーワード: 部分関数従属、自明従属、属性閉包、正規化、推移律

\ せっかくなら /
システムアーキテクトを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

