データベースとは?
データベースとは、単なるデータの集まりではなく、様々な情報処理システムで利用できるようにデータを保存、検索、更新、削除できるように構成されたものです。コンピュータシステムにおいて、データベースの出現前までは、データベースの出現の前までは、データの集まりは、OSの提供する『ファイル』という概念で扱われていました。現在でも『ファイル』という概念は使用されていますが、大規模なデータを扱う情報処理システムにおいてはデータベースが利用されるようになりました。
なぜ大規模なデータを扱う場合にデータベースを用いるのか
ファイルを用いた場合は以下の問題が生じます。
①ファイルとプログラムが独立していない(ファイルの構成の変更は、利用している全てのアプリケーションプログラムの修正が必要)
②ファイルの内容の整合性管理が難しい(アプリケーションプログラムの誤った更新処理の検出が不可能)
③複数ファイル間でデータ項目が重複しやすい
④機密保護が不十分
⑤データの障害対策が不十分
ファイルシステムの欠点を補うためにデータベースが要求される機能
①データの共有化
→データベースの第一の目的は、企業などの広い組織においてなるべく広範囲でデータを共有し利用することです
②データの一元管理
→データ項目などの重複が削除されデータの素種作業を容易にすることができます。
③データのプログラムからの独立
→データ項目とプログラムの保守・変更作業がどちらも容易になります
④データの整合性維持
→意図しないデータや間違ったデータの入力を防ぐことが可能です
⑤データの障害回復
→ハードウェアやソフトウェアの障害によってデータベースが障害を受けた場合に、バックアップデータやログを用いて迅速に回復することができます
⑥データの機密保護
→アクセスするユーザーを識別し、データごとにアクセスできるデータを制限することにより、機密性を保つことができます
データベースの種類(データモデル)
階層データベース(階層データモデル)
データを木のような階層構造で表します。各実体をレコードとして表現し、レコード間の関係をポインタで表現します。階層構造の上位のレコードを親レコードと呼び、その親レコードと関連する下位のレコードを子レコードと呼びます。
ネットワークデータベース(ネットワークデータモデル)
データを網のような構造で表します。基本的には、階層構造でのデータモデルと同様に親子関係を採用していますが、親となる実体を複数持てるようにし、各実態の関係をより自然に表現できるようにしています。
関係データベース(関係データモデル)
今日最も多くのDBMSで採用されています。データを行と列による2次元の表で表します。リレーショナルデータベース(RDB)とも言います。階層データベースやネットワークデータベースでは、データ自体に階層構造や網構造を前提にしたモデリングが必要ですが、関係データベースでは、構造上の前提条件がなく、自由にデータベースの設計が可能です。関係データベースを管理するためのシステム(RDMS)には、IBM DB2, Microsoft SQL server, My SQL, PostgreSQL, FileMaker, H2 Databaseなどがあります。
オブジェクト思考データベース(オブジェクト思考データモデル)
名前の通りオブジェクト指向の考え方を採用したデータベースになります。データとソフトウェアの共有や再利用性を向上させるという観点から注目されるようになりました。
関係データベースの構成
関係データモデルとSQLの用語の対応
関係データモデル | SQL |
関係(リレーション) | 表(テーブル) |
タプル | 行(ロー、レコード) |
属性(アトリビュート) | 列(カラム、フィールド) |
定義域(ドメイン) | 定義域(ドメイン) |

Formal Term | Informal Term | Example |
relation variables | table, relvars, relation | Cources |
tuple variable | row, record, tuple | SE Emi 1234 Suzuki C |
cardinality | number of rows | 4 |
degree | number of columns | 5 |
attribute | column, field | COURCE |
primary key | unique identifier | SNO |
domain | data type | int, char |
リレーション
関係データベースでは、データをリレーションと呼びます。リレーションは見出し(ヘッディング)と本体(ボディー)のペアで構成されます。見出しは、n個の属性(アトリビュート)の集合です。この属性は、名前とデータ型のペアになっています。本体は、属性値の集合である組みです。あるいは、タプルの集合です。タプルに含まれる属性値は、名称とデータ型が見出しで指定されたものとそれぞれ一致していなければなりません。
ドメイン(domain, data type)
あるプログラミング言語、、、例えばC言語において、変数にはどのような値が代入されるかは無限の可能性があるわけではなく、値がとりうる範囲は有限です。なぜなら、コンピュータが表すことができるデータはどんなにハードウェアには限界があり、無限の値を代入することは不可能だからです。データ型とは、その変数に代入される可能性のある値の有限集合だと言えます。リレーショナルモデルにおいて、データ型のことをドメインと呼びます。つまりintやstringなどです。ある属性に含まれるデータの集合です。そしてこの定義域の一つ一つのデータを要素と言います。
カーディナリー
タプルの数
主キー(primary key, unique identifier)
行を一意(=重複がない)に識別するための列。
表から目的のデータを検索したり抽出したりするためには、1件1件のデータである行が識別できるようになっていなくてはなりません。行の識別は列の項目で行うので、そのためには、『データの値が空でなく、尚且つ決して重複しない列』が必要になります。
外部キー
関係データベースの表同士は、キーを介して関連付けられています。つまり他の表の主キーの列のことです。
関係データベース操作
制限(Restrict)
あるリレーションのうち、特定の条件にあうタプルだけを含んだリレーションを返します。実行結果は、元のリレーションの部分集合であると言えます。
関係代数
\(①\sigma_{属性}= _{‘値’}(テーブル)\)
\(②\sigma_{属性1}= _{‘値’}\vee _{属性2} = _{‘値’}(テーブル)\)
leap
\(①restrict(テーブル)(属性=’値’)\)
\(②restrict(テーブル)((属性1=’値’)or(属性2=’値’))\)
射影(Projection)
あるリレーションにおいて、特定の属性だけを含んだリレーションを返します。属性が少なくなるとタプルに重複が生じる可能性があります。
関係代数
\(\pi_{属性1,属性2…}(テーブル)\)
leap
\(project(テーブル)(属性1,属性2…)\)
拡張(Extend)
射影とは反対に、属性を増やす操作です。多くの場合、新しい属性の値は、既存の属性の値を使って算出されます。
leap
\(spl_extend(テーブル)(アトリビュート)\)
Add
leap
(add(テーブル)(アトリビュートの内容1,…アトリビュートの内容n)\)
属性名変更(Rename)
単に属性の名前を変更する操作です。
関係代数
\(①\delta_{テーブル_{old}} → (テーブル_{new})\)
\(②\delta_{属性_{old}} → _{属性_{new}}(r)\)
leap
\(①rename(テーブル_{old})(テーブル_{new})\)
\(②rename(テーブル.属性_{old})(属性_{new})\)
和(Union)
2つのリレーションに含まれる、全てのタプルで構成されるリレーション(和集合)を返します。
関係代数
\(テーブル1\cupテーブル2\)
leap
\((テーブル1)union(テーブル2)\)
差(Difference)
2つのリレーションのうち、片方のリレーションにのみ含まれるタプルで構成されるリレーションを含みます。
関係代数
\(テーブル1-テーブル2\)
leap
\((テーブル1)minus(テーブル2)\)
積/交わり(Intersect)
2つのリレーションの交わり(共通部分)になっているリレーションを返します。
関係代数
\(テーブル1\capテーブル2\)
leap
\((テーブル1)intersect(テーブル2)\)
直積(Product)
2つのリレーションのタプルをそれぞれ組み合わせたリレーションを返します。この時、生成されたリレーションの見出しには、2つのリレーションの見出しが持つ属性の全てが含まれます。
関係代数
\(A\times B\)
leap
\((テーブル1)product(テーブル2)\)
Divide
関係代数
\((テーブル1)\div(テーブル2)\)
leap
leapは、Divideをサポートしていないために、自分で実装する必要があります。下には、2つのテーブルが(左:テーブル1、右:テーブル2)あります。


\(rename(テーブル1.B)(B’)\)
\(mult~=~product(テーブル1)(テーブル2)\)
\(multAB~=~project(mult)(A,B)\)
\(minAB~=~(multAB)minus(テーブル2)\)
\(ans~=~(project(テーブル1)(A))minus(project(minsp)(A))\)
ansは、以下のようになります。

結合(Join)
共通の属性を持つ2つのリレーションを、その共通部分の属性の値が同じタプル同士を組み合わせたリレーションを返します。2つのテーブル(AとB)を結合します。leapの場合は、どの属性を元に結合するかを明確にする必要があります。
関係代数
\(A\Join B\)
leap
\(join(a)(b)(a.city = b.city)\)