理論から学ぶデータベース実践入門
第1章 SQL とリレーショナルモデル
リレーショナルモデルについて
リレーショナルモデルは現実世界のデータを「リレーション」という概念で表現する。
リレーショナルモデルは「データをどのように表現するか」というデータモデル手法の一種である。
リレーションの定義について
本書では「リレーションに相当するものはテーブルである」と述べられている。
テーブル同士の関係をデザインするのがリレーショナルモデルだと認識するのは間違いらしい。自分は普通に間違って認識していた。
リレーションは次のように定義される
見出し(Heading)
- n個のattributeから定義される。attributeは名前とデータ型のペアである。
本体(Body)
- attributeの集合である組、すなわちタプル(tuple)である。
上記の定義を踏まえた上で注意すべきは、SQLとリレーショナルモデルはそれぞれ対応する概念があるのにもかかわらず異なる名称を用いている点だ。当たり前のことだが、異なる名称を用いるのはそもそも異なる性質の概念だからである。
リレーショナルモデル | SQL |
---|---|
リレーション | テーブル |
タプル | 行 |
属性 | カラム |
集合とリレーショナルモデル
集合とは
集合は要素の集まりを表現する概念。
集合を構成する要素はどのようなものでも許容されるが、次の二点を守る必要がある
1. その要素が集合に含まれているかどうかを不確定要素がなく判定できること
例えば文字列を要素として扱う集合Nがあったとき、 Foo という要素がNに含まれているかどうか確実に判断できなければならない。逆説的に述べると、未知の要素は集合に加えることができない。
2. 集合の要素は重複してはならない
集合は、ある要素が含まれているかそうでないか、ということにのみ関心を持つ。
集合Nに要素nが含まれることは以下のように表現できる。
n ∈ N
Nとnに着目したとき必要なのはnがNに含まれているという情報だけである。仮に n が複数個存在した場合にも n ∈ N の式は成り立つが、集合に対する演算結果に影響を与えるため、重複は許されないということらしい。
ちなみに、 上記の 1 の 「未知の要素は集合に加えることができない」は、リレーショナルモデルに null を含めることができないという解釈もできる。なぜならnullは値ではなく未知の要素であることを示すマーカーなので。
リレーションの演算
リレーションに対する演算はクエリ(問い合わせ)である。リレーショナルモデルはリレーションを単位として様々な演算を用いてクエリするデータモデルであるので、リレーショナルモデルと呼ばれるらしい。
リレーションの本体(Body)はタプルの集合であるためそれに対するクエリも集合論をベースにしている。以降は代表的なリレーションの演算(クエリ)である。
制限(Restrict)
Restrict はあるリレーションのうち、特定の条件にあうタプルだけを含んだリレーションを返す。つまりResticの結果は元のリレーションの部分集合になるはず。空集合もありえる。
射影(Projection)
Projectionはあるリレーションにおいて特定の属性だけを含んだリレーションを返す。属性が少なくなった場合重複されたリレーションが返される可能性がある。例えば、「地域情報」を管理するリレーション(テーブル )があったとき、 「国」属性でProjectionをとると「国: 日本」を持つタプルが複数帰ってくる場合など。
拡張(Extend)
Extendは属性を増やす操作である。多くの場合、新しい属性の値は既存の属性の値を使って算出される。
例えば「人口」と「面積」という属性から「人口密度」を作り出すなど。
属性名変更(Rename)
単に属性の名称を変えるだけ。
和(Union)
Unionは二つのリレーションに含まれる全てのタプルで構成されるリレーション(和集合)を返す。
積/交わり (Intersect)
二つのリレーションの積集合を返す
差(Difference)
二つのリレーションのうち、片方にのみ含まれるリレーションを返す。どちらのリレーションを基底にするかで当たり前だけど結果は変わる。
直積(Product)
ある二つのリレーションのタプルを組みわせたリレーションを返す。生成されたリレーションの見出しには二つのリレーションが持つ属性全てが含まれる。
結合 (Join)
共通の属性を持つ二つのリレーションを、その共通の属性の値が同じタプル同士を組み合わせたリレーションを返す。SQL でいうところの inner join にあたる。ちなみに、リレーショナルモデルには inner join しかないらしい。 outer join は null を生むのでリレーションの演算として不適切。