2009年7月23日木曜日

【DBiD】3 タプルと関係


* 3 タプルと関係

** 私の雑感
この本はDateのアジというか、ノイズが多い。
このアジは、SQLをリレーショナルモデルと思い込んで
いる人に対する気付け薬的なものだろう。

そういう思い込みが無い人にとっては、アジはいいから、
もうちょっとすっきり整理して言いたいことを言って欲
しいなぁ、と感じさせるものではないか。実際私はそう
だ。しかしそれはこの本を読んでいる私の選択の問題だ
ろう。C.J.Dateは著書が豊富なので、その中にはすっき
り整理してある本もあるのだろう。

また、この本の訳書のタイトルはまずいかもしれない。
「データベース実践講義」というタイトルで期待するこ
とは、本書の内容とは違うことが多いのではないか。原
書の「Database in Depth」はそういう意味ではアリであ
る。訳書のタイトルのアンマッチが、読者の誤解や不評
に繋らなければよいのだが。私自身は原題の認識が先行
していたので、アジ以外は期待通り。

閑話休題。

という事情も加味しつつ、この章も自分なりのまとめを
書く。読書メモとはちょっと違うものです。


** タプルの定義
定義なので、原文まま引用。

---
T1,T2,...Tn (n>=0)が型名であり、それらが必ずしも異
なるとは限らないとする各Tiに識別可能な属性名Aiを関
連付ける。これによって生じるn個の属性名と型名の組
みは、それぞれ属性である。各属性をTi型の値viに関連
付ける。それによって生じるn個の属性と値の組みは、
それぞれコンポーネントである。そのように定義された
n個のコンポーネントからなる集合(t)は、属性
A1,A2,...,Anのタプル値(または略してタプル)である。
値nはtの次数であり、次数1のタプルは単項、次数2のタ
プルは2項、次数3のタプルは3項である。一般に、次数n
のタプルはn項である。n個の属性からなる集合は、tの
見出しである。
---

** タプルをCommon Lispのオブジェクトで表現してみる

- 型名
- これはatom。

T1 T2 T3

- 属性名
- これもatom。

A1 A2 A3

- 属性
- これはdotted pairにしてみる。

(T1 . A1)
(T2 . A2)
(T3 . A3)

- 値
- これもatomにしてみる。

v1 v2 v3

- コンポーネント
- dotted pair。

((T1 . A1) . v1)
((T2 . A2) . v2)
((T3 . A3) . v3)

- タプル値 (タプル)
- listで表現する。しかしタプル値としては集合な
ので、そこは表現しきれていない。

(((T1 . A1) . v1)
((T2 . A2) . v2)
((T3 . A3) . v3))

- 見出し

タプル値、

(((T1 . A1) . v1)
((T2 . A2) . v2)
((T3 . A3) . v3))

の見出しとは、

((T1 . A1)
(T2 . A2)
(T3 . A3))

である。listだが、集合として使うことを想定して
いる。

- タプル値というのは、super-boxedなデータみたいな
ものかな。型のみならず、現在の(DSLの意味での)
ドメインの名前(属性名)までもデータに入っている。
そうか、Common Lispとかの構造体と同じなのか。
例えば、HyperSpecから例をとると、構造体の定義は、

---
(defstruct ship
(x-position 0.0 :type short-float)
(y-position 0.0 :type short-float)
(x-velocity 0.0 :type short-float)
(y-velocity 0.0 :type short-float)
(mass *default-ship-mass* :type short-float :read-only t))
---

であり、一応生成された構造体のスロットも、自分
自身のスロット名やスロットの型を知っている。な
るほどなるほど。

** タプルに関するトピック

- nullを含むタプルは存在しない。
- そう決めるのは自由なのだが、Common Lispには
nilがあり、構造体の値にも使えたりする。

- タプルの部分集合はタプルである。
- 見出しの部分集合は見出しである。

- 次数がゼロのタプルを0タプルと呼ぶ。
Common Lisp的に表現すると、

()

かな。
- タプルの等価性は、Common Lispのequalp的に定義さ
れている。

** 関係の定義
定義なので原文まま引用。

---
{H}をタプルの見出しとし、t1,t2,...,tm (m >= 0)を見
出し{H}を持つ個々のタプルであるとする。{H}とタプル
の集合{t1,t2,...,tm}との組み合わせrは、属性
A1,A2,...,Anにおける関係値(または単に関係)である。
ここで、A1,A2,...,Anは{H}の属性である。rの見出しは
{H}である。rは見出しと同じ属性(よって、同じ属性名
と型)と、見出しと同じ次数を持つ。rの本体はタプルの
集合{t1,t2,...,tm}である。値mはrの濃度である。
---

- タプルの流れで、Common Lispで関係を表現すると、

まず、これが見出しで、

((T1 . A1)
(T2 . A2)
(T3 . A3))

タプル値が例えば、3つあるとするとそれらは、

(((T1 . A1) . v11)
((T2 . A2) . v12)
((T3 . A3) . v1))

(((T1 . A1) . v21)
((T2 . A2) . v22)
((T3 . A3) . v23))

(((T1 . A1) . v21)
((T2 . A2) . v22)
((T3 . A3) . v23))

なんぞであり、タプル値の集合が関係の本体なので、

((((T1 . A1) . v11)
((T2 . A2) . v12)
((T3 . A3) . v1))
(((T1 . A1) . v21)
((T2 . A2) . v22)
((T3 . A3) . v23))
(((T1 . A1) . v21)
((T2 . A2) . v22)
((T3 . A3) . v23)))

リストで集合を表現するとこれが本体。

この本体と見出しを組み合わせたのが関係だから、
それをリストであらわすと、

(((T1 . A1)
(T2 . A2)
(T3 . A3))

((((T1 . A1) . v11)
((T2 . A2) . v12)
((T3 . A3) . v1))
(((T1 . A1) . v21)
((T2 . A2) . v22)
((T3 . A3) . v23))
(((T1 . A1) . v21)
((T2 . A2) . v22)
((T3 . A3) . v23))))

これが関係。

** 関係に関するトピック
- 本体の部分集合はすべて本体である。
- 関係の中でのタプルの重複はリレーショナルモデル
では禁止されるべきである。Tutorial Dでは禁止さ
れている。SQLでは禁止されていない。

** nullを禁止すべき理由
- リレーショナルモデルは、2値論理(2VL)に基づくべ
きである。(その方が有用だから) そして実際に、リ
レーショナルモデルの中の各部は2値論理に基づいて
組みたてられている。
- nullを含むということは、述語の値が
true,false,unknownの3値になり3値論理(3VL)という
ことになる。
- 2値論理の機構と3値論理の機構が混在すると、期待
する正しい結果が得られないというか、保証されな
い場合がでてくる。実際、SQLではそういった例があ
る。
- よってnullはリレーショナルモデルに含まない方が
よい。
- nullが入っている状態はリレーショナルモデル以外
の何かであると認識した方がよい。

** TABLE_DUM と TABLE_DEE
- TABLE_DUMは、空の関係である。
Common Lispの表現の流れでは、

(() ())

である。次数ゼロなので、見出しは空集合である。ま
た、本体も何も含まないので、空集合である。

- TABLE_DEEは、次数ゼロで空のタプルを壱つ含む関係
である。
Common Lispの流れの表現では、

(() (()))

である。本体に空のタプルを壱つ含んでいるが、空
のタプルは空集合なので、このようになる。

- これらはリレーショナル代数において役割をもつ。
TABLE_DEEはゼロの役割を果す。
- 真理値の観点で言うと、TABLE_DUMはNO/FALSEの役割
を果たし、TABLE_DEEはYES/TRUEの役割を果たす。


こつこつ。

0 件のコメント: