データベース理論において、リレーショナル代数は代数構造を用いてデータをモデル化し、根拠のある意味論でクエリを定義する理論である。この理論はエドガー・F・コッドによって提唱された。[1]
リレーショナル代数の主な用途は、リレーショナル データベース、特にそのようなデータベースのクエリ言語(その中心はSQL )の理論的基礎を提供することです。リレーショナル データベースは、リレーションとして表される表形式のデータを格納します。リレーショナル データベースに対するクエリは、同様に、リレーションとして表される表形式のデータを返すことがよくあります。
リレーショナル代数の主な目的は、 1 つ以上の入力関係を出力関係に変換する演算子を定義することです。これらの演算子は関係を入力として受け入れ、関係を出力として生成するため、これらを組み合わせて、複数の入力関係 (そのデータはデータベースに格納されます) を単一の出力関係 (クエリ結果) に変換する複雑なクエリを表現することができます。
単項演算子は、単一の関係を入力として受け入れます。例としては、入力関係から特定の属性 (列) またはタプル(行) をフィルター処理する演算子があります。二項演算子は、2 つの関係を入力として受け入れ、それらを 1 つの出力関係に結合します。たとえば、いずれかの関係で見つかったすべてのタプルを取得する ( union )、2 番目の関係で見つかった最初の関係からタプルを削除する ( difference )、特定の条件に一致する 2 番目の関係のタプルを使用して最初の関係のタプルを拡張する、などです。
導入
リレーショナル代数は、1970 年にEF Coddによるリレーショナル データ モデルが発表されるまで、純粋数学以外ではほとんど注目されていませんでした。Codd は、このような代数をデータベース クエリ言語の基礎として提案しました。
リレーショナル代数は、タプルの同種セットに対して動作します。通常、m はテーブル内のタプルの行数、nは列数と解釈されます。各列のすべてのエントリは同じ型を持ちます。
リレーションには、ヘッダーと呼ばれる一意のタプルもあり、これにより、リレーション内の 各列に一意の名前または属性が与えられます。属性は、投影と選択で使用されます。
集合演算子
リレーショナル代数は、集合論の集合の和集合、差集合、および直積を使用し、これらの演算子に追加の制約を加えて新しい演算子を作成します。
集合の和集合と差集合の場合、関係する2 つの関係は和集合互換である必要があります。つまり、2 つの関係は同じ属性セットを持っている必要があります。集合の積集合は集合の和集合と差集合によって定義されるため、集合の積集合に含まれる 2 つの関係も和集合互換である必要があります。
デカルト積を定義するには、関係する 2 つのリレーションに別々のヘッダーが必要です。つまり、共通の属性名があってはなりません。
さらに、直積は、演算の目的上、組が「浅い」と見なされるという意味で、集合論における直積とは定義が異なります。つまり、 n組のセットとm組のセットの直積は、「平坦化された」( n + m )組のセットを生成します (一方、基本的な集合論では、それぞれn組とm組を含む 2 組のセットが規定されます)。より正式には、R × S は次のように定義されます。
デカルト積の基数は、その因子の基数の積、つまり | R × S | = | R | × | S | です。
投影
射影( Π ) は、 と記述される単項演算です。ここで、は属性名の集合です。このような射影の結果は、R内のすべてのタプルが集合 に制限されたときに得られる集合として定義されます。
注: SQL標準で実装されている場合、「デフォルトの投影」はセットではなくマルチセットを返します。また、重複データを排除するΠ投影は、DISTINCTキーワードを追加することで取得されます。
選択
一般化された選択( σ) は、 と記述される単項演算です。ここで、φ は、通常の選択で許可されるアトムと、論理演算子(および)、(または)、および(否定)で構成される命題式です。この選択は、 φ が成り立つR内のすべてのタプルを選択します。
アドレス帳内のすべての友人または仕事仲間のリストを取得するには、選択を と記述します。結果は、 isFriendが true またはisBusinessContactが true であるすべての一意のレコードのすべての属性を含むリレーションになります。
名前を変更
名前変更( ρ ) は、すべてのタプルのb属性がa属性に名前変更されることを除いて、結果はRと同一になる単項演算として記述されます。これは通常、結合の目的で リレーションの属性の名前を変更するために使用されます。
リレーション内の「isFriend」属性の名前を「isBusinessContact」に変更するには、次のように使用できます。
また、Rをxに、属性を に名前変更した表記法もあります。[2]
結合と結合のような演算子
自然な結合
自然結合 (⨝) は、 ( R ⨝ S )と記述される二項演算子です。ここで、 RとS は関係です。 [a]自然結合の結果は、共通の属性名が等しいRとS のタプルのすべての組み合わせの集合です。例として、EmployeeテーブルとDept テーブルとその自然結合を考えてみましょう。[引用が必要]
結果には Mary という名前の従業員も製造部門も表示されないことに注意してください。
これは、関係の合成を定義するためにも使用できます。たとえば、EmployeeとDeptの合成は、上記のように、共通属性DeptName を除くすべての属性に投影された結合です。カテゴリ理論では、結合はまさにファイバー積です。
自然結合は、論理 AND 演算子の関係版であるため、最も重要な演算子の 1 つであると言えます。AND で接続された 2 つの述語のそれぞれに同じ変数が出現する場合、その変数は同じものを表し、両方の出現は常に同じ値で置き換えられる必要があることに注意してください (これは、論理 AND のべき等性の結果です)。特に、自然結合では、外部キーによって関連付けられた関係を組み合わせることができます。たとえば、上記の例では、外部キーはおそらくEmployee . DeptNameからDept . DeptNameに保持され、その後、 EmployeeとDeptの自然結合によってすべての従業員とその部署が結合されます。これは、外部キーが同じ名前の属性間に保持されるため機能します。Dept . ManagerからEmployee . Nameへの外部キーのようにそうでない場合は、自然結合を行う前にこれらの列の名前を変更する必要があります。このような結合は、等価結合と呼ばれることもあります。
より正式には、自然結合のセマンティクスは次のように定義されます。
ここでFun(t) は、関係t (数学的な意味で)に対して、tが関数 (つまり、t がどの属性も複数の値にマッピングしない)である場合に真となる述語です。通常、 RとSには少なくとも 1 つの共通属性が必要ですが、この制約が省略され、RとSに共通属性がない場合、自然な結合はまさに直積になります。
自然な結合は、次のように Codd のプリミティブを使用してシミュレートできます。c 1、...、c mはRとSに共通する属性名、r 1、...、r n はRに固有の属性名、s 1、...、skはSに固有の属性名であると仮定します。さらに、属性名 x 1、...、x m はRにもSにも存在しないと仮定します。最初のステップでは、 Sの共通属性名を次のように名前変更できます。
次に、デカルト積を取り、結合するタプルを選択します。
最後に、名前が変更された属性を取り除くために投影を行います。
θ-結合と等結合
車とボートのモデルとそれぞれの価格をリストしたテーブルCarとBoatを考えてみましょう。顧客が車とボートを購入したいが、ボートに車よりも多くのお金を費やしたくないとします。述語CarPrice ≥ BoatPriceのθ結合 (⋈ θ )は、述語を満たす平坦化された行のペアを生成します。属性が等しい条件 (たとえば Price) を使用する場合、条件はPrice = Priceとして指定する ことも、( Price ) 自体として指定することもできます。
結合条件が単に共有属性の等価性ではない 2 つの関係からタプルを結合するには、より一般的な形式の結合演算子、つまりθ結合 (またはシータ結合) を使用すると便利です。θ結合は、またはと記述されるバイナリ演算子です。ここで、aとbは属性名、θは集合{<、≤、=、≠、>、≥ }内のバイナリ関係演算子、 υは値定数、RとSは関係です。この操作の結果は、θを満たすRとS内のタプルのすべての組み合わせで構成されます。θ結合の結果は、 SとRのヘッダーが互いに素である、つまり共通の属性が含まれていない場合にのみ定義されます。
したがって、この操作の基本操作でのシミュレーションは次のようになります。
- R ⋈ θ S = σ θ ( R × S )
演算子θ が等価演算子 (=) である場合、この結合は等価結合とも呼ばれます。
ただし、自然結合と選択演算子をサポートするコンピュータ言語では、θ結合も必要ありません。これは、自然結合の結果から選択することで実現できるためです (共有属性がない場合、これは直積に退化します)。
SQL 実装では、述語での結合は通常、内部結合と呼ばれ、onキーワードを使用すると、行をフィルター処理するために使用される述語を指定できます。重要な注意点: 平坦化された直積を形成してから行をフィルター処理することは概念的には正しいですが、実装では結合クエリを高速化するために、より洗練されたデータ構造が使用されます。
セミジョイン
左のセミジョイン(⋉と⋊)は、自然結合に似た結合で、と が関係であると記述されます。[b]結果は、 のタプルのうち、共通の属性名が等しい のタプルがある のすべてのタプルのセットです。自然結合との違いは、 の他の列が表示されないことです。たとえば、テーブルEmployeeとDeptとそのセミジョインを考えてみましょう。[要出典]
より正式には、セミ結合のセマンティクスは次のように定義できます。
ここで、は自然結合の定義と同じです。
セミ結合は、次のように自然結合を使用してシミュレートできます。がの属性名である場合、
基本的な演算子を使用して自然結合をシミュレートできるため、これは準結合にも当てはまります。
コッドの1970年の論文では、セミ結合は制限と呼ばれています。[1]
アンチジョイン
反結合 (▷) はR ▷ Sと書かれ、ここでRとS は関係です。[c] は半結合に似ていますが、反結合の結果は、共通の属性名が等しいタプルがSに存在しないRのタプルのみになります。[要出典]
例として、EmployeeテーブルとDept テーブル、およびそれらの逆結合を考えてみましょう。
アンチ結合は正式には次のように定義されます。
- R ▷ S = { t : t ∈ R ∧ ¬∃ s ∈ S ( Fun ( t ∪ s )) }
または
- R ▷ S = { t : t ∈ R 、 Fun ( t ∪ s )を満たすSのタプルs は存在しない}
ここで、Fun ( t ∪ s )は自然結合の定義と同じです。
アンチ結合は、次のようにセミ結合の 補数として定義することもできます。
このため、アンチ結合はアンチセミ結合と呼ばれることもあり、アンチ結合演算子は ▷ ではなく、上にバーが付いたセミ結合記号として記述されることもあります。
関係が同じ属性を持つ場合(結合互換)、antijoin は minus と同じです。
分割
除算 (÷) は、R ÷ Sと記述される二項演算です。除算は SQL では直接実装されていません。結果は、R内のタプルをRに固有の属性名に制限したものになります。つまり、 RのヘッダーにはあるがSのヘッダーにはない属性名です。そのため、 S内のタプルとのすべての組み合わせがRに存在することになります。
例
DBProject にデータベース プロジェクトのすべてのタスクが含まれている場合、上記の除算の結果には、データベース プロジェクトの両方のタスクを完了した学生が正確に含まれます。より正式には、除算のセマンティクスは次のように定義されます。
ここで、{ a 1 ,..., a n } はRに固有の属性名の集合であり、t [ a 1 ,..., a n ] はtのこの集合への制限です。通常、 Sのヘッダー内の属性名はRの属性名のサブセットである必要があります。そうでない場合、操作の結果は常に空になります。
基本演算による除算のシミュレーションは次のようになります。a 1、...、a n はRに固有の属性名であり、b 1、...、b m はSの属性名であると仮定します。最初のステップでは、R をその固有の属性名に投影し、 S内のタプルとのすべての組み合わせを構築します。
- T := π a 1 ,..., a n ( R ) × S
前の例では、T は、すべての学生 (学生は Completed テーブルの一意のキー/属性であるため) がすべての指定されたタスクと結合されるテーブルを表します。したがって、たとえば Eugene の場合、T には Eugene → Database1 と Eugene → Database2 の 2 つの行があります。
- EG: まず、「Completed」に「grade」という 3 番目の属性があると仮定します。これはここでは不要な荷物なので、常に投影する必要があります。実際、このステップでは、R から「Task」も削除できます。乗算によって、それが元に戻ります。
- T := π Student ( R ) × S // これにより、R に実際には存在しないものも含め、すべての可能な組み合わせが得られます (例: Fred |compiler1 は望ましい組み合わせではありません)。
次のステップではTからRを引く。
関係:
- U := T − R
Uには、Rに「存在した可能性がある」が、実際には存在しなかった可能性のある組み合わせがあります。
- EG: 再び投影の場合、TとR は同一の属性名/ヘッダーを持つ必要があります。
- U := T − π Student,Task ( R ) // これにより、「何が足りないか」のリストが得られます。
そこで、 Rに固有の属性名に投影すると、
すると、 Sのタプルとのすべての組み合わせがRに存在しないRのタプルの制約が得られます。
- V := π a 1 ,..., a n ( U )
- 例: プロジェクトU を問題の属性のみに絞り込む (学生)
- V := π学生( U )
したがって、残っているのは、Rの一意の属性名への投影を取り、Vのそれらを減算することです。
- W := π a 1 ,..., a n ( R ) − V
- 例えば、W := π Student ( R ) − V。
一般的な拡張機能
実際には、上で説明した古典的なリレーショナル代数は、外部結合、集約関数、さらには推移的閉包などのさまざまな操作によって拡張されます。[3]
外部結合
結合 (または内部結合) の結果は、2 つのオペランドの一致するタプルを組み合わせて形成されたタプルで構成されますが、外部結合にはそれらのタプルに加えて、一方のオペランドの一致しないタプルをもう一方のオペランドの各属性の「埋める」値で拡張して形成されたタプルもいくつか含まれます。外部結合は、これまで説明してきた古典的なリレーショナル代数の一部とは見なされません。[4]
このセクションで定義される演算子は、埋める値に使用されるヌル値ω (ここでは定義されていません)が存在することを前提としています。実際には、これは SQL のNULLに相当します。結果のテーブルに対する後続の選択操作を意味のあるものにするには、ヌルに意味を割り当てる必要があります。Codd のアプローチでは、選択で使用される命題論理は3 値論理 に拡張されますが、この記事ではその詳細は省略します。
左外部結合、右外部結合、および完全外部結合の 3 つの外部結合演算子が定義されています。(「外部」という単語は省略されることがあります。)
左外部結合
左外部結合 (⟕) はR ⟕ Sと表記され、RとS は関係です。[d]左外部結合の結果は、共通の属性名が等しいRとSのタプルのすべての組み合わせの集合です。さらに、(大まかに言えば) Sに一致するタプルがないRのタプルも含まれていることになります。[要出典]
例として、EmployeeテーブルとDept テーブル、およびそれらの左外部結合を考えてみましょう。
結果として得られる関係では、Rのタプルと共通の属性名に共通の値を持たないSのタプルは、ヌル値ω をとります。
Deptには、 DeptNameがFinanceまたはExecutiveであるタプルがないため、結果として生じる関係では、EmployeeのタプルのDeptNameがFinanceまたはExecutiveであるωが発生します。
r 1、r 2、...、r n を関係Rの属性とし、{( ω、...、ω )} を関係Sに固有の属性( Rの属性ではない属性)に関するシングルトン関係とします。すると、左外部結合は、自然結合の観点から(したがって基本演算子を使用して)次のように記述できます。
右外部結合
右外部結合 (⟖) は左外部結合とほぼ同じように動作しますが、テーブルの役割が入れ替わります。
関係 RとSの右外部結合は、R ⟖ Sと記述されます。[e]右外部結合の結果は、共通の属性名が等しいRとSのタプルのすべての組み合わせと、 Rに一致するタプルがないSのタプルの集合です。[要出典]
たとえば、EmployeeテーブルとDeptテーブル、およびそれらの右外部結合について考えます。
結果として得られる関係では、S内のタプルと共通の属性名に共通の値を持たないR内のタプルは、ヌル値ω をとります。
EmployeeにはDeptNameがProductionであるタプルがないため、DeptのタプルのDeptNameがProductionであった結果の関係の Name 属性と EmpId 属性に ω が発生します。
s 1、s 2、...、s n を関係Sの属性とし、{( ω、...、ω )} を関係Rに固有の属性( Sの属性ではない属性)のシングルトン関係とします。すると、左外部結合と同様に、右外部結合は次のように自然結合を使用してシミュレートできます。
完全外部結合
外部結合(⟗) または完全外部結合は、実際には左外部結合と右外部結合の結果を結合します。
完全外部結合はR ⟗ Sと表記され、RとS は関係です。[f]完全外部結合の結果は、共通の属性名が等しいRとS のタプルのすべての組み合わせの集合、および共通の属性名がRに一致するタプルを持たないSのタプルと、共通の属性名がSに一致するタプルを持たないRのタプルです。[要出典]
例として、EmployeeテーブルとDept テーブル、およびそれらの完全外部結合を考えてみましょう。
結果として得られる関係では、S内のタプルと共通の属性名に共通の値を持たないR内のタプルは、ヌル値ωを取ります。R内のタプルと共通の属性名に共通の値を持たないS内のタプルも、ヌル値ωを取ります。
完全外部結合は、次のように左外部結合と右外部結合 (つまり自然結合とセット結合) を使用してシミュレートできます。
- R ⟗ S = ( R ⟕ S ) ∪ ( R ⟖ S )
ドメイン計算のための操作
これまでに紹介したリレーショナル代数には、データドメイン上での計算を可能にするものは何もありません(等号を含む命題式の評価を除く)。たとえば、2つの列の数値(たとえば、単価と数量を掛け合わせて合計価格を求める)を掛け合わせる式を書くことは、これまでに紹介した代数だけでは不可能です。実際のクエリ言語にはそのような機能があり、たとえばSQL SELECTでは算術演算によって結果に新しい列を定義できます。また、同様の機能がチュートリアルDのキーワードによってより明示的に提供されています。[5]データベース理論では、これを拡張射影と呼びます。[6] : 213 SELECT unit_price * quantity AS total_price FROM tEXTEND
集約
さらに、列の要素の合計など、列に対するさまざまな関数の計算も、これまでに紹介したリレーショナル代数では不可能です。ほとんどのリレーショナル データベース システムには、5 つの集計関数が含まれています。これらの操作は、合計、カウント、平均、最大、最小です。リレーショナル代数では、スキーマ ( A 1、A 2、... An )に対する集計操作は次のように記述されます。
ここで、各A j '(1 ≤ j ≤ k)は元の属性A i(1 ≤ i ≤ n)の1つです。
gの前の属性はグループ化属性であり、SQL の「group by」句のように機能します。次に、個々の属性に適用される集計関数が任意の数あります。操作は任意の関係rに適用されます。グループ化属性はオプションであり、指定されていない場合は、操作が適用される関係全体にわたって集計関数が適用されます。
Accountというテーブルがあり、 Account_Number、Branch_Name、Balanceという 3 つの列があるとします。各支店の最大残高を調べたいとします。これは、Branch_Name G Max( Balance ) ( Account ) で実行できます。支店に関係なくすべての口座の最大残高を調べるには、単にG Max( Balance ) ( Account )と記述します。
グループ化は、 Branch_Name ɣ Max( Balance ) ( Account )と表記されることが多い。[6]
推移閉包
リレーショナル代数はほとんどの実用目的に十分強力であるように見えますが、リレーショナル代数では表現できない関係に対する単純で自然な演算子がいくつかあります。その 1 つが、2 項関係の推移閉包です。ドメインDが与えられ、2 項関係RがD × Dのサブセットであるとします。Rの推移閉包R + は、R を含み、次の条件を満たす D × Dの最小のサブセットです。
これは、 Rを可変引数としてとり、R +を生成する関係代数式E ( R )が存在しないという事実を使って証明できる。[7]
ただし、SQL は 1999 年からこのような固定小数点クエリを公式にサポートしており、それよりかなり前からこの方向でベンダー固有の拡張機能がありました。
実装
コッド代数に基づいた最初のクエリ言語は、コッド博士自身が開発した Alpha でした。その後、ISBLが作成され、この先駆的な作業は、コッドのアイデアを有用な言語にする方法を示したとして、多くの権威者[8]から高く評価されました。Business System 12 は、ISBL の例に倣った、短命ながら業界標準のリレーショナル DBMS でした。
1998年にChris DateとHugh Darwenはリレーショナルデータベース理論の教育に使用することを目的としたTutorial Dという言語を提案しました。そのクエリ言語もISBLのアイデアに基づいています。 [9] RelはTutorial Dの実装です。BmgはRubyでリレーショナル代数を実装したもので、 Tutorial DとThe Third Manifestoの原則に厳密に従っています。[10]
SQLのクエリ言語もリレーショナル代数に緩く基づいていますが、SQL のオペランド (テーブル) は厳密には関係ではなく、リレーショナル代数に関するいくつかの有用な定理は SQL の対応物には当てはまりません (おそらく最適化者やユーザーに不利益となる)。SQL テーブル モデルは、セットではなくバッグ (マルチセット) です。たとえば、式はセット上のリレーショナル代数の定理ですが、バッグ上のリレーショナル代数の定理ではありません。[6]
参照
注記
参考文献
- ^ ab Codd, EF (1970). 「大規模共有データバンクのためのリレーショナルデータモデル」Communications of the ACM . 13 (6): 377–387. doi : 10.1145/362384.362685 . S2CID 207549016.
- ^ シルバーシャッツ、アブラハム、ヘンリー・F・コルト、S・スダルシャン(2020年)。データベースシステムの概念(第7版)。ニューヨーク。p.56。ISBN 978-0-07-802215-9. OCLC 1080554130.
{{cite book}}: CS1 maint: location missing publisher (link) - ^ M. Tamer Özsu、Patrick Valduriez (2011)。分散データベースシステムの原則(第3版)。Springer。p. 46。ISBN 978-1-4419-8833-1。
- ^ パトリック・オニール、エリザベス・オニール(2001)。データベース: 原則、プログラミング、パフォーマンス、第 2 版。モーガン・カウフマン。p. 120。ISBN 978-1-55860-438-4。
- ^ CJ Date (2011)。SQL とリレーショナル理論: 正確な SQL コードの書き方。O'Reilly Media, Inc. pp. 133–135。ISBN 978-1-4493-1974-8。
- ^ abc Hector Garcia-Molina ; Jeffrey D. Ullman ; Jennifer Widom (2009).データベースシステム: 完全版(第2版). Pearson Prentice Hall. ISBN 978-0-13-187325-4。
- ^ Aho, Alfred V.; Jeffrey D. Ullman (1979). 「データ検索言語の普遍性」。プログラミング言語の原理に関する第 6 回 ACM SIGACT-SIGPLAN シンポジウムの議事録: 110–119。doi : 10.1145 / 567752.567763。S2CID 3242505。
- ^ CJ Date. 「エドガー・F・コッド - AMチューリング賞受賞者」. amturing.acm.org . 2020年12月27日閲覧。
- ^ CJ Date と Hugh Darwen。「データベース、型、リレーショナル モデル: 第三の宣言」(PDF) 。2024 年 7 月 4 日閲覧。
- ^ 「Bmg ドキュメント」 。2024年 7 月 4 日閲覧。
さらに読む
- Imieliński, T. ; Lipski, W. (1984). 「データと円筒代数のリレーショナルモデル」. Journal of Computer and System Sciences . 28 : 80–102. doi : 10.1016/0022-0000(84)90077-1 .(円筒代数との関係について)。
外部リンク
- RAT リレーショナル代数トランスレータ リレーショナル代数を SQL に変換する無料ソフトウェア
- 講義ビデオ: リレーショナル代数処理 - データベース システムがリレーショナル代数を処理する方法の紹介
- 講義ノート: リレーショナル代数 - SQL クエリをリレーショナル代数に適応させるための簡単なチュートリアル
- リレーショナル – リレーショナル代数のグラフィック実装
- クエリの最適化 この論文は、クエリの最適化におけるリレーショナル代数の使用法を紹介するものであり、より詳細な研究のための多数の引用が含まれています。
- Oracle および Microsoft SQL Server 用のリレーショナル代数システム
- Pireal – リレーショナル代数を扱うための実験的な教育ツール
- DES – リレーショナル代数やその他の形式言語を扱うための教育ツール
- RelaX - リレーショナル代数計算機 (登録なしでオンライン サービスとして利用できるオープン ソース ソフトウェア)
- RA: リレーショナル代数インタープリタ
- SQL をリレーショナル代数に変換する
