タプル計算は、関係モデルの一部としてエドガー・F・コッドによって作成および導入された計算体系であり、このデータモデルにおけるデータ操作のための宣言型データベースクエリ言語を提供することを目的としています。これは、データベースクエリ言語QUELとSQLの着想源となりました。後者は、元の関係モデルと計算体系に忠実ではありませんが、現在では事実上の標準データベースクエリ言語となっています。SQLの方言は、ほぼすべての関係データベース管理システムで使用されています。ミシェル・ラクロワとアラン・ピロットは、一階述語論理に近いドメイン計算を提案し、コッドとともに、これら2つの計算体系(および関係代数)が表現力において同等であることを示しました。その後、関係モデル用のクエリ言語は、少なくともこれらのクエリすべてを表現できる場合に、関係的に完全であると呼ばれるようになりました。
計算体系は関係データベースのクエリ言語であるため、まず関係データベースを定義する必要があります。関係の基本的な構成要素はドメイン(データ型と多少似ていますが、同一ではありません)です。タプルは、ドメインと値の順序付きペアである属性の有限シーケンスです。リレーションは、(互換性のある)タプルの集合です。これらの関係概念は数学的に定義されていますが、これらの定義は従来のデータベース概念に大まかに対応しています。テーブルは、リレーションの視覚的な表現として受け入れられています。タプルは、行の概念に似ています。
まず、列名の集合Cが存在すると仮定します。その例としては、「name」、「author」、「address」などがあります。ヘッダーはCの有限部分集合として定義します。リレーショナルデータベーススキーマは、タプルS = ( D、R、h )として定義されます。ここで、 Dは原子値のドメイン (ドメインと原子値の概念の詳細については、リレーショナルモデルを参照)、Rは関係名の有限集合、
Rの各リレーション名にヘッダーを関連付ける関数。(これは、ドメインが複数あり、ヘッダーが単なる列名のセットではなく、これらの列名をドメインにマッピングする完全なリレーション モデルからの簡略化であることに注意してください。)ドメインDが与えられた場合、 D上のタプルを、いくつかの列名をDの原子値にマッピングする部分関数として定義します。例としては、(name : "Harry", age : 25)などがあります。
D上のすべてのタプルの集合はT Dと表記されます。タプルtが定義されているCの部分集合はtのドメインと呼ばれ(スキーマのドメインと混同しないように注意)、dom ( t ) と表記されます。
最後に、スキーマS = ( D , R , h ) が与えられた場合のリレーショナルデータベースを関数として定義します。
これは、 R内の関係名をT Dの有限部分集合にマッピングし、 R内のすべての関係名rとdb ( r )内のタプルtに対して、以下が成り立つ。
後者の要件は、リレーション内のすべてのタプルが同じ列名、つまりスキーマで定義されている列名を持つべきである、ということを単純に述べている。
式の構築にあたっては、タプル変数の無限集合Vを仮定します。式は、データベーススキーマS = ( D , R , h ) と、型割り当て時に呼び出される部分関数 型V ⇸ 2 C が与えられたときに定義され、この関数はいくつかのタプル変数にヘッダーを割り当てます。次に、原子式の集合A [ S , type ] を次の規則で定義します。
原子の例としては、以下のようなものがあります。
このようなアトムの形式意味論は、 S上のデータベースdbと、タプル変数をSのドメイン上のタプルにマッピングするタプル変数バインディングval : V → T Dが与えられたときに定義されます。
原子は、一階述語論理で通常行われるように、論理演算子 ∧ (かつ)、∨ (または)、¬ (否定) を用いて式に組み合わせることができ、存在量化子 (∃) と全称量化子 (∀) を用いて変数を束縛することができます。式の集合F [ S , type ] を、以下の規則に従って帰納的に定義します。
数式の例:
最後の式は、CJ Dateが執筆したすべての書籍の主題が関係モデルであることを示しています。通常どおり、式の意味に曖昧さが生じない場合は括弧を省略します。
量化子はスキーマ内のドメイン上のすべてのタプルの全体にわたって量化すると仮定します。これにより、S上のデータベースdbとタプル変数バインディングval : V → T D :が与えられた場合の式に対する次の形式意味論が得られます。
最後に、スキーマS = ( D , R , h ) が与えられた場合のクエリ式がどのようなものになるかを定義します。
ここで、vはタプル変数、Hはヘッダー、f ( v ) はF [ S , type ]の式であり、 type = { ( v , H ) } で、vは唯一の自由変数です。S上の特定のデータベースdbに対するこのようなクエリの結果は、 dbに対してf が真であり、val = { ( v , t ) }であるような、dom ( t ) = HであるD上のすべてのタプルtの集合です。
クエリ式の例は次のとおりです。
量指定子のセマンティクスは、スキーマ内のドメイン上のすべてのタプルに対して量指定を行うため、別のスキーマを想定した場合、クエリが特定のデータベースに対して異なる結果を返す可能性があります。たとえば、ドメインがD 1 = { 1 }、D 2 = { 1, 2 }、リレーション名がR = { r 1 } 、ヘッダーがh = { ( r 1 , { a }) } である 2 つのスキーマ S 1 = ( D 1 , R , h ) と S 2 = ( D 2 , R , h )を考えてみましょう。どちらのスキーマにも共通のインスタンスがあります。
次のクエリ式を考慮すると
この場合、データベースに対する結果は、 S 1 の下では { (a : 1) }またはS 2の下では { (a : 1), (a : 2) } のいずれかになります。ドメインを無限集合とすると、クエリの結果も無限になることは明らかです。これらの問題を解決するために、ドメインに依存しないクエリ、つまり、データベースのすべてのスキーマの下で同じ結果を返すクエリにのみ注目します。
これらのクエリの興味深い特性は、タプル変数がデータベースのいわゆるアクティブドメイン(データベース内またはクエリ式内の少なくとも1つのタプルに出現するドメインのサブセット)上のタプルを対象とすると仮定した場合、クエリ式の意味論は変化しないという点です。実際、タプル計算の多くの定義では、このようにして量化子の意味論が定義されており、これによりすべてのクエリは定義上ドメインに依存しないものとなります。
クエリ式がドメインに依存しないクエリのみを表現するように制限するために、通常は安全なクエリの構文概念が導入されます。クエリ式が安全かどうかを判断するために、クエリから 2 種類の情報を導き出します。1 つ目は、変数と列のペアt . aがリレーションの列または定数に束縛されているかどうか、2 つ目は、2 つの変数と列のペアが直接的または間接的に等しくなっているかどうか ( t . v == s . wと表記) です。
有界性を導出するために、以下の推論規則を導入する。
等価性を導出するために、以下の推論規則を導入します(通常の同値関係の推論規則である反射律、対称律、推移律に加えて)。
クエリ式は次のように定義されます。は安全です
安全なクエリ式への制限は表現力を制限するものではありません。なぜなら、表現可能なすべてのドメイン非依存クエリは、安全なクエリ式によっても表現できるからです。これは、スキーマS = ( D , R , h )、クエリ式内の定数の集合K 、タプル変数v、およびヘッダーHに対して、値がアクティブドメインにあることを示す、 H内のaを含むすべてのペアv . aの安全な式を構築できることを示すことで証明できます。たとえば、K ={1,2}、R ={"r"}、h = { ("r", {"a, "b"}) } と仮定すると、 v .bに対応する安全な式は次のようになります。
この式を用いることで、式の中で使用されているすべての変数vとその型の列名aに対して、同様の式を追加することにより、安全でないクエリ式を同等の安全なクエリ式に書き換えることができます。これは実質的に、すべての変数がアクティブ ドメインの範囲を自由に動かせることを意味します。既に説明したように、表現されたクエリがドメインに依存しない場合は、意味論は変わりません。