データベースの基本

DBの基本を勉強した。

web applicationの開発をしていて、そもそもDBってなんやねん!って思ってた。

 

DBってなんだ?

整理した形でデータを保存しておく「基地(Base)」。整理の方式は階層型、ネットワーク型、リレーショナル型がある。人気のリレーショナル型は1970年に、IBM研究所に勤めていたEdgar Frank 'Ted' Coddさんが提唱したそうな。'Ted'ってなんでしょうね。調べたけど、わかりませんでした。

DBの実体は、補助記憶装置であるハードディスクに格納されたファイルを指す。Excelで作ったファイルも、データを一箇所に集めたものという意味ではDBと言えるが、一般的にDBといった場合は、特定のプログラムだけでなく、複数のプログラムから利用できるデータを指す。そのためExcelやWordで作られたファイルはDBとは言わない。

コンピューターのプログラム構成からいうと、DBはミドルウェア(OSとアプリケーションの間にあって、複数のアプリケーションからアクセスできるもの)に分類される。DBはOS上で動き、各アプリケーションからの要求に応じて、データの書き換えを行う。

 

DBが持っている色んな種類のファイル

データファイル:データが入ってる

ログファイル:トランザクション(ユーザーから見て、一つの処理)の内容がログとして書き込まれる

リポジトリファイル:DBの物理構造が記録してあるバイナリファイル。具体的にはDB名と保存に使用しているデータファイル名、などなど

一時データ用ファイル:ソート操作を行うときとか、メモリが足りなくなった時のスワップ

バックアップファイル:データファイル用とログファイル用がある。定期的にデータファイルとログファイルのコピーをそれぞれ取ったもの。データファイルに障害が起きた時は、データファイルバックアップに、ログファイルの内容を再実行する

トレースログ:内部的に発生したイベントやエラーが記録してある

 

DBがデータを更新するまで

DBのデータが更新される間には、メモリとデータファイル、ログファイルの間で複数のやりとりが行われる。ちょっと複雑だけど、面白い。

1 SQLが入力される

2 メモリ上のSQLキャッシュに、全く同じコマンドがないかを探す(大文字小文字も区別されるらしい、実行計画を再利用するためにバインド変数が推奨されてるんだって)

3 あれば再利用、なければ入力されたSQLコンパイルする

4 該当データをデータファイルからメモリ上のバッファキャッシュに読み込む

5 該当データにロックをかける

6 メモリ上のログキャッシュに変更内容を記述する

7 該当データを変更後のデータに上書きする

8 ログキャッシュの内容をログファイルに書き込む(これがコミットと呼ばれるもの)

9 該当データのロックを解除する

10 定期的にログファイルから、データファイルへの書き込みが行われる。これをチェックポイントという。コミットと非同期にデータファイルに書き込む理由は以下がある。

 −データファイル書き込み時のI/O衝突を減らす

 −一つのデータに対して、数回に分けて更新があった場合、メモリ上の確定データのみを書き込むだけで良くなる

 

DBの機能を提供するプログラムをDBMS(Database Management System)と呼ぶ

DBはデータとプログラムが分離していて、プログラムの方をDBMS(Database Management System)と呼ぶ。

プログラムの利用形態は大きく分けて4つ。CRUD=>Crate/Read/Update/Delete

 

主要ベンダー

DB-Enginesという組織が毎月人気ランキングを発表している。2015年2月あたりからMongoDBがpsqlを追い越してる…

historical trend of the popularity ranking of database management systems

Oracle Database

Microsoft SQL Server

IBM DB2

MySQL(オープンソース)

PostgreSQL(オープンソース)

MongoDB(オープンソース)

 

SQLは2種類の言語に分類される

DBMSは、様々なアプリケーションから操作できるようにするため、SQL(Structured Query Language)という統一規格の言語で操作できるようになっている。1986-7年ごろから、ANSI(American National Standards Institute)とISO(International Organization for Standardization)で言語使用の標準化がされている。制定された年ごとにSQL:2008、SQL:2011なんかがあるらしいけど、各DBMSが採用しているかどうかは、ベンダー次第だって。

データの内容を定義し、DBを作成するSQL-DDL(Data Definition Language)

データを操作するSQL-DML(Data Manipulation Language)

の2種類でござる。

 

DBMSが提供する基本機能

DBMSがデータを管理するために持っている機能。

整合性制約機能:SQL-DDLでDBの内容を定義する際に設定し、CRUD処理が制約に違反すると実行を拒否する。同じ情報を2つ以上登録できないようにする一意制約、複数の表からなるDBで他の表に存在しないデータを登録できないようにする参照制約、空のデータを登録できないようにする非NULL制約、データ型が正しいかチェックする形式制約、値の範囲を制限する検査制約などがある。

 

セキュリティ機能:SQL-DDLの命令を使って設定する。ユーザーごとにデータへのアクセス権を制限できる。

アクセス権の種類

ALL すべてを許可

INSERT 登録を許可

SELECT 読み出しを許可

UPDATE 更新を許可

DELETE 削除を許可

 

トランザクション管理機能:ログファイルとDBの内容を一致させるタイミングのことをチェックポイントという。トランザクション管理機能には、障害回復と、ひとつのトランザクションが完了するまで、もう一方のトランザクションの開始を待たせておく排他制御がある。

障害回復には、システムに障害が発生したときに、実行直前のチェックポイントの状態にDBを戻すロールバックと、ログファイルをもとにチェックポイントと障害の間にコミットが完了している処理を再実行するロールフォワードがある。

排他制御には、他のトランザクションCRUDをまったく許さない排他ロックと、他のトランザクションに読み出し(READ)だけ許可する共有ロックがある。

トランザクション管理機能によって、トランザクションに必要なACID(Atomicity/Consistency/Isolation/Durability)という特性が実現できる。