応用情報技術者 2012年 秋期 午前2 問26
問題文
六つのタプルから成る関係Rの単一の属性間において成立する全ての関数従属性を挙げたものはどれか。ここで、X→Y は、XがY を関数的に決定することを表す。

選択肢
ア:A→B
イ:A→C, C→A
ウ:A→B, A→C, C→A, C→B(正解)
エ:A→B, A→C, B→C, C→A, C→B
🔒 解説は解答すると表示されます
単属性の関数従属性【午前2解説】
正解の理由
与えられた6行のタプルを見ると、Aの各値(300, 400, 500)はそれぞれ対応するBとCの値が常に同じです(例:A=300 → B=阿部商店, C=3)。したがって A→B と A→C は成立します。一方、Cの各値(3, 2, 1)もそれぞれ一意にAおよびBを決定します(例:C=3 → A=300, B=阿部商店)。したがって C→A と C→B も成立します。これら4つの単属性間の関数従属性をすべて含む選択肢が ウ です。
(補助的に示す代表対応:A=300 ⇨ (B=阿部商店, C=3)、A=400 ⇨ (B=鈴木商店, C=2)、A=500 ⇨ (B=鈴木商店, C=1)。同様に C=3⇨(A=300,B=阿部商店)、C=2⇨(A=400,B=鈴木商店)、C=1⇨(A=500,B=鈴木商店)。)
(補助的に示す代表対応:A=300 ⇨ (B=阿部商店, C=3)、A=400 ⇨ (B=鈴木商店, C=2)、A=500 ⇨ (B=鈴木商店, C=1)。同様に C=3⇨(A=300,B=阿部商店)、C=2⇨(A=400,B=鈴木商店)、C=1⇨(A=500,B=鈴木商店)。)
解法ステップ
- 「左辺Xの値が同じ行間で右辺Yが常に同じか」を確認する(単属性 X→Y の定義)。
- 各属性を左辺にして、同値クラスごとに右辺の値が一意かどうかをチェックする:
- AでグルーピングしてB,Cを確認
- BでグルーピングしてA,Cを確認
- CでグルーピングしてA,Bを確認
- すべてのX→Yが成立する場合、それを解答リストに入れる。
- 問題は「単一の属性間」に限定しているので、左右とも属性1個ずつのみを検討する。
簡単なアルゴリズム例(概念):
- 各属性値ごとに、対応する右辺値の集合を作る
- その集合が1要素のみならば X→Y が成立
参考となる簡単なコード例(データ検査用):
rows = [
(300,"阿部商店",3),
(300,"阿部商店",3),
(400,"鈴木商店",2),
(400,"鈴木商店",2),
(500,"鈴木商店",1),
(500,"鈴木商店",1),
]
attrs = ["A","B","C"]
# index mapping A:0,B:1,C:2
def single_attr_fds(rows):
fds = []
for i,x in enumerate(attrs):
for j,y in enumerate(attrs):
if i==j: continue
mapping = {}
ok = True
for r in rows:
key = r[i]
val = r[j]
if key in mapping:
if mapping[key] != val:
ok = False
break
else:
mapping[key] = val
if ok:
fds.append(f"{x}→{y}")
return fds
print(single_attr_fds(rows))
# 出力: ['A→B', 'A→C', 'C→A', 'C→B']
選択肢別の誤答解説
- ア: A→B のみ
- 誤り。A→C も成立するため不完全です(A=300→C=3 等の一意対応あり)。
- イ: A→C, C→A
- 誤り。これは A と C の相互決定(A↔C)を正しく含むものの、C→B と A→B を欠いており不完全です。イは「A→C と C→A は成立する」ことは示せますが、C→B(例:C=2→B=鈴木商店, C=1→B=鈴木商店 など)や A→B(例:A=400→B=鈴木商店)を見落としています。
- ウ: A→B, A→C, C→A, C→B
- 正解。上で示したように各対応がすべて一意であるため、これら4つの単属性従属性が成立します。
- エ: A→B, A→C, B→C, C→A, C→B
- 誤り。B→C は成立しません。具体的には B=鈴木商店 のとき C が 2 と 1 の両方をとるため、BからCは一意に定まらない(B→C を否定)。
よくある誤解
- 同一の行が重複しているとき「重複で関係がゆがむ」と考える誤り:重複行は情報を増やしませんが、同じキー値に対して右辺が同じである限り FD の成立を妨げません。
- 矢印表記の曖昧さ:例えば「AC」とだけ書くと複合属性か組み合わせを示すのか不明瞭です。本問は単一属性間の従属性なので、必ず A→C のように矢印で明示して確認する。
- 相互従属性(A→C かつ C→A)を見つけると「AとCは同一属性扱い」と早合点する:確かに同値関係(同値クラス)として扱えるが、スキーマ設計でまとめるかどうかは別の判断(正規化の観点)になります。
補足コラム
- A→B と C→A がともに成立しているとき、推移性から C→B も成立します(C→A と A→B があると C→B が導かれる)。本問では実際に C→B がデータから直接確認できます。つまり成立する従属性は部分的な導出関係も考慮すると整合します。
- 単属性の全列挙は小規模データでは手作業で十分ですが、実務ではスクリプトで全組合せを検査して候補を抽出することが多いです(上のコード参照)。
FAQ
Q1: 重複行があると FD 判定はどう変わりますか?
A1: 重複行自体は判定を変えません。重要なのは同じ左辺値について右辺値が常に同じかどうかだけです。
A1: 重複行自体は判定を変えません。重要なのは同じ左辺値について右辺値が常に同じかどうかだけです。
Q2: 問題文の「単一の属性間」は左右とも1属性だけですか?
A2: はい。本設問は左辺・右辺ともに単一属性(1個)の従属性のみを列挙することを求めています。複合属性(例:A,C→B)は対象外です。
A2: はい。本設問は左辺・右辺ともに単一属性(1個)の従属性のみを列挙することを求めています。複合属性(例:A,C→B)は対象外です。
Q3: 相互従属性があると属性を統合すべきですか?
A3: 正規化観点では、相互従属性(A↔C)は冗長性のサインになり得ますが、統合が常に正解とは限りません。設計目的に応じて判断します。
A3: 正規化観点では、相互従属性(A↔C)は冗長性のサインになり得ますが、統合が常に正解とは限りません。設計目的に応じて判断します。
関連キーワード: 関数従属性, 単属性依存, 同値属性, FDの検証, 正規化, 属性間の決定関係

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

