本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはkarupaneruraこと佐藤健太さんで、テーマは「データベースプログラミング」です。
本稿のサンプルコードは、WEB+DB PRESS Vol.84のサポートサイトから入手できます。
なぜデータベースを使うのか
データベースと一口に言ってもさまざまなものがありますが、単にデータベースと言った場合RDBMS(Relational Database Management System)を指すことが多いでしょう。RDBMSは最も一般的かつ、最も基本的なデータベースです。筆者はデータベースプログラミングを学ぶ際はまずRDBMSについて学ぶべきだと考えており、本稿もRDBMSを扱ったプログラミングについて解説していきます。また本稿は、全体を通してMySQLを扱うことを前提とします。
データベースの必要性
まずはそもそもなぜデータベースが必要なのかを考えていきましょう。
単にデータを永続化するためだけであればさまざまな手段があります。たとえば、直接ファイルを操作してデータを読み書きすることもできるでしょう。しかし、この方法ではすぐに多様な問題にぶつかります。実用的なアプリケーションを作るためには、次のような問題を解決する必要があるでしょう。
- ネットワーク越しにデータを共有できない
- 並列で行われるファイル操作に対して整合性を保つことが難しい
- 並列で行われるファイル操作を効率良く直列化できない
- 長時間かかる処理において、全体で一貫性のあるデータを読み取ることが難しい
- 変更を安全に巻き戻すことができない
- データ量に比例して検索が遅くなる
上記の問題をすべて解決した実装を作ることは容易ではありません。しかし既成のデータベースシステムを利用することにより、上記の問題のほとんどについて考えなくてよくなります。特にRDBMSはACID(Atomicity:不可分性、Consistency:一貫性、Isolation:独立性、Durability:永続性)の考え方をベースに設計されているため、RDBMSを利用することにより正確なデータ操作が容易になります。
トランザクションの効用
データベースを利用する大きな理由の一つとして、トランザクションの存在が挙げられます。以下は簡略化した銀行の振り込み処理の一例です。これをもとに考えていきましょう。
処理②が実行される前にプログラムが停止してしまうと、本来移動すべきお金が消失することに気づきましたでしょうか。処理①と処理②の順序を逆にしても、今度は本来存在しないはずのお金が残高に加算されてしまいます。つまり、どちらの処理も同時に行われなければデータの整合性が崩れてしまいます。
このようなときにトランザクションが活躍します。トランザクションは処理単位を定義するものです。次のように処理の開始点と終了点をデータベースに知らせることで、データベースは複数の処理が一度に行われたかのように処理してくれます。
このようにすれば、途中で失敗した場合、すべての変更をもとに戻すことができます。つまり、中途半端に処理が実行されてしまうことを防げるのです。
ほかにもトランザクションを利用することでさまざまな恩恵を受けることができます。トランザクションなどデータベースについてより詳しく知りたい人には、『Webエンジニアのためのデータベース技術[実践]入門』(注1)が丁寧に解説されておりお勧めです。ぜひ、一度読んでみてください。
<続きの(2)はこちら。>