データベース設計 関係代数 講師: 福田 剛志 fukudat@fukudat.com http://www.fukudat.com/ データベース設計 1 代数 (algebra) とは何か • 代数とは – 引数 (operand): 変数 または 定数 – 演算子 (operator): 引数から新しい値を計算する手 続きを表す記号 からなる数学体系 • たとえば, – 引数: 有理数をとる変数 または 定数 – 演算子: 四則演算 (+,-,×,÷) は代数を構成する データベース設計 2 関係代数 (relational algebra) とは何か • 引数がリレーションあるいはリレーションをあら わす変数または定数であるような代数 • 演算子はデータベースで必要とされるほとんど のことが実現できるようにデザインされている – そのため,関係代数はリレーションのための問合せ 言語として使用される データベース設計 3 今回の概要 • 一般に「伝統的」関係代数といわれる部分に含 まれる演算子と, • 実際のデータベース問合せ言語である SQL を うまくモデル化するために追加された演算子が ある. データベース設計 4 「伝統的」関係代数 • 和 (union),交差 (intersection),差 (difference): – 通常の集合演算と同じ.ただし,両辺のリレーション スキーマが等しくなければならない. • • • • 選択 (selection): 一部の行を選び出す 射影 (projection): 一部のカラムを選び出す 直積 (product) と 結合 (join) リレーション,属性の名前の付け替え データベース設計 5 和 (union)・交差(intersection)・差 (difference) S R A a1 a2 和(union) B b1 b2 B b1 b2 b3 b4 B b1 b3 b4 C c1 c3 c4 差(difference) 交差(intersection) R−S R∩S R ∪S A a1 a2 a3 a4 A a1 a3 a4 C c1 c2 C c1 c2 c3 c4 A a1 B b1 C c1 データベース設計 A a2 B b2 C c2 6 選択 (selection) • R1 := SELECTC (R2) – C は R2 の属性を参照する条件 – R1 は条件 C を満たすような R2 のタプルすべて – 名前 八海山本醸造 久保田千寿 久保田万寿 日本酒 製造元 八海酒造 朝日酒造 朝日酒造 精米歩合 55% 55% 35% 朝日酒造の日本酒 = σ製造元=“朝日酒造”(日本酒) 名前 製造元 精米歩合 55% 久保田千寿 朝日酒造 35% 久保田万寿 朝日酒造 データベース設計 7 射影 (projection) • R1 := PROJL (R2) – L は R2 のスキーマから選んだ属性のリスト – R1 は R2 の各タプルの L にある属性を,その指定さ れた順番で,抜き出したもの. 名前 八海山本醸造 久保田千寿 久保田万寿 日本酒 製造元 八海酒造 朝日酒造 朝日酒造 精米歩合 55% 55% 35% 精米歩合 = π名前,精米歩合(日本酒) 名前 精米歩合 55% 八海山本醸造 55% 久保田千寿 35% 久保田万寿 データベース設計 8 直積 (Cartesian product) • R3 := R1 * R2 – R1 の各タプル t1 と R2 の各タプル t2 のペアを作る – t1 と t2 をつなげて,それを R3 のタプルとする – R3 のスキーマは R1 のスキーマと R2 のスキーマを (順序はそのままで)つなげたものになる. – 同じ名前の属性 A があったら, R1.A, R2.A のように 表記する データベース設計 9 直積の例 R1( A, 1 3 B) 2 4 R2( B, 5 7 9 C ) 6 8 10 R3( データベース設計 A, 1 1 1 3 3 3 R1.B, 2 2 2 4 4 4 R2.B, 5 7 9 5 7 9 C ) 6 8 10 6 8 10 10 θ -結合 (θ-join) • R3 := R1 JOINC R2 – R1 × R2 を求めて – その結果に σC を適用する • C は任意のブーリアン条件が使える – 古典的なバージョンの関係代数では,C は A θ B と いう形式のみが許されていた (θ は =, <, >, ≤, ≥ など の比較演算子)のでθ結合と呼ばれる データベース設計 11 θ-結合の例 酒(名前, 製造元) 販売(名前, 酒) 名前 つぼ八 つぼ八 ちちぶ 名前 八海山 久保田千寿 モルツ 梅ッシュ 酒 モルツ 八海山 久保田千寿 呑み屋情報 := 販売 販売.名前 つぼ八 つぼ八 ちちぶ 酒 モルツ 八海山 久保田千寿 製造元 八海酒造 朝日酒造 サントリー チョーヤ 販売.酒=酒.名前 酒 酒.名前 モルツ 八海山 久保田千寿 データベース設計 製造元 サントリー 八海酒造 朝日酒造 12 自然結合 (natural join) • – 同じ名前の属性の値が等しいことを条件として, – 同じ名前の属性は一方だけを残す 製造(酒名, 製造元) 呑み屋(店名, 酒名) 店名 つぼ八 つぼ八 ちちぶ 酒名 八海山 久保田千寿 モルツ 梅ッシュ 酒名 モルツ 八海山 久保田千寿 呑み屋情報 := 呑み屋 店名 つぼ八 つぼ八 ちちぶ 酒名 モルツ 八海山 久保田千寿 データベース設計 製造元 八海酒造 朝日酒造 サントリー チョーヤ 製造 製造元 サントリー 八海酒造 朝日酒造 13 名前の付け替え (renaming) • – R1 のスキーマを A1, ..., An に変更する – R2 のタプルは R1 と同じ – R2(A1, ..., An) := R1 と書いてもよい データベース設計 14 複雑な代数式 • 代数では,演算子を組み合わせて,複雑な操作 を自然に表現することができる. – たとえば,算術演算の (x + 4)*(y – 3) • 関係代数でも同じ – 代入 – 演算子を組み合わせた式 – 式の木 データベース設計 15 代入の列 (sequence of assignments) • 一時的なリレーションの名前を作る. • たとえば, – は – – と同じ データベース設計 16 代入の中の式 • たとえば – は – と同じ • 演算子の優先順位 • 単項演算子が最高の優先度をもつ • 次に,直積と結合 • その次に,交差 • 最後に,和集合と差集合 • 当然,括弧を使って順序を指定することができる データベース設計 17 式の木 (expression tree) • 末端ノード(葉)はリレーションまたは固定のリ レーションを表す定数 • 内部ノードはその子ノードに適用される演算子 データベース設計 18 例 (1) 呑み屋(名前,住所) と 販売(呑み屋, 酒, 値段) から,大久保にあって,一番絞 りを450円より安く売っている呑み屋の名前をすべて列挙せよ RENAMER(名前) π名前 σ住所 = “大久保” π呑み屋 σ値段<450 and 酒=“一番絞り” 呑み屋 販売 データベース設計 19 例 (2) 販売(呑み屋, 酒, 値段) から,同じ値段で2種類の酒を売っている 呑み屋を見つけて,すべて報告せよ π呑み屋 σ酒 ≠ 酒1 RENAMES(呑み屋, 酒1, 値段) 販売 販売 データベース設計 20 バッグ上の関係代数 (relational algebra over bags) • バッグ (bag) は集合 (set) と似ているが,同じ値が複 数表れることを許す – マルチセット (multi-set) とも言う • 例えば – {1,2,1,3} はバッグ. – {1,2,3} もバッグだが,(たまたま)集合でもある. • バッグはリスト (list) とも似ているが,リストと違って順 序は気にしない • 例えば, – バッグとして {1,2,1} = {1,1,2} だが, – リストとしては [1,2,1] != [1,1,2] データベース設計 21 どうしてバッグを使うのか • 最も広く使われている言語 SQL が,実際にバッ グを用いている. – SQL は重複要素を取り除くこともできるが,それは ユーザが明示的にそう指定したときだけ. – 演算子によっては,集合に対するより,バッグに対す るほうが,はるかに効率的に実行できる • 例えば射影 (projection) データベース設計 22 バッグ上の演算 • 選択 (selection) は各タプルに適用するので, バッグに対する効果は,集合に対する効果と同 じ. – 重複のないタプルを選択しても重複しない. • 射影 (projection) はやはり各タプルに適用する が,バッグに対しては重複を除去しない. – 射影すると,重複することがある. • 直積と結合は,タプルのペアごとに実行される ので,バッグになっても何の影響もない データベース設計 23 バッグに対する選択の例 R( A, 1 5 1 B ) 2 6 2 σ A+B<5 (R) = S( A 1 1 B, 3 7 C ) 4 8 B 2 2 データベース設計 24 バッグに対する射影の例 R( A, 1 5 1 B ) 2 6 2 πA (R) = S( B, 3 7 C ) 4 8 A 1 5 1 データベース設計 25 バッグに対する直積の例 R( A, 1 5 1 RxS= B ) 2 6 2 A 1 1 5 5 1 1 R.B 2 2 6 6 2 2 S( B, 3 7 S.B 3 7 3 7 3 7 C 4 8 4 8 4 8 データベース設計 C ) 4 8 26 バッグに対する θ-結合の例 R( R A, 1 5 1 R.B<S.B B ) 2 6 2 S= A 1 1 5 1 1 S( B, 3 7 C ) 4 8 R.B 2 2 6 2 2 S.B 3 7 7 3 7 C 4 8 8 4 8 データベース設計 27 バッグに対する集合演算 • 和,交差,差はバッグに対して,新しい定義が必 要 • 和では出現回数の和をとる – 例えば: {1,2,1} ∪ {1,1,2,3,1} = {1,1,1,1,1,2,2,3} • 交差では出現回数の最小値をとる – 例えば: {1,2,1} ∩ {1,2,3} = {1,2}. • 差では,出現回数の差をとる. – 無論,出現回数は負にはならない – 例えば: {1,2,1} – {1,2,3} = {1}. データベース設計 28 注意: バッグの法則 != 集合の法則 • 集合で成り立っていた代数法則がすべてバッグ でも成り立つとは限らない. [成り立つ例] 和に対する交換法則 (R ∪ S = S ∪ R ) は,バッグでも成り立つ. – 足し算は可換なので,ある要素 x のRでの出現回数 とSでの出現回数の和は,R と S の順序によらない [成り立たない例] 集合では (R ∪ R = R ) だった が,バッグでは,一般に (R ∪ R ≠ R) – 各要素の出現回数が2倍になるから データベース設計 29 拡張演算子 • δ (デルタ) = 重複を除去する • τ (タウ) = タプルの順序をソートする • 射影の拡張: カラムの値の算術演算,カラムの 重複 • γ (ガンマ) = グルーピングと集約演算 • 外部結合 (outer join): 結合されないタプルが出 ないようにする結合 データベース設計 30 重複除去 (duplicate elimination) • R1 := DELTA(R2). – R1は バッグ – R2は 集合 – R2 は R1 に1回以上含まれる要素を一つずつ含む データベース設計 31 ソート (sorting) • R1 := TAUL (R2) – L は R1 の属性の(部分)リスト – R2 は R1 に含まれるタプルのリストで,Lについて ソートされている – これが唯一,結果が集合でもバッグでもなくリストと なる演算子 データベース設計 32 射影の拡張 (extended projection) • 射影 の L に単なる属性のリスト だけでなく,算術演算式を含むことを認めたもの – 例えば,属性の算術演算 A+B とか sqrt(C) など データベース設計 33 集約演算 (aggregation operation) • テーブルのカラム全体に適用されて,ひとつの 値を返す • 主な集約演算子の例: – 合計 SUM, 平均 AVG, カウント COUNT, 最小 MIN, 最大 MAX データベース設計 34 グルーピング演算子 (grouping operator) • R1 := GAMMAL (R2) – L は次のいずれかのリスト • グルーピングする属性 • 集約演算を属性に施したもの データベース設計 35 グルーピング&集約演算の例 R= A 1 4 1 B 2 5 2 C 3 6 5 γ A,B,AVG(C) (R) = ?? まず,R を A, B でグルーピング A B C 1 2 3 1 2 5 4 5 6 次に, 各グループ内で C の平均を取る: A 1 4 データベース設計 B 2 5 AVG(C) 4 6 36 外部結合 (outer join) • を考える • R のタプルで,結合される S のタプルがないも のを “dangling” タプルという – 逆も同様 • 外部結合 (outer join) は 対応する値がない部 分に特別な NULL値 を埋めて,dangling タプル を保存する. – と表記する. データベース設計 37 外部結合の例 R= A 1 4 B 2 5 S= B 2 6 C 3 7 (1,2) は (2,3) と結合するが,そのほかは dangling タプル A 1 4 NULL B 2 5 6 データベース設計 C 3 NULL 7 38
© Copyright 2024 Paperzz