【47】大量のデータはデータベースで
アプリケーションで大量の永続データを扱う必要がある場合やデータが相互に関係し合う場合は、迷うことなくリレーショナルデータベース(RDBMS)にデータを保存すべきでしょう。RDBMS にはかつて、コストが高い、複雑で扱いづらい、気軽には導入できない、というイメージがありました。しかし、今は以前とはまったく事情が変わっています。RDBMS は今や身近な存在です。改めて導入を考えなくとも、システムに既に 1 つや 2 つはインストールされているという人も多いでしょう。MySQL、PostgreSQL などは非常に高機能な RDBMS ですが、オープンソースソフトウェアなので、購入のコストはかかりません。他にも、ライブラリとしてアプリケーションに直接リンクされる「組み込みデータベース」というデータベースもあります。特によく知られているのは、いずれもオープンソースの SQLite と HSQLDB です。この種のデータベースなら、セットアップや管理の手間も必要なく、非常に効率的に使えると言っていいでしょう。
アプリケーションで扱うデータの量がシステムの RAM 容量を超えている場合、インデックス付きの RDBMS テーブルを使えば、ライブラリに用意されているマップなどのコレクション型(この種の型では仮想メモリページが多用される)を使うよりも、処理が桁違いに速くなります。データベースで扱うべきデータの量は簡単に増えていくものです。組み込みデータベースの場合、扱い方が適切であれば、必要データ量の増加に応じてより本格的な RDBMS に切り替えてスケールアップすることが可能です。フリーのオープンソースのデータベースを使っていて、後から、より高機能でサポートも充実した商用データベースに転換するということもできます。
SQL の使い方を覚えれば、データベースが中心となるアプリケーションを簡単に書けます。データベースに保存するデータを適切に正規化しておけば、SQL クエリを使って効率的に抽出ができます。SQL のコードは書くのも簡単で読んで理解するのも簡単です。SQL が使えれば、データを扱うのに複雑なコードを書く必要はなくなるのです。SQL クエリなら、データに 1 度に複雑な変更を加えるということも簡単にできます。また、永続データの編成の仕方を少し変えるというくらいの小幅の変更で、あれば、SQL 対話環境を使うだけで済んでしまい、コードを一切書かなくていいという場合もあります。対話環境を使うと、書いたクエリを試しに実行してみるということもできます。対話環境無しでは「編集 - コンパイル - 実行」という手順を経ることになるわけですが、その手順を飛ばして、動きを確かめることができるのです。
他に RDBMS を利用するメリットとして大きいのは、データエレメント同士を関係付けることができることです。「このデータとこのデータは常に一致していなければならない」というような制約条件を明確に宣言できるのです。そうすることで、一方のデータだけを更新して、もう一方のデータを更新し忘れる「ダングリングポインタ」という問題の発生を防止できるわけです。たとえば、「ユーザ A のデータを削除したら、ユーザ A の送ったメッセージのデータも必ず削除する」というような指定も制約条件を定義することで実現できます。
インデックスを作成するだけで、データベース中のエンティティ同士をいつでも、あとからでも効率良くリンクすることができます。手間をかけてクラスフィールドのリファクタリングをする必要などはないのです。データベースにデータを保存しておけば、複数のアプリケーションから同じデータにアクセスするということも問題なくできます。同じデータを利用する複数のアプリケーションを並行してアップグレードをするのも簡単です。さらに、アプリケーションの構成部分ごとに言語やプラットフォームを変えるということも簡単にできます。各部分に最も適した言語とプラットフォームが使えるわけです。たとえば、Web ベースアプリケーションの XML バックエンドを Java で書き、監査スクリプトを Ruby で、ビジュアライゼーションインタフェースを Processing で書く、といったこともできます。
RDBMS に SQL コマンドの最適化機能があるというのも重要です。この機能があるおかげで、アルゴリズムのチューニングに労力をかけることなく、アプリケーションの機能の充実に集中できます。高度なデータベースシステムの中には、マルチコアプロセッサを活かす最適化を自動で行うものもあります。技術が進むほど、間違いなくアプリケーションのパフォーマンスは向上していくでしょう。