はじめに
今回はドキュメント指向型データベースの代表としてMongoDBを取り上げます。ドキュメント指向型データベースはRDBMSと違って、スキーマ(テーブル定義)が必要ないことが大きな特徴です。
今回も利用したコードやプログラムはgithubに置いてあるので適宜参照してください。
MongoDBの特徴
前々回、前回と紹介したmemcachedやTokyoTyrantは基本的にRDBMSと組み合わせて、「RDBMSの弱い部分を補う」という使い方でした。しかしMongoDBは少し違っていて、JOINが行えないこととトランザクションをサポートしていないこと以外は、ほぼRDBMSと同じように扱うことができるため、「RDBMSの代替として使う」ことが可能です。
上述したようにMongoDBはRDBMSと違ってJOINはできませんが、代わりに基準となるオブジェクトに別のオブジェクトをあらかじめembedded(埋め込み)させておくことで、ある程度同じように扱うことができます。また、データを配列形式で保持したり、その配列形式のデータに対して検索を行ったりすることも簡単にできます。shardingによってスケールさせやすいというのも特徴です。
ただし、データの保存先ファイルはあらかじめ大きなサイズで作成される仕様のため、ディスク使用量は大きくなる傾向があります[1]。
どんなところに使える?
カラムを固定できない場合に有効です。あらかじめたくさんのカラムを用意しておくことでも対応は可能ですが、マジックナンバーのようなカラムが増えてしまうと、運用しづらくなってしまいます。
また、RDBMSで開発を行っている場合、テーブルのスキーマが変更になるたびにデータベース側とアプリ側で修正を行わなければいけません。そういった場合、MongoDBであればスキーマレスなのでアプリ側のプログラムのみ修正すれば良いです。
- 具体的な利用シーン
- カラムを固定出来ない場合
- 開発時など、スキーマの変更が頻繁に行われるような場合
MongoDBを試す(1台)
それでは実際にMongoDBを利用してみましょう。まずはMongoDB(mongodサーバ)を1台のみ立ち上げて、Javascriptシェルなコマンドラインから動作を確認してみます[2]。コレクションというのが聞き慣れないと思いますが、これはRDBMSのテーブルに相当します。
RDBMSと違って事前にテーブルを作成したり、スキーマを定義する必要はありません。それらは必要に応じて自動的に作成されます。
MongoDBを試す(sharding)
今度は、複数のmongodサーバを立ち上げて使ってみます。MongoDBでサポートされているsharding[3]を試してみましょう。mongod, config, mongosという3種類のサーバが登場します。
shardingを使うと、mongosにアクセスすることで透過的にmongodクラスタへアクセスすることができるようになります。本来は複数サーバで行うものですが、今回はテストなので同一サーバで行いました。
shardingの設定を行います。設定はconfigサーバに保存されます。
RailsからMongoDBを利用してみる
今回はMongoMapperというライブラリを使ってRubyからMongoDBを操作します。これはActiveRecordライクにMongoDBを扱えるライブラリです。必要に応じてインストールしてください。
まず、MongoDBで扱いたいモデルで設定を行う必要があります。最低限やることはMongoMapper::Documentをインクルードすることだけです。今回の例ではageとinterestの2つをキーとして設定していますが、これは必須ではありません。ただし、このようにキーとして指定することで、以下のようなメリットがあります。
- 文字列以外の型を指定できる(IntegerやArray、Booleanなど)
- データ作成時や更新時にvalidationを行うことができる
さらにコントローラー側は以下のようになります。開発時はloggerを指定して、どんなクエリが実行されているのかを見れるようにした方が良いでしょう。
Array型の扱いは若干わかりにくいかもしれません。Array型のカラムに対して配列を渡して検索した場合、デフォルトでは「いずれかを含む」の意味で解釈されます。渡した配列を全て含んでいるデータが欲しければ、$allというキーワードを指定しなくてはいけないことに注意してください。
便利なメソッド
その他にも様々な便利メソッドがあります。例えばadd_to_setというメソッドを利用すると、「対象の配列の中にそのデータが存在しなければ追加し、存在していれば何もしない」という処理を簡単に行うことができます。
まとめ
MongoDBはshardingさせられるため、スケーラビリティに優れたデータベースです。さらに、データ型として配列が扱えたり、検索が柔軟に行えたりするため、様々な場面で使えるのではないでしょうか。また、データベース側とアプリ側でスキーマの整合性を気にする必要がないのも大きなメリットだと思います。