理論から学ぶデータベース実践入門

第1章 SQL とリレーショナルモデル

リレーショナルモデルについて

リレーショナルモデルは現実世界のデータを「リレーション」という概念で表現する。
リレーショナルモデルは「データをどのように表現するか」というデータモデル手法の一種である。

リレーションの定義について


本書では「リレーションに相当するものはテーブルである」と述べられている。
テーブル同士の関係をデザインするのがリレーショナルモデルだと認識するのは間違いらしい。自分は普通に間違って認識していた。

リレーションは次のように定義される



見出し(Heading)

  • n個のattributeから定義される。attributeは名前とデータ型のペアである。

本体(Body)

  • attributeの集合である組、すなわちタプル(tuple)である。


f:id:decologa502:20210411113639p:plain

上記の定義を踏まえた上で注意すべきは、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)

ある二つのリレーションのタプルを組みわせたリレーションを返す。生成されたリレーションの見出しには二つのリレーションが持つ属性全てが含まれる。

f:id:decologa502:20210411113710p:plain

結合 (Join)

共通の属性を持つ二つのリレーションを、その共通の属性の値が同じタプル同士を組み合わせたリレーションを返す。SQL でいうところの inner join にあたる。ちなみに、リレーショナルモデルには inner join しかないらしい。 outer join は null を生むのでリレーションの演算として不適切。

クロージャという性質

リレーショナルモデルでは、リレーションを用いた演算の結果は必ずリレーションになる。このように、入出力のデータ構造が一致する性質をクロージャ(閉包)という。入出力が同じということは、結果と別のリレーションを用いてさらに演算できるため複雑な構造を表現することができる。

リレーショナルモデルにおけるデータ型

リレーショナルモデル自身には「どのようなデータ型を扱うべきか」という決まりはない。どのように使うべきははアプリケーション側で決定する。

ドメイン とは

リレーショナルモデルにおいて、データ型はドメインとも呼ばれる。
値はある集合の要素の一つ一つであり、変数とはある時点においてその集合から選択された要素の一つであると解釈できる。
集合の要素(値)に変化はないが、どの要素を選択するか(変数)は広告と変化する。その集合全体をドメインと呼ぶ。