データベースマネジメント:関係データベース(最終更新:2015/12/06 16:33:45 JST)
関係データベース
現在よく利用されている関係データベースについて,関連する用語,関係データベースに関する演算,そして関係データベースの分解に相当する正規化について見ていく.
この章の内容
- 関係データベースの用語
- 関係データベースに関する演算
[*]下へ▼ ▲[#]上へ
関係データベースの用語(教科書14ページ)
関係データベースに関連する用語をいくつか見てみよう.
データモデルに関する用語(教科書14ページ)
実世界のデータをデータベース内に格納する際のデータの格納方法に相当するのがデータモデルである.データモデルには次のような種類がある(教科書14ページ図参照).
- 階層型
- 子データが1つの親データを持つ形式.木構造とも呼ばれる.1対多の関係になる
- ネットワーク型
- 子データが1つ以上の親データを持つ形式.網目状になる.多対多の関係になる
- 関係型
- 2次元の表でデータを表す形式.この講義で主として扱う関係データベース.後で詳述
- オブジェクト指向型
- データと処理手続きのオブジェクト指向型データを扱う形式
今のところ,関係型である関係データベース(リレーショナルデータベース)が一番普及している.
[*]下へ▼ ▲[#]上へ
関係データベースの用語(教科書15ページ)
関係データベースの各要素を表す用語を押さえておくことが重要である.次のようなものがある(教科書15ページ図参照)
- テーブル(表),リレーション(関係)
- データを格納する領域.いわゆる表
- レコード,行(ロー,row),組(レコード)
- 1行分のデータ.データ1件
- フィールド,列(カラム,column),属性(アトリビュート)
- データの項目
- 定義域
- フィールドの取りうる値の範囲
- 一意
- フィールドの値がレコード間で重複しないこと.ユニークとも呼ばれる
- NULL(ヌル)
- データが空である状態.なお0とNULLは異なる.空値,NULL値とも呼ばれる
- データ型
- フィールドの値が取りうるデータの形式(教科書17ページの表参照)
[*]下へ▼ ▲[#]上へ
関係データベースに関する演算(教科書19ページ)
データベースは単にデータを蓄積するだけでなく,データを処理できなければならない.そのために演算が用意されている.ここではその代表的なものを見ていく.これらの演算は別名,関係代数と呼ばれることもある.関係データベースの演算は大きく関係データベース独自の演算である関係演算(relational operation)と一般の集合に対する演算である集合演算(set operation)に大別できる.
教科書では,関係演算→集合演算の順に説明がされているが,逆の集合演算→関係演算の方が理解しやすいため,順序を入れ替える.
集合演算(教科書22ページ)
集合演算として,和(union),差(difference),積(intersection),直積(cartesian product)の4つを取り上げる.ただし,集合演算のうち,直積を除く演算には型適合という条件が必要である.
型適合(教科書にはありません)
和,積,差の3種の演算では次にすべての条件を満たす型適合でないと演算が行えないので注意されたい.
- 2つのテーブルのフィールド数(列数)が等しいこと
- 2つのテーブルのフィールドの名前と並びが等しいこと
- 同じ名前のフィールドの定義域(とりうる値の範囲,種類)が等しいこと
和(教科書22ページ)
いずれかのテーブルに含まれるレコードをすべて集める演算である.「または」あるいは「OR」の意味を持つ.
和演算の例として[捕手]表と[外野手]表の和演算[捕手または外野手]を以下に示す.重複するレコードは1つだけになっていることに注意すること.[外野手または捕手]で順序を入れ替えても得られる結果は同じである.
[捕手]
背番号 | 氏名 |
2 | 城島健司 |
8 | 浅井良 |
50 | 藤井彰人 |
|
[外野手]
背番号 | 氏名 |
6 | 金本知憲 |
8 | 浅井良 |
31 | 林威助 |
|
[捕手∪外野手]
背番号 | 氏名 |
2 | 城島健司 |
6 | 金本知憲 |
8 | 浅井良 |
31 | 林威助 |
50 | 藤井彰人 |
|
差(教科書23ページ)
差演算は,一方の表にあって,もう一方の表にないレコードを取り出す演算である.同じ2つの表でもどちらを基準に取るかにより結果が異なる.
差演算は,引かれる側のテーブル[R]のレコードから引く側のテーブル[S]に属するレコードを除く演算と定義できる.[R−S]のレコードは[R]に属して,かつ[S]に属さないことを意味する.[R]から両者の共通部分以外を取り出す演算とみなすことができる.
差演算の例として[捕手]と[外野手]の差演算[捕手であり外野手でない選手]を以下に示す.
[捕手]
背番号 | 氏名 |
2 | 城島健司 |
8 | 浅井良 |
50 | 藤井彰人 |
|
[外野手]
背番号 | 氏名 |
6 | 金本知憲 |
8 | 浅井良 |
31 | 林威助 |
|
[捕手−外野手]
背番号 | 氏名 |
2 | 城島健司 |
50 | 藤井彰人 |
|
積(教科書23ページ)
積演算は,両方の表に共通するレコードを抜き出す演算である.また2つのテーブルの共通部分を取り出すことから共通とも呼ばれる.「かつ」あるいは「AND」の意味を持つ.
積演算の例として[捕手]と[外野手]の積演算[捕手かつ外野手]を以下に示す.
[捕手]
背番号 | 氏名 |
2 | 城島健司 |
8 | 浅井良 |
50 | 藤井彰人 |
|
[外野手]
背番号 | 氏名 |
6 | 金本知憲 |
8 | 浅井良 |
31 | 林威助 |
|
|
直積(教科書24ページ)
直積は,集合演算の中で型適合の条件を必要としない.直積演算は,2つのテーブルのレコードをすべて組み合わせる演算になる.演算結果のテーブルのフィールド数は2つのテーブルのフィールド数の和になる.またレコード数は2つのテーブルのレコード数の積になる.
直積演算の例として[捕手]と[道具]の直積演算である[捕手×道具]を以下に示す.
[捕手]
背番号 | 氏名 |
2 | 城島健司 |
8 | 浅井良 |
50 | 藤井彰人 |
|
|
[捕手×道具]
背番号 | 氏名 | 道具名 | 個数 |
2 | 城島健司 | ミット | 2 |
2 | 城島健司 | プロテクタ | 1 |
8 | 浅井良 | ミット | 2 |
8 | 浅井良 | プロテクタ | 1 |
50 | 藤井彰人 | ミット | 2 |
50 | 藤井彰人 | プロテクタ | 1 |
|
[*]下へ▼ ▲[#]上へ
関係演算(教科書19ページ)
関係演算として,選択(selection),射影(projection),結合(join),商(division)の4つを取り上げる.
選択(教科書19ページ)
選択はテーブルからレコード(行)を取り出す演算である.教科書19ページの図の例では,商品コード101と102を持つレコードを取り出したことに相当する.
選択は,あるテーブルのデータ項目間を比較する演算を行い,条件を満たすレコードを取り出して新しいテーブルを生成する演算である.なお,データ項目間だけでなく,データ項目と定数の比較でもよい.比較演算は,等しい(=),等しくない(≠),小さい(<),以下(≤),大きい(>),以上(≥)が用いられる.
選択の例として[選手]表をフィールド<打席>="右打"で選択した結果を以下に示す.
[選手]
背番号 | 氏名 | 守備位置 | 打席 |
2 | 城島健司 | 捕手 | 右打 |
6 | 金本知憲 | 外野手 | 左打 |
31 | 林威助 | 外野手 | 左打 |
50 | 藤井彰人 | 捕手 | 右打 |
|
[選手]を<打席>="右打"で選択
背番号 | 氏名 | 守備位置 | 打席 |
2 | 城島健司 | 捕手 | 右打 |
50 | 藤井彰人 | 捕手 | 右打 |
|
射影(教科書20ページ)
射影はフィールド(列)単位に取り出す演算である.教科書20ページの図の例では,商品名フィールドのみを抽出している.
射影は,あるテーブルからフィールドを取り出して新しいテーブルを生成する演算である.このとき注意すべきことは,新しく生成されたテーブルのレコードで重複するものがある場合は1つを残して他を取り除く必要がある.
射影演算の例として[選手]表をフィールド<守備位置>と<打席>で射影した結果を以下に示す.重複するレコードは1つだけになっていることに注意すること.
[選手]
背番号 | 氏名 | 守備位置 | 打席 |
2 | 城島健司 | 捕手 | 右打 |
6 | 金本知憲 | 外野手 | 左打 |
31 | 林威助 | 外野手 | 左打 |
50 | 藤井彰人 | 捕手 | 右打 |
|
[選手]を<守備位置>と<打席>で射影
守備位置 | 打席 |
捕手 | 右打 |
外野手 | 左打 |
|
結合(教科書20ページ)
結合は,複数のテーブルを特定のフィールドに着目して1つのテーブルにまとめる演算である.教科書20ページの図の例では,[注文]表と[商品]表を<商品コード>フィールドにより結合している.
結合は,2つのテーブルの直積の中から,指定された条件を満たすレコードを取り出して新しいテーブルを生成する演算である.レコードの取り出しには上述の選択演算を用いる.
結合演算の例として[守備位置]と[打席]を{背番号,氏名}={背番号,氏名}で結合した結果を以下に示す.手順としては,まず[守備位置]と[打席]の直積を求め,その結果について{背番号,氏名}={背番号,氏名}を満たすレコードを取り出し新しいテーブルを生成する.
[守備位置]
背番号 | 氏名 | 守備位置 |
2 | 城島健司 | 捕手 |
6 | 金本知憲 | 外野手 |
31 | 林威助 | 外野手 |
|
[打席]
背番号 | 氏名 | 打席 |
2 | 城島健司 | 右打 |
6 | 金本知憲 | 左打 |
8 | 浅井良 | 右打 |
|
[守備位置×打席]
背番号 | 氏名 | 守備位置 | 背番号 | 氏名 | 打席 |
2 | 城島健司 | 捕手 | 2 | 城島健司 | 右打 |
2 | 城島健司 | 捕手 | 6 | 金本知憲 | 左打 |
2 | 城島健司 | 捕手 | 8 | 浅井良 | 右打 |
6 | 金本知憲 | 外野手 | 2 | 城島健司 | 右打 |
6 | 金本知憲 | 外野手 | 6 | 金本知憲 | 左打 |
6 | 金本知憲 | 外野手 | 8 | 浅井良 | 右打 |
31 | 林威助 | 外野手 | 2 | 城島健司 | 右打 |
31 | 林威助 | 外野手 | 6 | 金本知憲 | 左打 |
31 | 林威助 | 外野手 | 8 | 浅井良 | 右打 |
|
[守備位置×打席]を{背番号, 氏名}={背番号, 氏名}で結合
背番号 | 氏名 | 守備位置 | 背番号 | 氏名 | 打席 |
2 | 城島健司 | 捕手 | 2 | 城島健司 | 右打 |
6 | 金本知憲 | 外野手 | 6 | 金本知憲 | 左打 |
|
比較演算子が「=」の場合は等結合と呼ばれる.等結合の場合は上記の例のようにまったく同じ内容のデータ項目が現れることになる.この重複するデータ項目を先の射影演算により取り除いた結合演算を特に自然結合と呼ぶ.
上記の[守備位置]と[打席]を{背番号, 氏名}={背番号, 氏名}で自然結合した結果は次のようになる.重複して冗長な<背番号>と<氏名>の一方が射影演算により取り除くことにより得られる.
[守備位置×打席]を{背番号, 氏名} = {背番号, 氏名}で自然結合
背番号 | 氏名 | 守備位置 | 打席 |
2 | 城島健司 | 捕手 | 右打 |
6 | 金本知憲 | 外野手 | 左打 |
商(教科書21ページ)
商はいわゆる割り算に相当する.割られるテーブルから割るテーブルのレコードをすべて含むレコードを取出し,その後割るテーブルに含まれるフィールドを取り除くことによって商が得られる.教科書22ページの図を参照のこと.
別の見方をすると,商はテーブルの中にレコードと別のテーブルの直積が含まれているときに,そのレコードの部分を取り出す演算である.割られるテーブルのフィールド数から割るテーブルのフィールド数を引いたものが取り出したレコードのフィールド数になる.
商演算の例として[選手]を次のそれぞれのテーブルで商を求めた結果を以下に示す.
[選手]
背番号 | 氏名 | 守備位置 | 打席 |
2 | 城島健司 | 捕手 | 右打 |
6 | 金本知憲 | 外野手 | 左打 |
31 | 林威助 | 外野手 | 左打 |
31 | 林威助 | 内野手 | 左打 |
50 | 藤井彰人 | 捕手 | 右打 |
|
|
[選手÷打席]
背番号 | 氏名 | 守備位置 |
2 | 城島健司 | 捕手 |
50 | 藤井彰人 | 捕手 |
|
|
[選手÷守備位置]
背番号 | 氏名 | 打席 |
31 | 林威助 | 左打 |
|
|
[選手÷守備位置と打席]
背番号 | 氏名 |
6 | 金本知憲 |
31 | 林威助 |
|
[*]下へ▼ ▲[#]上へ
このサイトに関するお問い合わせは,連絡先のページをご覧ください.