R - fukudat

データベース設計
関係代数
講師: 福田 剛志
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