関係モデル( RM ) は、一階述語論理と整合性のある構造と言語を使用してデータを管理するアプローチであり、1969 年にイギリスのコンピュータ科学者Edgar F. Coddによって初めて記述されました[ 1 ] [ 2 ] 。すべてのデータはタプルで表現され、関係にグループ化されます。関係モデルに基づいて構成されたデータベースは、関係データベースです。
関係モデルの目的は、データとクエリを指定するための宣言的な方法を提供することです。ユーザーはデータベースにどのような情報が含まれているか、そしてそこからどのような情報を取得したいかを直接指定し、データベース管理システムソフトウェアがデータの格納のためのデータ構造の記述や、クエリに応答するための取得手順の処理を担当します。
ほとんどのリレーショナルデータベースはSQLデータ定義とクエリ言語を使用しており、これらのシステムはリレーショナルモデルに対するエンジニアリング近似とみなせるものを実装しています。SQLデータベーススキーマのテーブルは述語変数に対応し、テーブルの内容はリレーションに対応し、キー制約、その他の制約、およびSQLクエリは述語に対応します。しかし、SQLデータベースは多くの点でリレーショナルモデルから逸脱しており、コッドは元の原則を損なう逸脱に強く反対しました。[ 3 ]
関係モデルは、エドガー・F・コッドによってデータの一般的なモデルとして開発され、その後、クリス・デイトやヒュー・ダーウェンらによって推進されました。デイトとダーウェンは、1995年の「第三のマニフェスト」の中で、関係モデルが特定の「望ましい」オブジェクト指向機能をどのように実現できるかを実証しようとしています。[ 4 ]
1970年のモデル発表から数年後、コッドは欠落情報を扱うために3値論理(真、偽、欠落/ NULL )バージョンを提案し、彼の『データベース管理のためのリレーショナルモデル バージョン2』(1990年)ではさらに一歩進んで4値論理(真、偽、欠落しているが適用可能、欠落しているが適用不可)バージョンを提案した。[ 5 ]

リレーションは、見出しと本体から構成されます。見出しは属性の集合を定義し、各属性には名前とデータ型(ドメインと呼ばれることもあります)があります。この集合に含まれる属性の数は、リレーションの次数またはアリティです。本体はタプルの集合です。タプルはn個の値の集合であり、nはリレーションの次数です。タプル内の各値は、一意の属性に対応します。[ 6 ] この集合に含まれるタプルの数は、リレーションのカーディナリティです。[ 7 ] : 17–22
リレーションは、再割り当て可能なリレーション変数(relvar)によって表現されます。 [ 7 ]: 22-24データベースはrelvarの集合です。[ 7 ]: 112-113
このモデルでは、データベースは情報原理に従います。すなわち、任意の時点で、データベース内のすべての情報は、関係変数によって識別される関係内の属性に対応するタプル内の値のみによって表現されます。[ 7 ]: 111
データベースは、任意のブール式を制約として定義できます。すべての制約が真と評価される場合、データベースは一貫性があります。そうでない場合は、一貫性がありません。データベースのリレ変数への変更によってデータベースが一貫性のない状態になる場合、その変更は不正であり、成功してはなりません。[ 7 ] : 91
一般的に、制約は関係比較演算子を使用して表現され、理論的には「~の部分集合である」(⊆)という演算子だけで十分である。[ 8 ]
制約の2つの特殊なケースは、キーと外部キーとして表現されます。
候補キー、または単にキーとは、リレーション内の各タプルを一意に識別することが保証される属性の最小部分集合のことです。リレーション内の各タプルは一意でなければならないため、すべてのリレーションには必ずキーが存在し、それは属性の完全な集合である場合もあります。各タプルを一意に識別する方法が複数存在する可能性があるため、リレーションは複数のキーを持つことができます。[ 7 ]: 31-33
属性は、キーでなくてもタプル間で一意である場合があります。たとえば、会社の従業員を表す関係には、IDと名前という2つの属性があるかもしれません。現在、同じ名前の従業員が一人もいなくても、将来的に現在の従業員と同じ名前の新しい従業員を雇用する可能性がある場合、属性のサブセット{名前}はキーではありません。逆に、サブセット{ID}がキーである場合、これは現在同じIDを持つ従業員がいないだけでなく、将来も同じIDを持つ従業員がいないことを意味します。[ 7 ]: 31-33
外部キーとは、関係R 1の属性Aの部分集合であり、別の関係R 2のキーに対応するもので、 R 1からAへの射影がR 2からAへの射影の部分集合であるという性質を持つ。言い換えれば、R 1のタプルに外部キーの値が含まれている場合、 R 2には対応するキーに対して同じ値を含む対応するタプルが存在しなければならない。 [ 7 ] : 34
ユーザー(またはプログラム)は、クエリを送信することによってリレーショナルデータベースからデータを要求します。クエリに応答して、データベースは結果セットを返します。[ 2 ]
多くの場合、複数のテーブルのデータは結合によって1つに結合されます。概念的には、これは行のすべての可能な組み合わせ(デカルト積)を取得し、答え以外のすべてをフィルタリングすることによって行われます。[ 2 ]
結合以外にも、関係演算は数多くあります。これには、射影(列の一部を削除するプロセス)、制限(行の一部を削除するプロセス)、ユニオン(類似した構造を持つ 2 つのテーブルを結合する方法)、差分(一方のテーブルにはあるが他方のテーブルにはない行をリストアップする)、交差(両方のテーブルに存在する行をリストアップする)、積(前述のように、一方のテーブルの各行を他方のテーブルの各行と結合する)などがあります。参照する他の資料によっては、他にも多くの演算子があり 、その多くは上記の演算子に基づいて定義できます。これらには、セミ結合、外部結合や外部ユニオンなどの外部演算子、さまざまな形式の除算などがあります。さらに、列の名前を変更する演算子、集計演算子、関係値を属性として許可する場合(関係値属性)、グループ化やグループ解除などの演算子もあります。[ 2 ]
リレーショナルデータベースの柔軟性により、プログラマーはデータベース設計者が想定していなかったクエリを作成できます。その結果、リレーショナルデータベースは、元の設計者が予見しなかった方法で複数のアプリケーションで使用できます。これは、長期間(おそらく数十年)使用される可能性のあるデータベースにとって特に重要です。[ 2 ]このため、リレーショナルデータベースの概念と実装は企業で非常に人気があります。[ 9 ]
リレーションは、脆弱な異常の種類に基づいて分類されます。第一正規形にあるデータベースはすべての種類の異常に対して脆弱ですが、ドメイン/キー正規形にあるデータベースは変更異常がありません。正規形は階層構造になっています。つまり、最も低いレベルは第一正規形であり、データベースは下位の正規形のすべての要件を満たさなければ、上位レベルの正規形の要件を満たすことはできません。[ 10 ]
関係モデルは形式体系である。関係の属性は論理命題の集合を定義する。各命題はタプルとして表現できる。関係の本体はこれらのタプルのサブセットであり、どの命題が真であるかを表す。制約は、真でなければならない追加の命題を表す。関係代数は、これらの命題から妥当な結論を推論できる論理規則の集合である。[ 7 ] : 95-101
タプルの定義では、属性の空集合に対応する、値を持たない唯一の空タプルが許容されます。関係の次数が0(つまり、見出しに属性が含まれていない)の場合、カーディナリティは0(タプルを含まない本体)または1(単一の空タプルを含む本体)のいずれかになります。これらの関係はブール値の真偽値を表します。次数が0でカーディナリティが0の関係はFalseであり、次数が0でカーディナリティが1の関係はTrueです。[ 7 ]: 221-223
従業員のリレーションに属性が含まれている場合、次にタプルは「 IDが1のAliceという名前の従業員が存在する」という命題を表します。この命題は真または偽です。このタプルがリレーション本体に存在する場合、命題は真です(そのような従業員が存在します)。このタプルがリレーション本体に存在しない場合、命題は偽です(そのような従業員は存在しません)。 [ 7 ]: 96-97
さらに、もしはキーであり、タプルを含むリレーションです。そしては次のような矛盾を表すだろう。
爆発原理の下では、この矛盾によってシステムは任意の命題が真であることを証明できてしまう。データベースはこれを防ぐためにキー制約を強制する必要がある。[ 7 ]: 104
関係変数(relvar)とその属性を記述した、理想化された非常にシンプルな例を以下に示します。
この設計では、顧客、注文、請求書の 3 つのリレバルがあります。太字で下線が引かれている属性は候補キーです。太字ではなく下線が引かれている属性は外部キーです。
通常、候補キーのうち1つがプライマリキーと呼ばれ、他の候補キー(代替キーと呼ばれる)よりも優先的に使用されます。
候補キーは、タプルが重複しないことを保証する一意の識別子です。重複すると、セットの基本定義に違反して、リレーションが別のもの、つまりバッグになってしまいます。外部キーとスーパーキー(候補キーを含む)はどちらも複合キー、つまり複数の属性で構成できます。以下は、例の Customer relvar のリレーションを表形式で示したものです。リレーションは、relvar に帰属できる値と考えることができます。
ID 123を持つ新規顧客を挿入しようとすると、顧客 ID は主キーであり、既に顧客123が存在するため、リレバレッジの設計に違反します。DBMSは、整合性制約違反によってデータベースの一貫性を損なうようなトランザクションを拒否する必要があります。ただし、名前フィールドは主キーの一部ではないため、新しい顧客に一意の ID があれば、 Aliceという名前の別の顧客を挿入することは可能です。
外部キーは、属性セットの値が別のリレーションの候補キーから取得されることを強制する整合性制約です。たとえば、Order リレーションでは、 Customer ID属性が外部キーです。結合は、複数のリレーションから一度に情報を取得する操作です。上記の例のリレーション変数を結合することで、データベースからすべての Customers、Orders、および Invoicesをクエリできます。特定の顧客のタプルのみが必要な場合は、制限条件を使用してこれを指定します。顧客123のすべての Orders を取得したい場合は、データベースをクエリして、 Customer ID 123の Order テーブルのすべての行を返すことができます。
上記のデータベース設計には欠陥があります。Invoice relvar には Order ID 属性が含まれています。そのため、Invoice relvar の各タプルには 1 つの Order ID が含まれ、これは各請求書に対して正確に 1 つの注文が存在することを意味します。しかし実際には、1 つの請求書は複数の注文に対して作成される場合もあれば、特定の注文に対して作成される場合もあります。さらに、Order relvar には Invoice ID 属性が含まれており、各注文に対応する請求書が存在することを意味します。しかしこれも現実世界では必ずしもそうではありません。1 つの注文が複数の請求書で支払われる場合もあれば、請求書なしで支払われる場合もあります。つまり、1 つの注文に対して複数の請求書が存在し、1 つの請求書に対して複数の注文が存在する可能性があります。これは、注文と請求書の間の多対多の関係 (非特定関係とも呼ばれます) です。この関係をデータベースで表現するには、注文と請求書の対応関係を指定する役割を持つ新しい relvar を導入する必要があります。
OrderInvoice (注文ID、請求書ID )
さて、Order関連変数とInvoice関連変数は、OrderInvoiceテーブルに対して1対多の関係を持っています。特定の注文のすべての請求書を取得したい場合は、 Order関連変数のOrder IDがOrderInvoiceのOrder IDと等しく、かつOrderInvoiceのInvoice IDがInvoiceのInvoice IDと等しいすべての注文をクエリできます。
リレーショナルデータベースにおけるデータ型は、整数の集合、文字列の集合、日付の集合などである。リレーショナルモデルは、どのような型をサポートするかを規定するものではない。
属性は一般的に列、タプルは行、リレーションはテーブルとして表現されます。テーブルは列定義のリストとして指定され、各列定義は一意の列名と、その列に許容される値の型を指定します。属性値は、特定の列と行のエントリです。
データベースのリレーション変数( relvar )は、一般的にベーステーブルと呼ばれます。その値に割り当てられたヘッダーは、テーブル宣言で指定されたとおりであり、本体は、更新演算子(通常はINSERT、UPDATE、またはDELETE)によって最後に割り当てられた値です。クエリの評価によって生成されるテーブルのヘッダーと本体は、そのクエリで使用される演算子の定義によって決まります。
SQLは当初、リレーショナルデータベースの標準言語として推進されましたが、いくつかの点でリレーショナルモデルから逸脱しています。現在のISO SQL規格では、リレーショナルモデルについて言及しておらず、リレーショナル用語や概念も使用していません。
関係モデルによれば、リレーションの属性とタプルは数学的な集合であり、順序付けされておらず、一意である。SQLテーブルでは、行も列も適切な集合ではない。テーブルには重複する行と重複する列の両方が含まれる可能性があり、テーブルの列は明示的に順序付けられている。SQLは欠損データを示すためにNULL値を使用するが、これは関係モデルには対応する値がない。行は未知の情報を表す可能性があるため、SQLは関係モデルの情報原則に準拠していない。[ 7 ]: 153-155、162
関係モデルにおける基本的な概念は、関係名と属性名です。これらは「Person」や「name」などの文字列として表現され、通常は変数を使用します。そしてそれらを網羅する。もう1つの基本的な概念は、数値や文字列などの値を含む原子値の集合である。
まず最初に、タプルという概念について説明します。これは、テーブルにおける行またはレコードの概念を形式化したものです。
次の定義では、関係モデルで定義されているように、テーブルの内容を形式化する関係を定義します。
このような関係は、一階述語論理における述語の拡張と呼ばれるものとよく似ていますが、ここでは述語内の箇所を属性名で識別します。通常、関係モデルでは、データベーススキーマは、一連の関係名、これらの名前に関連付けられたヘッダー、およびデータベーススキーマのすべてのインスタンスに対して満たされるべき制約から構成されると言われています。
関係制約の中で最も単純かつ重要なタイプの1つがキー制約です。これは、特定の関係スキーマのすべてのインスタンスにおいて、タプルが特定の属性の値によって識別できることを示しています。
スーパーキーとは、連結された列の値がすべての行で一意となる列ヘッダーのセットのことです。正式には、次のようになります。
候補キーとは、それ以上分割して別のスーパーキーを形成することができないスーパーキーのことである。
関数従属性とは、タプル内の値が、そのタプル内の別の値から導き出せる性質のことである。
関数従属性から候補キーを導出するアルゴリズムは、入力:ヘッダーHのサブセットのみを含む FD の集合S 、出力:候補キーとして保持されるスーパーキーの集合C です。H 上のすべての関係ユニバースであって、 Sのすべての FDが成り立つもの C := ∅ // 候補キーが見つかった Q := { H } // 候補キーを含むスーパーキー while Q <> ∅ do let K をQ の要素とするQ := Q – { K } minimal := true for each X->Y in S do K' := ( K – Y ) ∪ X // 新しいスーパーキーを導出 if K' ⊂ K then minimal := false Q := Q ∪ { K' } end if end for if minimalかつCにKの部分集合がない場合は、CからK のすべてのスーパー集合を削除するC := C ∪ { K } end if end whileその他のモデルには、階層型モデルとネットワーク型モデルがあります。これらの古いアーキテクチャを使用するシステムの中には、データ量が多いデータセンターや、既存のシステムが非常に複雑で抽象的であるため、リレーショナルモデルを採用したシステムに移行するのがコスト的に不可能な場合など、現在でも使用されているものがあります。また、新しいオブジェクト指向データベース[ 12 ]やDatalog [ 13 ]も注目に値します。
Datalogはデータベース定義言語であり、リレーショナルモデルにおけるデータの関係的視点と、論理プログラミングにおける論理的視点を組み合わせたものです。リレーショナルデータベースは、関係演算(和集合、積集合、差集合、直積など)を用いた関係計算または関係代数を使用してクエリを指定しますが、Datalogはif、or、and、notなどの論理結合子を使用して、データベース自体の一部として関係を定義します。
関係モデルでは最小不動点演算子を導入せずに再帰クエリを表現できないのに対し、[ 14 ] Datalogでは新しい論理結合子や演算子を導入することなく再帰関係を定義できます。