はじめに
この記事では集合論をベースに関係データモデルの話の定式化を試みています。ネットなどにある関係データモデルの解説ではあまり数式を用いずに解説しているものが多く、数学的に曖昧なことが多いです(大学の講義もそうでした)。そこで、集合論をベースに関係データモデルの話の定式化をしようと考えました。関係データモデルのようなデータベースの話については大学の講義で習った程度の初学者なので間違えている部分がありましたら申し訳ありません。
関係データモデルの定義から2NFの定義までを書いていきたいと思います。
前提(集合論)
この記事で必要になる集合論の話を軽く紹介します。
写像の制限
を集合とし、とします。写像に対して、写像を
で定義します。写像を写像の集合への制限と呼びます。
直積
を集合とします。を添字集合によって添字付けられた集合族とします(つまり、各に対してを集合とします)。このとき、集合を
で定義します。をの直積と呼びます。
直積の例
とします。このとき、には次の6個の元()があります
関係データモデルの定義
関係データモデル
次に定義されるの3つ組 を関係データモデルと呼ぶことにします。
の元を属性(attribute)、の元をタプル(tuple)と呼びます。また、を関係(relation)と呼びます(集合論でも、直積の部分集合を関係と呼んだりしますね。)
関係データモデルの例1
、、
とすると、は関係データモデルです。
このモデルを表に表すと次のようになります。
| | |
0 | 0 | 3 |
0 | 1 | 2 |
0 | 2 | 1 |
0 | 3 | 0 |
1 | 0 | 2 |
1 | 1 | 1 |
1 | 2 | 0 |
2 | 0 | 1 |
2 | 1 | 0 |
3 | 0 | 0 |
(○3つと|2つの並べ方から10通りあります。)
は属性です。表の横の並び(やなど)はタプルです。この記事の文脈に沿って正確に言うと、例えばで定義される写像がタプルです。
関係データモデルの例2
、、
とすると、は関係データモデルです。
このモデルを表に表すと次のようになります。
(ORの真理値表です。)
関係データモデルを考えていると、「2つのタプルの属性と属性の値が等しい」ということを数式で書きたくなることがあります。もちろんと書けばいいのですが、写像の制限を用いてと簡潔に書くことができます。
例えば、をで定義すると、ですが、なので、が言えます。
ちなみに、とを表で表すと次のようになります。
[の表]
[の表]
今後は写像の制限を用いた表記を使います。
関数従属性
関数従属性
を関係データモデルとします。
2つの属性の集合について、「任意のに対して、ならば」
が成り立つとき、はに関数従属しているといい、と書きます。
雑にいうと、に属している属性の値がすべて決まれば、に属している属性の値がすべて決まるということです。
余談ですが、関数従属性の定義は
二項関係から写像を定義する際に使う「右一意」
や
単射の定義
とよく似てますね。
関数従属性を満たす例と満たさない例
、、
で定義される、関係データモデルにおける関数従属性を見ていきます。
が成り立ちます。
これは雑に言うと、属性と属性の値が決まれば属性の値も決まるということです。
このことについて見ていきます。
とします。このとき、なので、の値との値が決まればの値が決まります。
つまり、に対して、ならば、が言えます。すなわち、が成り立ちます。
同様に、やも言えます。また、も言えます。
さらに、自明な関数従属性として、 なども言えます(「自明な」というのはの定義を見なくても属性だけを見れば言えるということです。)
次に関数従属性が成り立たない例を見ていきます。は成り立ちません。をで定義すると、ですが、です。つまりは成り立ちません。
次に関数従属性の性質を見ていきます。
関数従属性の性質1(反射律/推移律)
を関係データモデルとします。このとき次の性質が成り立ちます。
- 反射律: 任意のに対してが成り立つ。
- 推移律: 任意のに対してかつならばが成り立つ。
要するには
前順序集合
ということです。
証明は簡単なので省略します。
反対称律(かつならば)は成り立つとは限りません。
、、とし、
の関係データモデルを考えます。
このとき、、ですが、です。
つまり、反対称律は成り立つとは限りません。
関数従属性の性質2
を関係データモデルとします。このとき次の性質が成り立ちます。
- について、が成り立つならばが成り立つ。
- について、が成り立つならばが成り立つ。
1つめのは反射律の一般化です。
命題1の推移律と命題2の2つの性質をあわせてアームストロングの規則と言うそうです(
Wikipediaの関数従属性
)。
命題1, 2
を関係データモデルとします。このとき次の性質が成り立ちます。
この系は推移律の特殊バージョンです。
完全関数従属性
関数従属性より強い概念である完全関数従属性を定義します。
完全関数従属性
を関係データモデルとします。
2つの属性の集合について、がの(集合の包含関係による)極小元であるとき、はに完全関数従属していると言います。
言い換えると、だが、任意のに対してではないとき、はに完全関数従属していると言います。
極小元であるというのは、に属している属性の値をすべて決めるのにの中に無駄な属性が無い(から一つでも属性が欠けたらに属している属性の値をすべて決めるということができない)ということです。
が完全関数従属性であることを確認するためには、「任意のに対して、でない」ことを確認すれば十分です。
完全関数従属性の例
、、
で定義される関係データモデルについて考えます。
| | |
1 | 1 | 1 |
1 | 2 | 1 |
1 | 3 | 2 |
2 | 1 | 1 |
2 | 2 | 2 |
2 | 3 | 2 |
3 | 1 | 2 |
3 | 2 | 2 |
3 | 3 | 3 |
はに関数従属します(つまり、が成り立ちます)。さらに、はに完全関数従属します。完全関数従属することを見ていきます。
やは成り立ちません(もちろんも成り立ちません)。よって、はに完全関数従属します。
完全関数従属性でない関数従属性の例
、、
で定義される関係データモデルについて考えます。
はに関数従属します(つまり、が成り立ちます)。一方、はに完全関数従属はしません。だからです。
「はに関数従属する」と言うのに、属性は冗長(属性の値がなくても属性の値が定まる)なので、完全ではないということです。
キー
タプルを特定する場合に、一部の属性の値だけがわかればいい場合があります。
どの属性の値を知ればいいかという議論にスーパーキーやキー候補といった概念が出てきます。
スーパーキー
を関係データモデルとします。
がを満たすとき、をスーパーキーと言います。
スーパーキーに属する属性の値がわかればタプルが一意に特定できます。特に、はスーパーキーです。
キー候補
を関係データモデルとします。
について、がに完全関数従属しているとき、をキー候補と言います。
別の言い方をすると、スーパーキー全体の集合の極小元をキー候補と言います。
キー候補は「ほしいタプルを特定するための無駄のない属性の集合」といえます。
キー候補は必ず1つは存在します(がスーパーキーなので)。ただし、キー候補が複数ある場合もあります(極小元が1つとは限らないので)。
スーパーキー・キー候補の例1
、、
で定義される、関係データモデルのスーパーキーやキー候補を考えます。
例5で見たように、が成り立ちます。関数従属性の各種性質から、が成り立ちます。よって、はスーパーキーです。から属性を一つ取るとスーパーキーではなくなる(とは成り立たない)ので、はキー候補です。同様にもキー候補です。
なのではスーパーキーですが、もスーパーキーなので、はキー候補ではないです。
スーパーキー・キー候補の例2
、、
で定義される、関係データモデルのスーパーキーやキー候補を考えます。
属性は独立しているので、などが成り立たず、が唯一のスーパーキーです。つまり、が唯一のキー候補です。
タプル数が1以下の場合のスーパーキー・キー候補
関係データモデルで、の場合(つまりタプルがまだ1つしか入っていないか、1つも入っていない場合)を考えます。
関数従属性の定義から、任意のに対して、が言えます。特にが言えます。つまり、はスーパーキーで唯一のキー候補です。これは、属性が一つも決まらなくてもすべての属性の値が決まる(タプルが特定できる)ということです(タプルが1つ以下なので当たり前ですが)。
このように、タプル数が少ない場合に関数従属性やキーの話をするのは意味がないです。
第2正規形(2NF)
最後に関係データモデルで重要な概念であると思われる正規形、とくに第2正規形(2NF)の定義を定式的に与えたいと思います。
非キー属性
を関係データモデルとします。を候補キー全体の集合とします。
について、任意のに対して、であるとき、を非キー属性といいます。
つまり、の元を非キー属性といいます。
第2正規形(2NF)
を関係データモデルとします。を候補キー全体の集合とします。
任意の非キー属性、任意のに対して、がに完全関数従属するとき、この関係データモデルは第2正規形(2NF, 2nd Normal Form)であるといいます。
に対して、なので常につまりはに関数従属します。よって完全であるかどうか(つまりがの真部分集合に関数従属しないかどうか)が2NFの定義では重要になります。
2NFの例1
、、
で定義される関係データモデルは2NFです。2NFであることを見ていきます。
| | |
1 | 1 | 1 |
1 | 2 | 1 |
1 | 3 | 2 |
2 | 1 | 1 |
2 | 2 | 2 |
2 | 3 | 2 |
3 | 1 | 2 |
3 | 2 | 2 |
3 | 3 | 3 |
は成り立ちます。一方、や、、は成り立ちません。
関数従属性から、候補キーはのみであることがわかります。また、非キー属性はのみです。
なお、関数従属性を図に表すと次のようになります。
FD1
ここで、はに完全関数従属しています(は成り立っているが、やは成り立っていないので)。
以上から関係データモデルは2NFであることが言えます。
2NFで無い例
、、
で定義される関係データモデルは2NFではないです。2NFでないことを見ていきます。
が成り立ちます。よって、やが成り立ちます。つまり、はスーパーキーです。
一方、と以外の属性の集合(ととそれらの部分集合)はスーパーキーではないです。
よって、キー候補はのみです。また、非キー属性はのみです。
なお、関数従属性を図に表すと次のようになります。
FD2
非キー属性について、はキー候補に完全関数従属しません。なぜならば、が成り立つからです。
以上から、は2NFではないです。
2NFの例2
、、
で定義される関係データモデルは2NFです。
やが成り立ちます。
関数従属性を図に表すと次のようになり、キー候補はです。
FD3
非キー属性は存在しないのでは2NFです。
2NFの定義「任意の非キー属性、任意のに対して、がに完全関数従属する」でを非キー属性に限定していますが、この例ではを非キー属性に限定していることが有効にはたらいています。というのは「任意の非キー属性、任意のに対して、がに完全関数従属する」は真だが、「任意の属性、任意のに対して、がに完全関数従属する」は偽となる例になっているからです。
例えばはキー候補に(関数従属しているが)完全関数従属していないです(なので)。よって、「任意の属性、任意のに対して、がに完全関数従属する」は偽です。
おわりに
この記事では、集合論をベースに関係データモデルの定義から関数従属性、キー、2NFの定義を定式化し、その定義を満たす例と満たさない例をいくつか与えました。わかりやすさはともかく、(同内容の他の解説と比べて)数学的に厳密な定義は与えられたかと思います。
他の関係データモデルの解説にはあまりないこの記事の特徴としては、タプルを写像として与えたこと、タプルの複数の属性の値の取得に写像の制限を用いたことが挙げられます。
この記事を書いてて、集合論はなにかを記述する言語として便利だなぁと思いました。
補足
この記事では関数従属性を満たすかどうかをタプルを見て決めていますが、そもそも現実では、タプルを見て決まるものというよりかは、この関数従属性を満たすタプルしか入らないというのが正しい見方のような気がします。タプルを見て関数従属性を考えると、タプル数が少ない場合に例10のような意味のない議論が発生してしまいます。現実世界でいうと、属性として(ユニークな)IDと本名を持つ関係データベースを考えた場合、{ID}→{本名}と{本名}→{ID}と両方向の関数従属性が見えるかもしれませんが、もしかしたら今後同姓同名の人が登録して{本名}→{ID}の関数従属性が満たされなくなるかもしれません。タプルを見て関数従属性を決めると関係の状態に大きく左右されてしまいます。
そこで、関係(タプルの中身)によらずに関数従属性を定義したいです。ありえる関係をすべて集めた関係の集合 を定義し(が関係の一例です。)、 に対して関数従属性を定義してあげるという方法がありそうです(が関係データベースの実際のデータなのに対して、は関係データベースの設計に当たります)。具体的にはに対して、を「任意のに対して、ならば」と定義してあげればよさそうです。
この関数従属性の定義は
関西学院大学のデータベース論の講義資料
を参考にしました(この講義資料ではをインスタンスと呼んでいます)。
最後にの具体例をあげて終わりにしたいと思います。で、属性に一意性制約(2つの異なるタプルで属性の値が等しいものが存在しないようにする制約)があるとします。このとき、
と書けます。このとき、において関数従属性が成り立ちます。