複数ドキュメントを一貫性もって処理できない
MongoDBは複数のドキュメントを一貫性をもって更新するトランザクション機能がありません。例えば、口座のドキュメントと取引明細ドキュメントがあったとして、その2つを一貫性を持って更新することはできません。システムのクラッシュや、アプリケーションの作りの問題などでどちらかのドキュメントが更新できない可能性があります。
加えて、他のドキュメントに対する参照整合性はありません。例えば、口座ドキュメントの残高の値を元に、購入明細ドキュメントを作成しようとした場合、購入明細ドキュメントを作成している最中に口座ドキュメント自体がなくなっているかもしれません。
さらに、結合もないため複数のドキュメントをまとめて取得することはできません。アプリケーションライブラリで結合機能を作りこんでも、一貫性を持った結合結果にはならないため注意が必要です。
これが最もRDBMSと大きく違うところです。そのため、データ全体で整合性を持つ必要がある会計処理、株式の約定処理など、アプリケーションでは絶対に利用してはいけません。これらのシステムはRBDMSでしっかりと作るべきですし、既にあるシステムのデータ流量が増えてきたからといって、安易にMongoDBへの置き換えを考えてはいけません。これはRDBMSのスケールアップまたはスケールアウトで対応すべき課題です。
MongoDBでは、この複数ドキュメントの一貫性の機能を捨てることで、大量データ処理に必要な水平分散能力を獲得しています。ですので、多少不整合が発生してでも高速で大量に貯めこむ必要のあるデータ処理において、利用してください。
データの種類・存在を厳格に管理できない
MongoDBは非構造データを扱うため、ドキュメントの構造をチェックする機能はありません。そのドキュメントにどんなデータが入っているかは、そのドキュメントの中を開けてみるまでわかりません。そのため、設計書を厳格に管理して、アプリケーションを作らないと何が入っているかわからなくなります。企業の業務システムのように、多数のテーブルが複雑に絡み合うシステムでの利用は推奨しません。
MongoDBを特によく利用している企業では、MongoDBをRDBMSとファイルシステムの中間の位置付けで利用しています。RDBMSほど厳格にデータの種類を管理する必要はないが、ファイルシステムよりは検索やレプリケーションを柔軟に行いたい場合に最適ですので、そのような使い方をおすすめします。
分散集計は部分的
よく「Hadoopと何が違うのか?」と聞かれますが、MongoDBは分散集計をする基盤ではありません。Hadoopはデータを分散し、集計ロジックを各データノードにばらまくことによって分散集計できますが、MongoDBにそのような機能はありません。
MongoDBにも集計機能はありますが、部分的にしか分散しないため、ギガバイト級データであればMongoDBだけでオンラインで応答できますが、テラバイト級のデータになると、オンラインではなくバッチとして処理するか、オンライン応答が必要な場合はHadoopを実装した分散集計ミドルウェアと組み合わせることが必要になってくる可能性があります。
*****
最後まで読んでいただきありがとうございます。どうでしょうか、MognoDBがRDBMSや他のNoSQLとどう違うのかある程度理解できたでしょうか? 手前味噌ですが、より細かいMongoDBの説明は、野村総合研究所OpenStandiaの説明ページをご覧ください。
最後に、くどいようですがNoSQLは使い分けです。今までRDBMS一辺倒でしたが、周りを見渡せばRDBMSではなくてもよいケースがあると思います、その場合はRDBMSに固執し苦労するのではなく、NoSQLを選択することを考えて見てはいかがでしょうか? 次世代のデータ処理はビックデータ、非構造データが主流です。それらの次世代なデータ処理を担うからこそ“ポストRDB”なのです。
- 渡部徹太郎(わたなべ・てつたろう)
- 野村総合研究所 主任テクニカルエンジニア
- 学生時代は日本データベース学会で情報検索を研究。現在は野村総合研究所のOpenStandiaチームに所属し、オープンソース全般のコンサルティング、システム開発を行う。その中でもMongoDBには特に力を入れており、MongoDB関連の勉強会開催、セミナ発表、執筆を積極的に行っている