リレーショナルデータベースデザイン
リレーションスキーマR(A1,A2,…,Al,B1,B2,…,Bm,C1,C2,…,Cn)に関数従属性(FD)
A1A2…Al → B1B2…Bmが存在するとは次の条件が成立するときをいう:
RをRの任意のインスタンスとするとき
(∀t,t' ∈ R)(t[A1A2…Al]=t'[B1B2…Bm]⇒t[A1A2…Al]=t'[B1B2…Bm])
(⇒は論理的含意(logical implication)を表す記号である。)
これはつまり、A1A2…Al → B1B2…Bmという関数従属性が存在すれば、 任意の2つのタプルtとt'で、それらのA1A2…Al値の等しければ、 それらのB1B2…Bm値も等しくなるということである。Rの任意のインスタンスRが与えられると、 RのA1A2…Al値のなす集合とB1B2…Bm値のなす集合の間に関数関係が成立するということである。
A1A2…Al → B1B2…Bmのとき、A1A2…AlはB1B2…Bmを関数的に決定する(functionally determine)といい、 B1B2…BmがA1A2…Alに関数的に従属する(functionally depend)という。このとき、 A1,A2,…,Alを決定子(determinant)、B1,B2,…,Bmを被決定子(resultant)という。 また、{B1B2…Bm} が空集合か{A1A2…Al}の部分集合になっているとき、自明な関数従属性(trivial FD)という。
図1.リレーション 注文
図1のリレーション注文のリレーションスキーマには多くの関数従属性が存在している。
顧客が同一商品を重複して注文できないとすると、次のような関数従属性が定義される。
f1:{顧客名,商品名}→数量
f2:商品名→単価
f3:{商品名,数量}→金額
f4:{数量,単価}→金額
f5:{数量,金額}→単価
f6:{単価,金額}→数量
説明を加えると、関数従属性f1はリレーション注文では顧客名(西友の場合)を決めても、数量は
10であったり5であったらして関数的には一意には決まらず、同様に商品名を決めても数量は
4であったり10であったりして一意に決まらない。そこで顧客名と商品名の組(例えば西友とテレビ)を決めれば
その注文数は10と一意に決まる。
関数従属性 X → Y で、Xの任意の真部分集合X'について、X' → Y は成立しないとき、YはXに完全関数従属 (fully functionally dependent)しているという。
リレーションの情報無損失分解の必要かつ十分条件は多値属性の存在だったことから、関数従属性の存在は リレーションスキーマの情報無損失分解の十分条件になる。
リレーションスキーマR(A1,A2,…,Al,B1,B2,…,Bm,C1,C2,…,Cn)
の任意のインスタンスRがその2つの射影R[A1A2…AlB1B2…Bml]とR[A1A2…AlC1C2…Cn]
に情報無損失分解されるための十分条件は、Rに関数従属性
A1,A2,…,Al → B1,B2,…,Bm
が存在することである。