関係代数

データベース理論において関係代数は代数構造を用いてデータをモデル化し、それに対するクエリを十分な根拠に基づいた意味論に基づいて定義する理論です。この理論はエドガー・F・コッドによって提唱されました[1]

関係代数の主な応用は、関係データベース、特にSQLをはじめとするそのようなデータベース用のクエリ言語の理論的基礎を提供することです。関係データベースは、関係として表現された表形式のデータを格納します。関係データベースに対するクエリも同様に、関係として表現された表形式のデータを返します。

関係代数の主な目的は、1つ以上の入力リレーションを出力リレーションに変換する演算子を定義することです。これらの演算子は入力としてリレーションを受け取り、出力としてリレーションを生成するため、これらを組み合わせることで、複数の入力リレーション(そのデータはデータベースに保存されます)を単一の出力リレーション(クエリ結果)に変換する複雑なクエリを表現することができます。

単項演算子は、単一のリレーションを入力として受け取ります。例としては、入力リレーションから特定の属性(列)またはタプル(行)をフィルタリングする演算子などがあります。二項演算子は、2つのリレーションを入力として受け取り、それらを1つの出力リレーションに結合します。例えば、どちらかのリレーションにあるすべてのタプルを取得する(union)、最初のリレーションから2番目のリレーションにあるタプルを削除する(difference)、特定の条件に一致する2番目のリレーションのタプルで最初のリレーションのタプルを拡張する、などです。

導入

リレーショナル代数は、1970年にEF Coddリレーショナルデータモデルを発表するまで、純粋数学以外ではほとんど注目されていませんでした。[2] Coddは、このような代数をデータベースクエリ言語の基礎として提案しました。

関係代数は、タプルの同種集合に対して演算を行います。一般的に、m はテーブル内のタプルの行数、nは列数と解釈されます。各列のすべてのエントリは同じを持ちます。

リレーションには、ヘッダーと呼ばれる一意のタプルがあり、これにより各列にリレーション内で一意の名前または属性が付与されます。属性は、射影と選択で使用されます。

集合演算子

関係代数は、集合論の集合の和集合差集合、および直積を使用し、これらの演算子に追加の制約を加えて新しい演算子を作成します。

集合の和集合と差集合の場合、関係する2つの関係は和集合互換、つまり同じ属性集合を持つ必要があります集合は和集合と差集合によって定義されるため積集合に含まれる2つの関係も和集合互換である必要があります。

デカルト積を定義するには、関係する 2 つのリレーションに別々のヘッダーが必要です。つまり、共通の属性名があってはなりません。

さらに、直積は集合論における直積とは定義が異なり、タプルは演算上「浅い」ものとみなされます。つまり、nタプルの集合とmタプルの集合との直積は、「平坦化された」 ( n  +  m )タプルの集合となります(基本的な集合論では、それぞれnタプルとmタプルを含む2タプルの集合が規定されていました)。より正式には、R × Sは次のように定義されます。

デカルト積の基数は、その因子の基数の積、つまり | R × S | = | R | × | S | です。

投影

射影Π)は、属性名の集合である と書かれた単項演算ですこの射影結果は、R内のすべてのタプルを集合 に制限した場合に得られる集合として定義されます。

注: SQL標準で実装されている場合、「デフォルトの投影」はセットではなくマルチセットを返します。また、重複データを排除するΠ投影は、DISTINCTキーワードを追加することによって取得されます。

選択

一般化選択(σ)は、φが通常の選択で許されるアトムと論理演算子および)、または)、否定)からなる命題式である単項演算で、次のように記述されます。この選択は、 Rにおいてφが成立するすべてのタプルを選択します。

アドレス帳に登録されているすべての友人または仕事仲間のリストを取得するには、選択範囲を と記述します。結果は、 isFriendが true またはisBusinessContactが true であるすべての一意のレコードのすべての属性を含むリレーションになります

名前を変更

名前変更( ρ ) は単項演算で、 と記述されます。結果はRと同じですが、すべてのタプルのb属性がa属性に名前変更されます。これは、結合を目的としてリレーションの属性名を変更する場合によく使用されます。

リレーション内の「isFriend」属性の名前を「isBusinessContact」に変更するには、次のように使用できます。

また、Rxに、属性を に名前変更した表記法もあります[3]

結合と結合のような演算子

一般的な拡張機能

実際には、上で説明した古典的なリレーショナル代数は、外部結合、集約関数、さらには推移的閉包などのさまざまな操作によって拡張されます。[4]

外部結合

結合(または内部結合)の結果は、2つのオペランドの一致するタプルを結合して形成されたタプルで構成されますが、外部結合では、それらのタプルに加えて、一方のオペランドの一致しないタプルを、もう一方のオペランドの各属性の「埋め」値で拡張して形成されたタプルも含まれます。外部結合は、これまで議論してきた古典的なリレーショナル代数の一部とはみなされません。[5]

このセクションで定義される演算子は、埋め値として使用されるヌルω (ここでは定義しません)の存在を前提としています。これは実際にはSQLのNULLに相当します。結果のテーブルに対する後続の選択操作を意味のあるものにするためには、ヌルに意味を割り当てる必要があります。Coddのアプローチでは、選択に使用される命題論理は3値論理に拡張されますが、この記事ではその詳細は省略します。

左外部結合、右外部結合、完全外部結合の 3 つの外部結合演算子が定義されています。(「外部」という単語は省略されることがあります。)

左外部結合

左外部結合(⟕)はRSと表記されます。ここでRSは関係です。 [a]左外部結合の結果は、共通の属性名が等しいRSのすべてのタプルの組み合わせの集合です。さらに(大まかに言えば)Sに一致するタプルがないRのタプルも含まれていることになります。[要出典]

例として、EmployeeテーブルとDeptテーブル、およびそれらの左外部結合を考えます。

結果として得られる関係では、Rのタプルと共通の属性名に共通の値を持たないSのタプルは、ヌルωを取ります

Deptには、 DeptNameFinanceまたはExecutiveであるタプルがないため結果として生じる関係では、EmployeeのタプルのDeptNameFinanceまたはExecutiveであるωが発生します。

r 1 , r 2 , ..., r nを関係Rの属性とし{( ω , ..., ω )} を関係Sに固有の属性( Rの属性ではない属性)に関するシングルトン関係とします。すると、左外部結合は自然結合(したがって基本演算子を使用)を用いて以下のように記述できます。

右外部結合

右外部結合 (⟖) は左外部結合とほぼ同じように動作しますが、テーブルの役割が入れ替わります。

関係 RSの右外部結合はRSと表記されます[b]右外部結合の結果は、共通の属性名が等しいRSのすべてのタプルの組み合わせと、 Rに一致するタプルがないSのタプルの集合です。[要出典]

たとえば、EmployeeテーブルとDeptテーブル、およびそれらの右外部結合について考えます。

結果として得られる関係では、S内のタプルと共通の属性名に共通の値を持たないR内のタプルは、ヌルωを取ります

EmployeeにはDeptNameProductionあるタプルがないためDeptのタプルのDeptNameがProductionある結果の関係の Name 属性と EmpId 属性にωが発生します。

s 1 , s 2 , ..., s nを関係Sの属性とし{( ω , ..., ω )}を関係Rに固有の属性( Sの属性ではない属性)に関するシングルトン関係とします。すると、左外部結合と同様に、右外部結合は以下のように自然結合を用いてシミュレートできます。

完全外部結合

外部結合(⟗) または完全外部結合は、実際には左外部結合と右外部結合の結果を結合します。

完全外部結合はRSと表記され、 RSは関係である[ c]完全外部結合の結果は、共通の属性名が等しいRSのタプルのすべての組み合わせの集合、および共通の属性名がRに一致するタプルを持たないSのタプルと、共通の属性名がSに一致するタプルを持たないRのタプルである[要出典]

例として、EmployeeテーブルとDeptテーブル、およびそれらの完全外部結合を考えます。

結果として得られる関係において、Sのタプルと共通の属性名に共通の値を持たないRのタプルは、ヌルωを取ります。Rタプルと共通の属性名に共通の値を持たないSのタプルもヌルωを取ります

完全外部結合は、次のように左外部結合と右外部結合 (つまり自然結合とセット結合) を使用してシミュレートできます。

RS = ( RS ) ∪ ( RS )

ドメイン計算のための演算

これまでに紹介した関係代数には、データドメイン上での計算を可能にするものは何もありません(等号を含む命題式の評価を除く)。例えば、2つの列の数値(例えば単価と数量)を掛け合わせて合計金額を求める式を、これまでに紹介した代数のみで記述することはできません。実用的なクエリ言語にはそのような機能があり、例えばSQL SELECTでは算術演算によって結果に新しい列を定義することができ、同様の機能がチュートリアルDのキーワードによってより明示的に提供されています[6]データベース理論では、これは拡張射影と呼ばれます[7] : 213 SELECT unit_price * quantity AS total_price FROM tEXTEND

集約

さらに、列の要素の合計など、列に対する様々な関数の計算も、これまでに紹介したリレーショナル代数では不可能です。ほとんどのリレーショナルデータベースシステムには、合計、カウント、平均、最大値、最小値の5つの集計関数が含まれています。リレーショナル代数では、スキーマ ( A 1A 2、... An )に対する集計演算は次のように記述されます。

ここで、各A j '(1 ≤ jk)は元の属性A i(1 ≤ in)の1つです。

gに先行する属性はグループ化属性であり、SQL の「group by」句のように機能します。その後、個々の属性に任意の数の集計関数が適用されます。この操作は任意のリレーションrに適用されます。グループ化属性はオプションであり、指定されていない場合は、操作が適用されるリレーション全体にわたって集計関数が適用されます。

Accountというテーブルがあり、 Account_Number、Branch_NameBalanceという3つの列があるとします。各支店の最大残高を調べたいとします。これはBranch_Name G Max( Balance ) ( Account ) で実行できます。支店に関係なく、すべての口座の最大残高を調べるには、 G Max( Balance ) ( Account )と記述します

グループ化は、 Branch_Name ɣ Max( Balance ) ( Account )と表記されることが多い[7]

推移閉包

リレーショナル代数はほとんどの実用的用途において十分に強力に思えますが、リレーショナル代数では表現できない、関係に関する単純で自然な演算子がいくつかあります。その一つが二項関係の推移閉包です。領域Dが与えられ、二項関係RがD × Dの部分集合であるとします。R推移閉包R +は、Rを含み、以下の条件を満たすD × Dの最小の部分集合です。

これは、 Rを可変引数としてR +を生成する関係代数式E ( R )が存在しないという事実を使って証明できる[8]

ただし、SQL は 1999 年からこのような固定小数点クエリを公式にサポートしており、それよりかなり前からこの方向でベンダー固有の拡張機能がありました。

クエリ最適化のための代数的特性の利用

三角形クエリR(A, B) ⋈ S(B, C) ⋈ T(A, C)2つの可能なクエリプラン。1つ目はST を最初に結合し、その結果をRと結合します。2つ目はRS を最初に結合し、その結果をTと結合します。

リレーショナルデータベース管理システムには、多くの場合、特定のクエリを最も効率的に実行する方法を決定するクエリオプティマイザが含まれています。クエリオプティマイザは、実行可能なクエリプランを列挙し、そのコストを推定し、推定コストが最も低いプランを選択します。クエリがリレーショナル代数の演算子で表現されている場合、クエリオプティマイザは、これらの演算子の代数的特性を用いて元のクエリを書き換えることで、実行可能なクエリプランを列挙できます。

クエリはツリーとして表現することができ

  • 内部ノードは演算子であり、
  • 葉は関係であり、
  • サブツリーは部分式です。

クエリオプティマイザの主な目的は、式ツリーを同等の式ツリーに変換することです。この場合、ツリー内の部分式によって生成される関係の平均サイズは、最適化前よりも小さくなります。第二の目的は、単一のクエリ内、または複数のクエリが同時に評価されている場合は、それらのすべてのクエリ内で共通の部分式を形成することです。第二の目的の根拠は、共通の部分式を一度計算すれば十分であり、その結果は、その部分式を含むすべてのクエリで使用できるということです。

このような変換に使用できる一連のルールを次に示します。

選択

選択演算子に関するルールは、クエリの最適化において最も重要な役割を果たします。選択演算子は、オペランドの行数を非常に効果的に減らす演算子であるため、式ツリー内の選択がリーフに向かって移動すると、(部分式によって生成される) 内部関係が縮小する可能性があります。

基本的な選択プロパティ

選択はべき等性(同じ選択を複数回適用しても、最初の選択以上の効果はありません)があり、可換性(選択を適用する順序は最終的な結果に影響しません)があります。

複雑な条件で選択範囲を分割する

より単純な条件の連言を条件とする選択は、それらの個々の条件が同じである選択のシーケンスと等価であり、選言を条件とする選択は、選択の和集合と等価です。これらの恒等式は、選択を結合して評価する選択の数を減らしたり、選択を分割して構成要素の選択を個別に移動または最適化したりするために使用できます。

選択と外積

外積は評価コストが最も高い演算子です。入力リレーションがN行M行の場合、結果には行が含まれます。したがって、外積演算子を適用する前に、両方のオペランドのサイズを小さくすることが重要です。

これは、外積の後に選択演算子(例: )が続く場合に効果的に実行できます。結合の定義を考慮すると、これが最も可能性の高いケースです。外積の後に選択演算子が続かない場合は、他の選択規則を使用して、式ツリーの上位レベルから選択をプッシュダウンすることができます。

上記の場合、条件Aは複合選択条件に関する分割規則を用いて条件BCDに分割されます。つまり、 BにはRの属性のみが含まれCにはPの属性のみが含まれ、DにはAのうちRPの両方の属性を含む部分が含まれます。なお、BC、またはDは空である可能性があります。この場合、以下の式が成り立ちます。

選択演算子と集合演算子

選択は、差集合、積集合、和集合の各演算子に対して分配的に行われます。式ツリーにおいて、選択を集合演算の下にプッシュするために、以下の3つの規則が使用されます。差集合と積集合の演算子については、変換後にオペランドの1つにのみ選択演算子を適用できます。これは、オペランドの1つが小さく、選択演算子の評価にかかるオーバーヘッドが、より小さな関係をオペランドとして使用することの利点を上回る場合に有効です。

選択と投影

選択条件で参照されるフィールドが射影のフィールドのサブセットである場合に限り、選択と射影は可換です。オペランドが外積または結合である場合、射影の前に選択を実行することは有用です。それ以外の場合、選択条件の計算コストが比較的高い場合は、選択を射影の外に移動することで、テスト対象となるタプルの数を減らすことができます(射影では省略されたフィールドに起因する重複が除去されるため、タプルの数が少なくなる可能性があるため)。

投影

基本的な投影特性

投影はべき等であるため、一連の(有効な)投影は最も外側の投影と同等になります。

射影と集合演算子

射影は集合の和集合に対して分配的です。

射影は交差と差集合に対して分配されない。反例として以下が挙げられる。

そして

ここで、bはb'とは異なるものと想定されます

名前を変更

基本的な名前変更プロパティ

変数の連続した名前変更を、1回の名前変更にまとめることができます。共通の変数を持たない名前変更操作は、互いに任意の順序で並べ替えることができ、これを利用して連続する名前変更を隣接させ、まとめることができます。

名前変更演算子と設定演算子

名前変更は、差集合、和集合、積集合に対して分配的です。

製品と結合

デカルト積は和集合に対して分配的である。

実装

コッド代数に基づいた最初のクエリ言語は、コッド博士自身が開発したAlphaでした。その後ISBLが作成され、この先駆的な研究は、コッドのアイデアを実用的な言語にする方法を示したとして、多くの権威者[9]から高く評価されています。Business System 12は、ISBLの例に倣った、短命ながら業界標準のリレーショナルDBMSでした。

1998年、クリス・デイトヒュー・ダーウェンはリレーショナルデータベース理論の教育を目的としたTutorial Dという言語を提案しました。この言語のクエリ言語もISBLの考え方に基づいています。 [10] RelはTutorial Dの実装です。BmgはRubyでリレーショナル代数を実装したもので、 Tutorial DThe Third Manifestoの原則に厳密に従っています[11]

SQLのクエリ言語でさえ、関係代数に緩く基づいています。ただし、SQLのオペランド(テーブル)は厳密には関係ではなく、関係代数に関するいくつかの有用な定理はSQLの対応するテーブルには当てはまりません(おそらく、最適化ツールやユーザーにとって不利です)。SQLのテーブルモデルは、集合ではなくバッグ(多重集合)です。例えば、式は集合上の関係代数の定理ですが、バッグ上の関係代数の定理ではありません。[7]

参照

注記

  1. ^ Unicodeでは、左外部結合記号は ⟕ (U+27D5) です。
  2. ^ Unicodeでは、右外部結合記号は⟖ (U+27D6) です。
  3. ^ Unicodeでは、完全外部結合記号は⟗ (U+27D7) です。

参考文献

  1. ^ Codd, EF (1970). 「大規模共有データバンクのためのリレーショナルデータモデル」Communications of the ACM . 13 (6): 377– 387. doi : 10.1145/362384.362685 . S2CID  207549016.
  2. ^ Maddux, Roger D. (1991-09-01). 「関係代数の起源:関係計算の発展と公理化における」 . Studia Logica . 50 (3): 421– 455. doi :10.1007/BF00370681. ISSN  1572-8730.
  3. ^ シルバーシャッツ、アブラハム、ヘンリー・F・コルト、S・スダルシャン(2020年)。『データベースシステムの概念』(第7版)。ニューヨーク。56ページ。ISBN 978-0-07-802215-9. OCLC  1080554130.{{cite book}}: CS1 maint: location missing publisher (link)
  4. ^ M. Tamer Özsu; Patrick Valduriez (2011). 『分散データベースシステムの原則(第3版)』 Springer. p. 46. ISBN 978-1-4419-8833-1
  5. ^ パトリック・オニール、エリザベス・オニール(2001). データベース: 原理、プログラミング、パフォーマンス、第2版. モーガン・カウフマン. p. 120. ISBN 978-1-55860-438-4
  6. ^ CJ Date (2011). SQLとリレーショナル理論:正確なSQLコードの書き方. O'Reilly Media, Inc. pp.  133– 135. ISBN 978-1-4493-1974-8
  7. ^ abc Hector Garcia-MolinaJeffrey D. UllmanJennifer Widom (2009).データベースシステム完全版(第2版). Pearson Prentice Hall. ISBN 978-0-13-187325-4
  8. ^ Aho, Alfred V.; Jeffrey D. Ullman (1979). 「データ検索言語の普遍性」.第6回ACM SIGACT-SIGPLANシンポジウム「プログラミング言語の原理」- POPL '79の議事録. pp.  110– 119. doi : 10.1145/567752.567763 . S2CID  3242505.
  9. ^ CJ Date. 「エドガー・F・コッド - AMチューリング賞受賞者」. amturing.acm.org . 2020年12月27日閲覧
  10. ^ CJ DateとHugh Darwen. 「データベース、型、そしてリレーショナルモデル:第三の宣言」(PDF) . 2024年7月4日閲覧
  11. ^ 「Bmgドキュメント」 。 2024年7月4日閲覧

さらに読む

  • RATリレーショナル代数トランスレータ リレーショナル代数をSQLに変換する無料ソフトウェア
  • 講義ビデオ: リレーショナル代数処理 - データベースシステムがリレーショナル代数を処理する方法の紹介
Retrieved from "https://en.wikipedia.org/w/index.php?title=Relational_algebra&oldid=1318554342"