関係モデル

関係モデルとは、データの集まりが関連していることを指します。
データベースでは、エンティティ(テーブル)を作成し、エンティティ間の関連を表現します。

例えば、標準化で作成した「問題データ」テーブルのように、複数のテーブルが存在し、それらのテーブル内のデータを別のテーブルのデータと関連付けます。

ユーザーが問題を解いた場合、その情報は「問題回答ログ」に保存されますが、どの問題かは「問題データ」テーブルの項目と関連していなければ判断が付きません。
データベースのテーブル内にある分類や区分などを列または「カラム」と呼び、それに紐づくデータに当たる行を「タプル」と呼びます。

関係は以下のようなイメージになります。

関係

レコードを一意に識別するためには、主キー(Primary Key)が使われます。
主キーには、連番など一意となる番号を設定し、それによりレコードが特定されます。

「標準化」された【問題データ】では、分類、区分、実施年度、問題番号などを組み合わせて特定の行を識別できます。
このように、複数の項目を使って一意性を確保する方法を複合キー(Composite Primary Key)と呼びます。

関係データベースでは、主キー以外にもレコードを特定できるキーとして候補キーやスーパーキーがあります。
スーパーキーは、複数の項目(分類、区分、実施年度、問題番号、問題内容など)を組み合わせて、一意にレコードを識別できるキーです。
すべての項目を組み合わせてレコードを特定できるなら、それもスーパーキーと呼ばれます。

候補キーは、スーパーキーの中で最小限の項目で構成され、一意性を保つキーです。
この候補キーの中から1つを選び、それが主キーになります。選ばれなかった候補キーは、代理キーや代替キーと呼ばれます。 例えば、「分類・区分・実施年度」の組み合わせは、最小限の要素で一意に識別できるため、主キー、候補キー、スーパーキーとして使えます。
しかし、「分類・区分・実施年度・問題番号・問題内容」の組み合わせは要素が多すぎるため、スーパーキーにはなりますが、主キーや候補キーには適していません。

別のテーブルで関連している主キーを外部キーといいます。
外部キーの値は、参照するテーブルの主キーのいずれかの値と一致していなければなりません。
これを参照制約や外部キー制約と呼びます。
また、自分のテーブル内の主キーを参照する場合、それを自己参照(再帰的参照)と言います。

「標準化」では、4つのカラムでタプルを一意に特定させていますが、5つ以上のカラムで一意を特定できる場合もあり、その特定も含めれるものがスーパーキーになります。

関係代数

関係代数とは関係モデルで使用する演算体系です。
データベースでは、SQLでデータ操作を定義します。
関係代数演算ともいい、次の演算があります。

射影(projection)

特定の列(カラム)を取り出します。
区分と問題番号の射影をしたのが以下イメージになります。
射影

選択(selection)

表の中から合致した行を取り出します。
2018年の問題だけを選択したのが以下イメージになります。

2018年問題

表記方法としてR[X 比較演算子 Y]と記載されて、問題[問題番号 = 2 or 問題番号 = 3)]になります。

結合(join)

指定した列で同じデータを持つ者同士を結合します。
問題テーブルと回答テーブルを結合したのが以下イメージになります。

問題テーブルと回答テーブル

結合は、「DML」の章で詳細に記載いたします。

商(division)

指定したテーブルから指定したテーブルを含む行の残りの項目を返します。
以下がイメージになり含めれている行の残りの項目が表示します。

商

集合演算

集合演算とは集合同士を演算する演算体系です。
和・積・差は、和両立(集合同士の次数と定義域が同じ)である必要があります。

和(union)

指定したテーブルと指定したテーブルの全てのものを返します。
和は記号として「∪」が使用されて「指定したテーブル∪指定したテーブル」で表示します。
SQLでは、UNIONで実行し、UNIONの場合は重複行を許しませんが、UNION ALLの場合は重複行を許します。

SELECT * FROM A UNION SELECT * FROM B;

和のイメージ テーブルでの和

共通(intersect)

積ともいいます。 指定したテーブルと指定したテーブルで含まれているものを返します。
積は記号として「∩」が使用されて「指定したテーブル∩指定したテーブル」で表示します。
SQLでは、INTERSECTで実行します。

SELECT * FROM A INTERSECT SELECT * FROM B;

積のイメージ テーブルでの積

差(except)

指定したテーブルから指定したテーブルに含まれていないものを返します。
差は記号として「-」が使用されて「指定したテーブル-指定したテーブル」で表示します。
SQLでは、EXCEPTまたはNOT EXISTSで実行します。

SELECT * FROM A EXCEPT SELECT * FROM B;

差のイメージ テーブルでの差

直積(cartesian product)

直積とは指定したテーブルと指定したテーブルがあれば、両方のテーブルを1つにして両方のテーブルの全行を返します。

SELECT * FROM A,B;

テーブルでの差

補集合

補集合は、あるテーブルに対して条件を満たすデータの集合があるとき、その条件を満たさないデータの集合です。
SQLでは検索条件を反転させることで、ある集合の補集合を取得できます。