関数従属性
関数従属性 (かんすうじゅうぞくせい、FD、英: functional dependency) は、コンピュータの関係データベースにおける関係(表)の2つの属性集合間で、一方の属性集合の値(の集合)がもう一方の属性集合の値(の集合)を関数的に決定するという、制約である。
R を関係として、X と Y をそれぞれ R の属性の集合とすると、X の各々の値がただ一つの Y の値に関連づけられる場合かつその場合に限り、X は Y を「関数的に決定する」という。 X が Y を関数的に決定することを、X → Y と記述する。 慣例として、X → Y のとき、X を決定項、Y を従属項と呼ぶ。 X → Y のとき、ある組(タプル、行)があり、その X の値の集合があるとき、対応する Y の値の集合が決定される。 簡単のために、R を関係とし、X と Y をそれぞれ R の属性の集合とすると、X → Y は X が Y の各々の値を関数的に決定すると述べることができる。 以上のことから候補キーは、その関係においてすべての属性値を関数的に決定する最小の属性集合である。
- (注意: 「関数従属性」で議論される文脈での「関数」は一意的に決定する関数である)
関数従属性 FD: X → Y は、Y が X の部分集合である場合、自明な関数従属性であると呼ばれる。
多値従属性は、関数従属性を一般化した概念と位置づけることができる。
関数従属性の決定は、関係モデルとデータベースの正規化と非正規化においてデータベース設計(データモデリング)の重要な部分である。
関数従属性は、属性の定義域(ドメイン)とともに、制約を構成するべく選択される。 ここでいう制約とは、利用者の問題領域にとって不適切なデータをシステムからできる限り排除するであろう制約である。
例えば、自動車とそのエンジンの排気量を調べるシステムを設計することを考える。 各々の自動車には一意に車台番号がわりふられている。 車台番号 → 排気量 と記述することができる。 なぜなら、自動車のエンジンが2つ以上の排気量をもつことは不適切であるからである(この例では自動車はただ一つのエンジンをもつと仮定する)。 しかし 排気量 → 車台番号 と記述することは正しくない。 なぜなら同じ排気量である自動車はたくさんあるからである。
関数従属性により、排気量という属性は候補キーが車台番号である関係(表)の中に存在することが示唆される。 しかしながら、この示唆は必ずしも適切ではない。 例えば、この関数従属性は推移的な関数従属性の結果として現れるからである。
- 車台番号 → 車両モデル, 車両モデル → 排気量
このため(第3正規形以上に)正規化された関係においては、排気量属性は候補キーが車台番号である関係の中には存在しない。
関数従属性の既約の集合
[編集]関数従属性の集合 S は、次の3つの特性をもつとき既約である。
- S の関数従属性の各々の右側(従属項)の集合はただ一つの属性をもつ。
- S の関数従属性の各々の左側(決定項)の集合は既約である。これは左側の属性集合からどの属性を除いても S の内容が変わることを意味する(Sはなんらかの情報を失うことを意味する)。
- S のどの関数従属性を除いても S の内容が変わる(Sはなんらかの情報を失う)。
関数従属性の特性
[編集]X、Y、Z を関係 R の属性の集合とすると、関数従属性のいくつかの特性を導き出すことができる。 最も重要な特性はアームストロングの規則であり、データベースの正規化において使われる。
- 部分集合の特性(反射の規則): Y が X の部分集合であるならば、X → Y
- 増加(増加の規則): X → Y であるならば、XZ → YZ
- 推移性(推移の規則): X → Y かつ Y → Z であるならば、X → Z
前述の規則から、2次的な規則を導き出すことができる。
- 結合: X → Y であり X → Z であるならば、X → YZ
- 分解: X → YZ であるならば、X → Y かつ X → Z
- 疑似的な推移性: X → Y かつ YZ → W であるならば、XZ → W