基本情報技術者 2017年 春期 午前(科目A) 問25
問題文
属性aの値が決まれば属性bの値が一意に定まることを、a → bで表す。例えば、社員番号が決まれば社員名が一意に定まるということの表現は、社員番号→社員名である。この表記法に基づいて、図の関係が成立している属性a〜jを、関係データベース上の三つのテーブルで定義する組合せとして、適切なものはどれか。

選択肢
ア:テーブル1 (a)
テーブル2 (b, c, d, e)
テーブル3 (f, g, h, i, j)
イ:テーブル1 (a, b, c, d, e)
テーブル2 (b, f, g, h)
テーブル3 (e, i, j)(正解)
ウ:テーブル1 (a, b, f, g, h)
テーブル2 (c, d)
テーブル3 (e, i, j)
エ:テーブル1 (a, c, d)
テーブル2 (b, f, g, h)
テーブル3 (e, i, j)
🔒 解説は解答すると表示されます
関係分解と関数従属性の保存【午前解説】
正解の理由
図から読み取れる関数従属性は次のとおりです:
a → b, c, d, e / b → f / c → g / d → h / e → i, j。これらを三つのテーブルに分割したとき、各関数従属性 X → Y がいずれかのテーブル内に X∪Y として含まれる(あるいはテーブルごとの射影から導出できる)ならば「FD(関数従属性)保存」を満たします。与えられた選択肢の中で、イ(テーブル1: a,b,c,d,e / テーブル2: b,f,g,h / テーブル3: e,i,j)は
a → b, c, d, e / b → f / c → g / d → h / e → i, j。これらを三つのテーブルに分割したとき、各関数従属性 X → Y がいずれかのテーブル内に X∪Y として含まれる(あるいはテーブルごとの射影から導出できる)ならば「FD(関数従属性)保存」を満たします。与えられた選択肢の中で、イ(テーブル1: a,b,c,d,e / テーブル2: b,f,g,h / テーブル3: e,i,j)は
- a → b,c,d,e をテーブル1で直接保持する
- b → f をテーブル2で直接保持する
- e → i,j をテーブル3で直接保持する
という点で多くの元の従属性をそのまま保持します。ただし、c → g と d → h はそれぞれ左辺と右辺が異なるテーブルに分かれており(c はテーブル1、g はテーブル2/d はテーブル1、h はテーブル2)、テーブル単独の射影からはこれらを導出できません。したがって、完全な意味で「すべての元のFDを保存する」分解とは言えませんが、与えられた選択肢の中で最も多くのFDを個別テーブル上で保持しているのが イ であることが理由です。
解法ステップ
- 図から正しい関数従属性群 F を列挙する(図に忠実に)
F = { a → b,c,d,e ; b → f ; c → g ; d → h ; e → i,j } - 各選択肢の三つのテーブル(関係)について、それぞれの属性集合を確認する。
- 各関係 Rk に対して、元の FD 集合 F が Rk の属性集合に含まれる場合、その FD はそのテーブルで「直接」保持される(射影に含まれる)。
例えば、R = {a,b,c,d,e} なら a → b,c,d,e は R に含まれる。 - 全テーブルの射影の和(各テーブルで直接保持される FD の合計)で元の F のすべてが導けるか(含まれるか)をチェックする。
- 含まれれば FD 保存を満たす
- 含まれなければ FD 保存は満たさない
- 各選択肢について上記を適用し、どれが最も多くの FD を保存するか(あるいは完全に保存するか)を判定する。
具体的に イ の場合の射影(主要なもの):
- R1 = {a,b,c,d,e} の射影 Π_R1(F) に含まれる FD: a → b,c,d,e
- R2 = {b,f,g,h} の射影 Π_R2(F) に含まれる FD: b → f
- R3 = {e,i,j} の射影 Π_R3(F) に含まれる FD: e → i,j 合成すると a→b,c,d,e, b→f, e→i,j は保持されるが、c→g, d→h は含まれない。
選択肢別の誤答解説
- ア: R1={a}, R2={b,c,d,e}, R3={f,g,h,i,j}
- a → b,c,d,e をどのテーブルにも丸ごと含めていないため主要な FD が保持されない。b→f や e→i,j のような従属性も分散しており保存されない。
- イ: R1={a,b,c,d,e}, R2={b,f,g,h}, R3={e,i,j}
- 長所:a→b,c,d,e, b→f, e→i,j を各テーブルで直接保持するため、元の FD の多くを保持する。
- 短所:c→g と d→h はそれぞれ c,d がテーブル1、g,h がテーブル2 に分かれており、個別テーブルでは保持できない(したがって完全な FD 保存ではない)。
- ウ: R1={a,b,f,g,h}, R2={c,d}, R3={e,i,j}
- a→b,c,d,e の左右が分割されており、a→c,d,e を保持できない。c→g や d→h も保持できない。
- エ: R1={a,c,d}, R2={b,f,g,h}, R3={e,i,j}
- a→b,e が分断され a→b,c,d,e の完全保持ができない。b→f は R2 にあるが c→g,d→h は分割のため保持されない。
よくある誤解
- 「右辺の属性が同じテーブルにあれば良い」だけでは不十分
- 左辺と右辺が同じ関係に含まれていないと、その FD を一つのテーブルでチェックできない(射影に現れない)。
- 「a→... があれば a を含むテーブルのみ確認すればよい」と考える誤り
- 中間的な推移(例えば a→c と c→g の組合せ)を期待して FD 保存と判断することはできない。FD 保存は個別テーブルの射影だけで元の FD が再現できるかを問う。
補足コラム
- FD 保存(FD-preserving decomposition)の意義:分解後も元の関数従属性を個別テーブル上で検査・強制できることは、データ整合性を効率よく保つ上で重要です。保存されない従属性は、アプリケーション側での追加チェックや結合操作による検証が必要になります。
- ロスレス分解との違い:分解がロスレスであること(元の関係に再結合して戻せる)は別条件であり、FD 保存と必ずしも一致しません。実務では双方を満たす分解を目指します。
FAQ
Q1: FD 保存の判定はどうやって機械的に行う?
A1: 各テーブル Rk に対して元の FD 集合 F の射影 Π_Rk(F) を計算し、その和(Π_R1(F) ∪ Π_R2(F) ∪ ...)が元の F を含意するか(全ての元の FD を導出できるか)をチェックします。射影の計算は属性閉包を用いるのが一般的です。
A1: 各テーブル Rk に対して元の FD 集合 F の射影 Π_Rk(F) を計算し、その和(Π_R1(F) ∪ Π_R2(F) ∪ ...)が元の F を含意するか(全ての元の FD を導出できるか)をチェックします。射影の計算は属性閉包を用いるのが一般的です。
Q2: 射影で導出できない FD は必ず破棄されるのか?
A2: 射影で導出できないFDは、その分解だけでは個別テーブル上で強制できません。必要なら追加のトリガやアプリケーション側のチェック、あるいは別の分解を検討します。
A2: 射影で導出できないFDは、その分解だけでは個別テーブル上で強制できません。必要なら追加のトリガやアプリケーション側のチェック、あるいは別の分解を検討します。
Q3: 与えられた選択肢の中で最善はどれか?
A3: 与えられた選択肢の中では、イ が最多の原始 FD を個別テーブル上で直接保持します。ただし c→g と d→h は保持されないため、完全な FD 保存を満たす解とは言えません。
A3: 与えられた選択肢の中では、イ が最多の原始 FD を個別テーブル上で直接保持します。ただし c→g と d→h は保持されないため、完全な FD 保存を満たす解とは言えません。
関連キーワード: 関数従属性、射影(Projection)、FD保存、分解(正規化)、損失なし結合、属性閉包(属性の閉包)

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

