3

集合論による関係データモデルの定式化

618
1

はじめに

この記事では集合論をベースに関係データモデルの話の定式化を試みています。ネットなどにある関係データモデルの解説ではあまり数式を用いずに解説しているものが多く、数学的に曖昧なことが多いです(大学の講義もそうでした)。そこで、集合論をベースに関係データモデルの話の定式化をしようと考えました。関係データモデルのようなデータベースの話については大学の講義で習った程度の初学者なので間違えている部分がありましたら申し訳ありません。
関係データモデルの定義から2NFの定義までを書いていきたいと思います。

前提(集合論)

この記事で必要になる集合論の話を軽く紹介します。

写像の制限

X,Yを集合とし、AXとします。写像f:XYに対して、写像f|A:AY
f|A(x)=f(x)(xA)
で定義します。写像f|A:AYを写像fの集合Aへの制限と呼びます。

2つの写像f,g:{0,1,2,3}Zf(n)=n,g(n)=n2で定義します。
(f(0),f(1))=(g(0),g(1))なので、f|{0,1}=g|{0,1}が言えます。

直積

Λを集合とします。(Aλ)λΛを添字集合Λによって添字付けられた集合族とします(つまり、各λΛに対してAλを集合とします)。このとき、集合λΛAλ
λΛAλ={f:ΛλΛAλf(λ)Aλ (λΛ)}
で定義します。λΛAλ(Aλ)λΛの直積と呼びます。

直積の例

Λ={1,2},A1={3,4,5},A2={6,7}とします。このとき、λΛAλには次の6個の元(f1,...,f6)があります

λ=1λ=2
f1(λ)36
f2(λ)37
f3(λ)46
f4(λ)47
f5(λ)56
f6(λ)57

関係データモデルの定義

関係データモデル

次に定義されるP,D,Rの3つ組P,D,R を関係データモデルと呼ぶことにします。

  • P: 集合
  • D=(D(A))AP: 集合Pによって添字付けられた集合族
  • RAPD(A)

Pの元を属性(attribute)、Rの元をタプル(tuple)と呼びます。また、Rを関係(relation)と呼びます(集合論でも、直積の部分集合を関係と呼んだりしますね。)

関係データモデルの例1

P1={a,b,c}D1(A)={nZn0} (AP1)R1={tAP1D1(A)t(a)+t(b)+t(c)=3}
とすると、P1,D1,R1は関係データモデルです。
このモデルを表に表すと次のようになります。

abc
003
012
021
030
102
111
120
201
210
300

(○3つと|2つの並べ方から10通りあります。)

a,b,cは属性です。表の横の並び((0,0,3)(0,1,2)など)はタプルです。この記事の文脈に沿って正確に言うと、例えば(t(a),t(b),t(c))=(0,0,3)で定義される写像tがタプルです。

関係データモデルの例2

P2={a,b,c}D2(A)={0,1} (AP2)R2={tAP2D2(A)t(c)=max{t(a),t(b)}}
とすると、P2,D2,R2は関係データモデルです。
このモデルを表に表すと次のようになります。

abc
000
011
101
111

(ORの真理値表です。)

関係データモデルを考えていると、「2つのタプルt1,t2R2の属性aと属性cの値が等しい」ということを数式で書きたくなることがあります。もちろん(t1(a),t1(c))=(t2(a),t2(c))と書けばいいのですが、写像の制限を用いてt1|{a,c}=t2|{a,c}と簡潔に書くことができます。
例えば、t1,t2R2(t1(a),t1(b),t1(c))=(1,0,1),(t2(a),t2(b),t2(c))=(1,1,1)で定義すると、t1t2ですが、(t1(a),t1(c))=(t2(a),t2(c))なので、t1|{a,c}=t2|{a,c}が言えます。
ちなみに、t1t1|{a,c}を表で表すと次のようになります。

[t1の表]

abc
101

[t1|{a,c}の表]

ac
11

今後は写像の制限を用いた表記を使います。

関数従属性

関数従属性

P,D,Rを関係データモデルとします。
2つの属性の集合X,YPについて、「任意のt1,t2Rに対して、t1|X=t2|Xならばt1|Y=t2|Y
が成り立つとき、YXに関数従属しているといい、XYと書きます。

雑にいうと、Xに属している属性の値がすべて決まれば、Yに属している属性の値がすべて決まるということです。

余談ですが、関数従属性の定義は 二項関係から写像を定義する際に使う「右一意」 単射の定義 とよく似てますね。

関数従属性を満たす例と満たさない例

P1={a,b,c}D1(A)={nZn0} (AP1)R1={tAP1D1(A)t(a)+t(b)+t(c)=3}
で定義される、関係データモデルP1,D1,R1における関数従属性を見ていきます。

{a,b}{c}が成り立ちます。
これは雑に言うと、属性aと属性bの値が決まれば属性cの値も決まるということです。
このことについて見ていきます。
tR1とします。このとき、t(c)=3t(a)t(b)なので、t(a)の値とt(b)の値が決まればt(c)の値が決まります。
つまり、t1,t2R1に対して、(t1(a),t1(b))=(t2(a),t2(b))ならば、t1(c)=t2(c)が言えます。すなわち、{a,b}{c}が成り立ちます。

同様に、{b,c}{a}{c,a}{b}も言えます。また、{a,b}{a,b,c}(=P1)も言えます。
さらに、自明な関数従属性として、{a}{a},{a,b}{a},{a}, なども言えます(「自明な」というのはR1の定義を見なくても属性だけを見れば言えるということです。)

次に関数従属性が成り立たない例を見ていきます。{a}{b}は成り立ちません。t1,t2R1(t1(a),t1(b),t1(c))=(1,0,2),(t2(a),t2(b),t2(c))=(1,1,1)で定義すると、t1(a)=t2(a)ですが、t1(b)t2(b)です。つまり{a}{b}は成り立ちません。

次に関数従属性の性質を見ていきます。

関数従属性の性質1(反射律/推移律)

P,D,Rを関係データモデルとします。このとき次の性質が成り立ちます。

  • 反射律: 任意のXPに対してXXが成り立つ。
  • 推移律: 任意のX,Y,ZPに対してXYかつYZならばXZが成り立つ。

要するに(2P,) 前順序集合 ということです。

証明は簡単なので省略します。
反対称律(XYかつYXならばX=Y)は成り立つとは限りません。

P3={a,b}D3(A)={0,1} (AP3)R3={tAP3D3(A)t(a)=t(b)}とし、
P3,D3,R3の関係データモデルを考えます。

ab
00
11

このとき、{a}{b}{b}{a}ですが、{a}{b}です。
つまり、反対称律は成り立つとは限りません。

関数従属性の性質2

P,D,Rを関係データモデルとします。このとき次の性質が成り立ちます。

  • X,YPについて、YXが成り立つならばXYが成り立つ。
  • X,Y,ZPについて、XYが成り立つならばXZYZが成り立つ。

1つめのは反射律の一般化です。

命題1の推移律と命題2の2つの性質をあわせてアームストロングの規則と言うそうです( Wikipediaの関数従属性 )。

命題1, 2

P,D,Rを関係データモデルとします。このとき次の性質が成り立ちます。

  • X,Y,ZPについて、YXかつYZならばXZ
  • X,Y,ZPについて、ZYかつXYならばXZ

この系は推移律の特殊バージョンです。

完全関数従属性

関数従属性より強い概念である完全関数従属性を定義します。

完全関数従属性

P,D,Rを関係データモデルとします。
2つの属性の集合X,YPについて、X{XPXY}の(集合の包含関係による)極小元であるとき、YXに完全関数従属していると言います。
言い換えると、XYだが、任意のXXに対してXYではないとき、YXに完全関数従属していると言います。

極小元であるというのは、Yに属している属性の値をすべて決めるのにXの中に無駄な属性が無い(Xから一つでも属性が欠けたらYに属している属性の値をすべて決めるということができない)ということです。

XYが完全関数従属性であることを確認するためには、「任意のxXに対して、X{x}Yでない」ことを確認すれば十分です。

完全関数従属性の例

P4={a,b,c}D4(A)={nZn0} (AP4)R4={tAP4D4(A)1t(a)3,1t(b)3,t(c)=(t(a)+t(b))/2}
で定義される関係データモデルP4,D4,R4について考えます。

abc
111
121
132
211
222
232
312
322
333

{c}{a,b}に関数従属します(つまり、{a,b}{c}が成り立ちます)。さらに、{c}{a,b}に完全関数従属します。完全関数従属することを見ていきます。
{a}{c}{b}{c}は成り立ちません(もちろん{c}も成り立ちません)。よって、{c}{a,b}に完全関数従属します。

完全関数従属性でない関数従属性の例

P5={a,b,c}D5(A)={nZn0} (AP5)R5={tAP5D5(A)1t(a)3,1t(b)3,t(c)=t(b)/2}
で定義される関係データモデルP5,D5,R5について考えます。

{c}{a,b}に関数従属します(つまり、{a,b}{c}が成り立ちます)。一方、{c}{a,b}に完全関数従属はしません。{b}{c}だからです。

{c}{a,b}に関数従属する」と言うのに、属性aは冗長(属性aの値がなくても属性cの値が定まる)なので、完全ではないということです。

キー

タプルを特定する場合に、一部の属性の値だけがわかればいい場合があります。
どの属性の値を知ればいいかという議論にスーパーキーやキー候補といった概念が出てきます。

スーパーキー

P,D,Rを関係データモデルとします。
KPKPを満たすとき、Kをスーパーキーと言います。

スーパーキーKに属する属性の値がわかればタプルが一意に特定できます。特に、Pはスーパーキーです。

キー候補

P,D,Rを関係データモデルとします。
KPについて、PKに完全関数従属しているとき、Kをキー候補と言います。
別の言い方をすると、スーパーキー全体の集合の極小元をキー候補と言います。

キー候補は「ほしいタプルを特定するための無駄のない属性の集合」といえます。
キー候補は必ず1つは存在します(Pがスーパーキーなので)。ただし、キー候補が複数ある場合もあります(極小元が1つとは限らないので)。

スーパーキー・キー候補の例1

P1={a,b,c}D1(A)={nZn0} (AP1)R1={tAP1D1(A)t(a)+t(b)+t(c)=3}
で定義される、関係データモデルP1,D1,R1のスーパーキーやキー候補を考えます。

例5で見たように、{a,b}{c},{b,c}{a},{c,a}{b}が成り立ちます。関数従属性の各種性質から、{a,b}P1,{b,c}P1,{c,a}P1が成り立ちます。よって、{a,b},{b,c},{c,a}はスーパーキーです。{a,b}から属性を一つ取るとスーパーキーではなくなる({a}P1{b}P1は成り立たない)ので、{a,b}はキー候補です。同様に{b,c},{c,a}もキー候補です。

P1P1なのでP1はスーパーキーですが、{a,b}P1もスーパーキーなので、P1はキー候補ではないです。

スーパーキー・キー候補の例2

P6={a,b,c}D6(A)={nZn0} (AP6)R6={tAP6D6(A)t(a)3,t(b)3,t(c)3}
で定義される、関係データモデルP6,D6,R6のスーパーキーやキー候補を考えます。

属性a,b,cは独立しているので、{a,b}{c}などが成り立たず、P6={a,b,c}が唯一のスーパーキーです。つまり、P6={a,b,c}が唯一のキー候補です。

タプル数が1以下の場合のスーパーキー・キー候補

関係データモデルP,D,Rで、|R|1の場合(つまりタプルがまだ1つしか入っていないか、1つも入っていない場合)を考えます。

関数従属性の定義から、任意のX,YPに対して、XYが言えます。特にPが言えます。つまり、はスーパーキーで唯一のキー候補です。これは、属性が一つも決まらなくてもすべての属性の値が決まる(タプルが特定できる)ということです(タプルが1つ以下なので当たり前ですが)。

このように、タプル数が少ない場合に関数従属性やキーの話をするのは意味がないです。

第2正規形(2NF)

最後に関係データモデルで重要な概念であると思われる正規形、とくに第2正規形(2NF)の定義を定式的に与えたいと思います。

非キー属性

P,D,Rを関係データモデルとします。Kを候補キー全体の集合とします。
APについて、任意のKKに対して、AKであるとき、Aを非キー属性といいます。
つまり、(KKK)Cの元を非キー属性といいます。

第2正規形(2NF)

P,D,Rを関係データモデルとします。Kを候補キー全体の集合とします。
任意の非キー属性A、任意のKKに対して、{A}Kに完全関数従属するとき、この関係データモデルは第2正規形(2NF, 2nd Normal Form)であるといいます。

KKに対して、KPなので常にK{A}つまり{A}Kに関数従属します。よって完全であるかどうか(つまり{A}Kの真部分集合に関数従属しないかどうか)が2NFの定義では重要になります。

2NFの例1

P4={a,b,c}D4(A)={nZn0} (AP4)R4={tAP4D4(A)1t(a)3,1t(b)3,t(c)=(t(a)+t(b))/2}
で定義される関係データモデルP4,D4,R4は2NFです。2NFであることを見ていきます。

abc
111
121
132
211
222
232
312
322
333

{a,b}{c}は成り立ちます。一方、{a}{b}{b}{a}{b,c}{a}{c,a}{b}は成り立ちません。
関数従属性から、候補キーは{a,b}のみであることがわかります。また、非キー属性はcのみです。
なお、関数従属性を図に表すと次のようになります。
FD1 FD1

ここで、{c}{a,b}に完全関数従属しています({a,b}{c}は成り立っているが、{a}{c}{b}{c}は成り立っていないので)。
以上から関係データモデルP4,D4,R4は2NFであることが言えます。

2NFで無い例

P5={a,b,c}D5(A)={nZn0} (AP5)R5={tAP5D5(A)1t(a)3,1t(b)3,t(c)=t(b)/2}
で定義される関係データモデルP5,D5,R5は2NFではないです。2NFでないことを見ていきます。

{b}{c}が成り立ちます。よって、{a,b}{c}{a,b}P5が成り立ちます。つまり、{a,b}はスーパーキーです。
一方、P5{a,b}以外の属性の集合({b,c}{c,a}とそれらの部分集合)はスーパーキーではないです。
よって、キー候補は{a,b}のみです。また、非キー属性はcのみです。
なお、関数従属性を図に表すと次のようになります。
FD2 FD2

非キー属性cについて、{c}はキー候補{a,b}に完全関数従属しません。なぜならば、{b}{c}が成り立つからです。
以上から、P5,D5,R5は2NFではないです。

2NFの例2

P7={a,b,c}D7(A)={nZn0} (AP7)R7={tAP7D7(A)1t(a)3,1t(b)3,t(c)=t(b)}
で定義される関係データモデルP7,D7,R7は2NFです。

{b}{c}{b}{a}が成り立ちます。
関数従属性を図に表すと次のようになり、キー候補は{a,b},{a,c}です。
FD3 FD3
非キー属性は存在しないのでP7,D7,R7は2NFです。

2NFの定義「任意の非キー属性A、任意のKKに対して、{A}Kに完全関数従属する」でAを非キー属性に限定していますが、この例ではAを非キー属性に限定していることが有効にはたらいています。というのは「任意の非キー属性A、任意のKKに対して、{A}Kに完全関数従属する」は真だが、「任意の属性A、任意のKKに対して、{A}Kに完全関数従属する」は偽となる例になっているからです。
例えば{c}はキー候補{a,b}に(関数従属しているが)完全関数従属していないです({b}{c}なので)。よって、「任意の属性A、任意のKKに対して、{A}Kに完全関数従属する」は偽です。

おわりに

この記事では、集合論をベースに関係データモデルの定義から関数従属性、キー、2NFの定義を定式化し、その定義を満たす例と満たさない例をいくつか与えました。わかりやすさはともかく、(同内容の他の解説と比べて)数学的に厳密な定義は与えられたかと思います。
他の関係データモデルの解説にはあまりないこの記事の特徴としては、タプルを写像として与えたこと、タプルの複数の属性の値の取得に写像の制限を用いたことが挙げられます。
この記事を書いてて、集合論はなにかを記述する言語として便利だなぁと思いました。

補足

この記事では関数従属性を満たすかどうかをタプルを見て決めていますが、そもそも現実では、タプルを見て決まるものというよりかは、この関数従属性を満たすタプルしか入らないというのが正しい見方のような気がします。タプルを見て関数従属性を考えると、タプル数が少ない場合に例10のような意味のない議論が発生してしまいます。現実世界でいうと、属性として(ユニークな)IDと本名を持つ関係データベースを考えた場合、{ID}→{本名}と{本名}→{ID}と両方向の関数従属性が見えるかもしれませんが、もしかしたら今後同姓同名の人が登録して{本名}→{ID}の関数従属性が満たされなくなるかもしれません。タプルを見て関数従属性を決めると関係の状態に大きく左右されてしまいます。

そこで、関係(タプルの中身)によらずに関数従属性を定義したいです。ありえる関係をすべて集めた関係の集合R2APD(A) を定義し(RRが関係の一例です。)、P,D,R に対して関数従属性を定義してあげるという方法がありそうです(P,D,Rが関係データベースの実際のデータなのに対して、P,D,Rは関係データベースの設計に当たります)。具体的にはX,YPに対して、XYを「任意のRR, t1,t2Rに対して、t1|X=t2|Xならばt1|Y=t2|Y」と定義してあげればよさそうです。
この関数従属性の定義は 関西学院大学のデータベース論の講義資料 を参考にしました(この講義資料ではRRをインスタンスと呼んでいます)。

最後にP,D,Rの具体例をあげて終わりにしたいと思います。P={a,b}で、属性aに一意性制約(2つの異なるタプルで属性aの値が等しいものが存在しないようにする制約)があるとします。このとき、
R={RAPD(A)t1,t2R,t1(a)=t2(a)t1=t2}
と書けます。このとき、P,D,Rにおいて関数従属性{a}Pが成り立ちます。

投稿日:2020127
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

ぱるま
ぱるま
91
8546

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. はじめに
  2. 前提(集合論)
  3. 関係データモデルの定義
  4. 関数従属性
  5. 完全関数従属性
  6. キー
  7. 第2正規形(2NF)
  8. おわりに
  9. 補足