Open4

リレーショナルデータモデル入門

yukiyuki

データモデル

データモデルと一般的に言う際には、下記の3つの要素から成り立っている。

  • 構造記述: データベースの構成要素の記述
  • 意味記述: データベースの一貫性制約の記述
  • 操作記述: 検索したり、更新したりするためのデータ操作言語

リレーショナルデータモデル

  • 数学の集合論に立脚している。
  • データと、データ間の関連をすべてリレーションのタプルで表現する。
  • モデルがメモリ空間上でどのように実装されるかについてはまったく無頓着
    • つまり、現場では理論通りではなく、メモリ側の都合に応じて改変する現実もあると言えそう。

ちなみに、このあと書くが「リレーション」という用語には一般的に技術者が思い浮かべそうなリレーションとは違う定義が与えられている。最初読んでいてちょっと混乱した(ちゃんと定義づけされているので、章全体のロジックとしてはまったく問題はない)。

yukiyuki

リレーション、ドメイン、直積、タプル

構造記述の話から開始される。

ドメイン(定義域)というのは、端的に言うと集合のことを指す。集合とは異なる元の集まりである。有限集合でも無限集合でも構わない。

ドメインには下記が含まれる。

  • カテゴリ?属性?の集合
    • 人名の集合
    • 給与の集合
    • 年齢の集合
  • データ型
    • NCHARVARYING(10)
    • INTEGER
    • VARCHAR
    • など。

次にドメインの直積を定義する。

n個のドメインD_1,D_2,D_3,...,D_nの直積をD_1 \times D_2 \times D_3 \times ... D_nと表す。たとえば、D_1 = {1, 2}, D_2 = {a, b, c}, D_3 = D_1とするとき、D_1 \times D_2 \times D_3 \timesは次のような12個の元からなる集合になる(通常の直積の定義と変わりない)。

\{(1,a,1),(1,a,2),(1,b,1),(1,b,2),(1,c,1),(1,c,2),(2,a,1),(2,a,2),(2,b,1),(2,b,2),(2,c,1),(2,c,2)\}

この直積集合の各元をタプル(書籍内だとタップル)という。

ここからリレーションを定義する。

つまりどういうことかというと、要するに直積から部分集合を作ったとき、それをリレーションと呼びますよということだと思う。先ほど定義した直積集合から次のようにすると、リレーションRを作ることができる(もちろんこれ以外の組み合わせも考えられる):

R = \{(1,a,1),(2,b,1),(2,c,2)\}

Rの各元をRのタプルという。また、Rのタプルの総数を濃度(カーディナリティ)と呼ぶ。このケースではカーディナリティは3?

さらに、先ほどのRの例ではD_1, D_2, D_3の3つのドメインの上でRが定義されているが、リレーションが定義されているドメインの個数を次数(degree)と呼ぶ。

リレーションは上記のようにタプルの集合ではあるものの、それを表(table)として表すこともできる。つまりリレーションは実質的にはテーブルということなのかな。テーブルの行と列は一応紹介されているが、テーブルを横に眺めると行、縦に眺めると列になる。

この辺りまでは集合の教科書の復習みたいな感じがする。

yukiyuki

ここで、
属性名 = 列名
リレーション名 = 表名
とする。

リレーション名と属性名が導入されると新しいリレーションの定義方法が生まれてくる。

リレーションRの属性名をA_1, A_2, ..., A_nとし、ドメイン関数 dom を次のように定義する。

dom : A_i \rightarrow D_i (i = 1, 2, ..., n)

すると、リレーション名がRのリレーションは、R \subseteq dom(A_1) \times dom(A_2) \times ... \times dome(A_n)と定義される。つまり、リレーションを属性名とリレーション名とドメイン関数を使って定義し直すことができる。

たとえば、下記のようなリレーションについて考えてみる。

名前 年齢
A 22
B 21
C 20

このリレーションについて、リレーションはR(名前, 年齢)という属性を持ち。また、このリレーションそのものはR = dom(名前) \times dom(年齢)ということになる。dom(名前) = D_1, dom(年齢) = D_2。仮にリレーション名が「友人」だった場合、友人 = dom(名前) \times dom(年齢)