プログラマが知るべき97のこと/大量のデータはデータベースで
アプリケーションで大量の永続データを扱う必要がある場合やデータが相互に関係し合う場合は、迷うことなくリレーショナルデータベース(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コマンドの最適化機能があるというのも重要です。この機能があるおかげで、アルゴリズムのチューニングに労力をかけることなく、アプリケーションの機能の充実に集中できます。高度なデータベースシステムの中には、マルチコアプロセッサを活かす最適化を自動で行うものもあります。技術が進むほど、間違いなくアプリケーションのパフォーマンスは向上していくでしょう。