データベース(DataBase:DB)。システム開発に必ずといっていいほど登場する、重要な要素です。
データベースは「データを保存しておくところ」のイメージです。でも保存するだけなら、ファイルに保存すればいいんじゃない?なぜそんな仰々しいものが必要なの?
もちろん、データベースには存在の理由があります。そのカギとなる考えが「ACID(アシッド)特性」です。
なぜDBが必要なのか
まずは、なんでDBがいるのか?ファイルに保存するだけじゃなぜダメなのか?を考えましょう。
大事な考えかた「トランザクション」
DBの必要性を考えるうえで、まず重要な考え方が、トランザクション。
トランザクション:データの変更を完了させる一連の操作
例えば「個人間送金」。山田さんが鈴木さんに¥300送るなら、データベース操作は次のとおり。
- 山田さんの残高から、¥300を引く
- 鈴木さんの残高に、¥300を足す
このとき、途中の「山田さんの残高から¥300引く」で終わってしまうと困ります。この操作は、、両方が完了することでトランザクション終了、となるわけです。
トランザクションは、データを「確実に」「正しく」「矛盾なく」管理するために必要な考え方です。
DBは、大量データへの複数アクセスをさばく
DBが必要な理由。それは、以下のようなシチュエーションの場合に必要だから。
- 大量のデータへの
- 複数のアクセスを
- 同時にさばく
大量のトランザクションが同時に発生しても、矛盾を起こさないこと、が重要です。これがDBの重要な役割です。
DBが持つべき4つの特性
トランザクションで矛盾を生じさせないために、DBが持つべき特性。それがACID特性です。
ACID特性とは、以下の4つの特性のことをいいます。頭文字4つを取って、ACIDですね。
- Atomicity(原子性) 中途半端に終わらないこと
- Consistency(一貫性) 結果に矛盾が起こらないこと
- Isolation(独立性) 他に影響を与えないこと
- Durability(永続性) 結果が失われないこと
単にファイルをデータに保存する、というだけだと、この特性を保つのは困難です。
DBは、ACID特性を保つために必要になるのです。
ACID特性とはなにか
DBが持つべき、ACID特性。なにが実現できればよいのでしょう?
スマホ決済での、個人間送金機能の例を考えましょう。
残高テーブル
ユーザー | 残金 |
---|---|
山田 太郎 | ¥3,000 |
鈴木 一郎 | ¥1,200 |
高橋 次郎 | ¥0 |
原子性(Atomicity)
トランザクションは、すべて実行されるか、あるいはなにも実行されないか、のどちらかである必要があります。
個人間送金で、山田さんの残高から¥300を引く、で終わってしまったら、おかしなことになりますね。
トランザクションを確定させる操作を「コミット」、なかったことにする操作を「ロールバック」といいます。DBの更新操作は、このいずれかで完了することになります。
一貫性(Consistency)
データは一貫したルールを保つ必要があります。ルールにそぐわないトランザクションは実行できません。
高橋さんの残高¥0なのに、誰かに送金できるのはおかしいですね。この場合はトランザクションを中止します。
独立性(Isolation)
複数のトランザクションが同時発生したとき、あるトランザクションの途中経過は、他のトランザクションからは見えません。
山田さんから鈴木さんに送金している間に、同時にほかの誰かが送金しようとした場合、
- 送金する前
- 送金した後
のどちらかの状態でしか見えません。途中の状態は見えないわけですね。
永続性(Durability)
トランザクションが完了したら、その結果は失われません。
送金が完了したら、山田さんの残高も、鈴木さんの残高も、送金完了後のものになります。これは当然そうですね。
ACID特性で、複数/同時トランザクションの整合性を担保する
ここで見たのは「山田さんが鈴木さんに¥300送る」という1つのトランザクションだけ。
でも実際には、スマホ決済を使う人がたくさんいます。たくさんの人が同じ時刻に送金操作をします。複数トランザクションが同時に発生することになります。
複数のトランザクションが同時に発生しても、ACID特性が保たれていれば、矛盾なく正しく管理することができるわけです。
DBMSが、ACID特性を実現する
DBはACID特性を持つことが重要です。そして、これを実際に実現するのは、データを管理しているプログラム、DBMS(DataBase Management System)です。
いろいろなDBMS
DBMSにもいろいろあります。よく聞くのは以下でしょうか。
- Oracle(オラクル)
- MySQL
- PostgreSQL(ポストグレSQL)
これらのDBMS、違いはどこにあるのでしょうか。
DBMSの違いは、ACID特性と性能の両立具合
トランザクションのACID特性を保つDBMS。でも、ACID特性を完璧に実現するのは、実はかなり難しいのです。ロック、2フェーズコミット、トランザクションログ…DBMSは、いろいろな技術で実現しようとしています。
さらに、ACID特性を保つときに問題となるのは、性能です。
トランザクション数が増加したとき、ACID特性を守ろうとするほど、性能(検索や登録の速度)は劣化します。
ACID特性と性能を、どこまで高水準で両立させるか。DBMSの違いはここにあります。
主要なDBMSの違い
よく知られるDBMSの違いを簡単に説明してみましょう。
名称 | 特徴 |
---|---|
Oracle | 開発会社はオラクル社。DBMSの名前もオラクル。 業界随一の堅牢性と性能をあわせもつ、最強のDBMS。有償。お高い。 |
MySQL | オープンソースであるが、商用にひけをとらない高性能。採用事例も多い。 人気のWeb環境LAMP(Linux、Apache、MySQL、PHP)の一角。提供元はオラクル。 |
PostgreSQL | ポストグレSQL。通称ポスグレ。オープンソース。SQL標準規格への対応度高い。 追記型アーキテクチャが特徴(削除するときに実際に削除しない) |
SQL Server | マイクロソフトが開発するDBMS。マイクロソフトなのでWindowsサーバと相性が良い。 .NETアプリケーションで開発しやすい。 |
MariaDB | MySQLから途中で分離したDBMS。 なのでMySQLと似ているが、最近は独自の発展を遂げている。 |
SQLite | 軽量でコンパクトなDBMS。インストール不要、データファイルあればいいなどお手軽。 小規模システム向き。DB練習用としてもいい。 |
MongoDB | リレーショナルデータベースではなく、NoSQLと呼ばれるジャンル。 RDBのように厳密な定義をしなくても使える柔軟さで人気。 |
どれがいい/悪いというわけではなく、求められる状況に応じて使い分けることが大事です。
DBアクセスの実装方法
DBMSを使うプログラムは、実際どのように作るのでしょうか。
PHPでMySQLを使う例:
<?php
// MySQLサーバーへの接続情報
$host = 'localhost'; // ホスト名
$username = 'ユーザー名'; // ユーザー名
$password = 'パスワード'; // パスワード
$database = 'データベース名'; // データベース名
// MySQLへの接続
$mysqli = new mysqli($host, $username, $password, $database);
// 接続エラーの確認
if ($mysqli->connect_error) {
die('接続エラー (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
// クエリの実行
$query = 'SELECT * FROM users';
$result = $mysqli->query($query);
// 結果の取得
if ($result) {
// 取得したデータの処理
while ($row = $result->fetch_assoc()) {
echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . '<br>';
}
// 結果セットの解放
$result->free();
} else {
echo 'クエリエラー: ' . $mysqli->error;
}
// MySQLからの切断
$mysqli->close();
?>
多くの言語では、ACID特性を気にせず使えるような、DB用のAPIが準備されています。
どの言語でどのDBMSを使うときも、だいだい以下の手順になります。
- データベースサーバに接続する
- SQLを発行する
- (更新した場合は)コミットもしくはロールバックする
- データベースサーバを切断する
DBMSはACID特性をどう実現するか
このとき、ACID特性は実際にはどう実現されているのでしょう?
- Atomicity(原子性) コミットしたらトランザクション有効、ロールバックしたら無効
- Consistency(一貫性) テーブル定義に制約を設ける。制約違反の操作をしたら失敗とする
- Isolation(独立性) コードが複数個所で同時に実行されても、DBMSが矛盾のないように管理する
- Durability(永続性) 操作した結果はDBMSが記録する
DBMSの機能により、ACID特性を気にせずにコーディングをすることができるわけです。
ただし前述のとおり、実際にどこまでACID特性が担保されるかは、使うDBMSによって違うことに注意しましょう。
まとめ
「大量データへの複数アクセスを同時にさばく」それが、DBの大事な役割です。
DB設計を疎かにすると、「想像以上のアクセス量で性能が出ない…」という問題が、最後の最後で発生します。そして重大な問題になってしまうのです。
DBの知識を正しく身に着けて、後で問題が起こらないようにしましょう。
コメント