データベーススペシャリスト 2022年 午前2 問04
問題文
関係R(A, B, C, D, E)に対し、関数従属の集合W={A→{B, C}、{A, D}→E, {A, C, D}→E, B→C, C→B}がある。関数従属の集合X, Y, Zのうち、Wから冗長な関数従属をなくしたものはどれか。
X = {A→B, B→C, C→B, {A, D} →E}
Y = {A→C, B→C, C→B, {A, D} →E}
Z = {A→B, C→B, {A, C, D} →E}
選択肢
ア:Xだけ
イ:XとY(正解)
ウ:YとZ
エ:Zだけ
🔒 解説は解答すると表示されます
関数従属の最小被覆【午前2解説】
正解の理由
与えられた関数従属集合Wを単項右辺に分解し、左辺の不要属性を取り除き、さらに他の従属から導出可能な冗長な従属を消すと、最小被覆として得られる候補は次の二通りになります。
- A→B, B→C, C→B, {A,D}→E (これがX)
- A→C, B→C, C→B, {A,D}→E (これがY)
したがって選択肢のうち正しいのはXとYを含むもの、すなわち イ です。ポイントはA→CがA→BとB→Cから導出可能であれば冗長となるが、A→Bを外してA→Cを残す別の最小被覆を作ることも可能であり、最小被覆は一意ではない、という点です。
解法ステップ
-
Wを単項右辺に分解する。
- A→{B,C} をA→B, A→Cに分解。
- 他は既に単項右辺({A,D}→E, {A,C,D}→E, B→C, C→B)。
- 結果: A→B, A→C, {A,D}→E, {A,C,D}→E, B→C, C→B。
-
左辺の最小化(各従属の左辺属性が不要か検査)。
- {A,C,D}→Eは左辺のA,Dだけで十分かを確認。{A,D}→Eが既にあるため {A,C,D}→Eは冗長(左辺を減らしても別に {A,D}→Eがある)で削除可能。
- {A,D}→Eの左辺のAまたはDを外せない(単独ではEを導けない)のでそのまま。
-
従属そのものの冗長性検査(ある従属が他の従属から導出可能か)。
- A→CはA→BとB→Cがあるとき、A→BとB→CよりA→Cが導出可能:A→B, B→C ⇒ A→C。従ってA→Cは冗長となる(ただしA→Bを削除した場合は話が変わる)。
- {A,C,D}→Eは {A,D}→Eがあれば冗長(部分集合左辺が存在するため)なので削除。
- B→CとC→Bは互いに独立に必要(どちらか一方から他方は導けない)。
-
得られる最小被覆の候補
- X: A→B, B→C, C→B, {A,D}→E(上記操作で得られる標準的な最小被覆)
- 別の等価な最小被覆としてY: A→C, B→C, C→B, {A,D}→E(A→Bを削除しA→Cを残すことで成立)
- Zは {A,C,D}→Eを残しB→Cを削除しているなどでWの冗長除去として適切でない
以上から、Wの冗長を取り除いたものとして成立するのはXとYであり、選択肢としては イ が正しい。
選択肢別の誤答解説
-
ア: Xだけ
- Xは正しい最小被覆だが、YもWから冗長を取り除いた別の等価な最小被覆であるため「Xだけ」は誤り。
-
イ: XとY
- 正しい。前述の通りXとYはどちらもWと同じ意味(同じ閉包)を保ちながら冗長性を除去した最小被覆である。
-
ウ: YとZ
- Yは正しいがZは不適切。Zは {A,C,D}→Eのように左辺が冗長な従属を残しており、またB→Cを欠いているためWの冗長除去の結果として妥当でない。
-
エ: Zだけ
- 間違い。Zは既に述べたようにWからの冗長除去として正しくない(部分左辺の冗長を除去しておらず、元の依存を保持していない)。
よくある誤解
-
「最小被覆は一意である」
- 誤り。最小被覆は一意とは限らず、同値な(同じ閉包を持つ)複数の最小被覆が存在することがある(本問のXとYがその例)。
-
「右辺を単項にすればそれで終わり」
- 右辺を単項にするのは第一段階だが、その後に左辺の不要属性除去と、従属自体が他から導出可能かのチェックを必ず行う必要がある。
補足コラム
最小被覆(最小カバー、minimal cover)を求める標準アルゴリズムの流れは次の3段階です。
- 右辺を単項に分解(A→BCをA→B, A→Cに分解)。
- 各従属について左辺の各属性が不要か検査して取り除く(属性Xを外しても右辺が導出可能かをclosureで確認)。
- 従属自体が他の従属から導出可能か(冗長か)を検査し、導出可能なら削除する。
重要なのは「導出可能か」の判定に閉包(ある属性集合の属性閉包)を使う点です。たとえば属性集合 の閉包 を現在の従属集合(検査対象の従属を除いた集合)で計算し、閉包に目的の右辺が含まれればその従属は冗長です。
FAQ
Q: A→CがA→BとB→Cから導出可能なら常にA→Cを削除してよいですか?
A: Wの中にA→BとB→Cの両方が含まれている限りはA→Cを削除して差し支えありません。しかし「最小被覆は一意でない」ため、別の等価な最小被覆ではA→Bを削除してA→Cを残すこともあります。
A: Wの中にA→BとB→Cの両方が含まれている限りはA→Cを削除して差し支えありません。しかし「最小被覆は一意でない」ため、別の等価な最小被覆ではA→Bを削除してA→Cを残すこともあります。
Q: なぜ {A,C,D}→Eは {A,D}→Eがあると冗長なのですか?
A: 左辺が部分集合になっている従属が存在する場合、より大きな左辺を持つ従属は同じ結果を与えるなら不要です。{A,D} が {A,C,D} の部分集合で、{A,D}→Eがあれば {A,C,D}→Eは常に導出可能(冗長)です。
A: 左辺が部分集合になっている従属が存在する場合、より大きな左辺を持つ従属は同じ結果を与えるなら不要です。{A,D} が {A,C,D} の部分集合で、{A,D}→Eがあれば {A,C,D}→Eは常に導出可能(冗長)です。
Q: 最小被覆を求める際に注意すべき点は?
A: 手順を順番どおりに行うこと(右辺単項化→左辺削除→従属削除)。順序や途中での削除判断を誤ると誤った被覆に至ることがあります。
A: 手順を順番どおりに行うこと(右辺単項化→左辺削除→従属削除)。順序や途中での削除判断を誤ると誤った被覆に至ることがあります。
関連キーワード: 関数従属、最小被覆、属性閉包、冗長性除去、部分関数従属

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

