一部の方から“SymfonyのMongoDBの人”などと呼ばれたりしますが、実はSymfonyもMongoDBも業務では使っていない、という痛い感じの @madapaja です。
大事なことは最初に言う。という事で、宣伝から始めます。
ここ1年で急伸している MongoDB。日本でもMongoDB JP(MongoDBの日本ユーザー会)が去年の11月18日に立ちあがって以来、勉強会やカンファレンス等も開かれ、盛り上がりは加速し続けています。
MongoDBをもっと知りたい、と思ったら、以下のGoogle グループや勉強会にもぜひ参加してください!みんなでMongoDBを楽しみましょう。
MongoDB JP | Google グループ
「第6回 MongoDB 勉強会 in Tokyo」 : ATND(すでに定員オーバーしてますね。。。)
と大見得を切ったので、MongoDB について最初から優しく丁寧に解説していこうと思います。
ただ、とても一回で終わりそうにないので、これから複数回にわたって MongoDB の基本的な使い方を書いていこうと思います。
さて、今回は「0回目」として、MongoDB のメリット・デメリットやユースケース、特徴を通して“MongoDB とはなんぞや”という部分をお話します。(たぶん割と退屈な内容です。。。)
今回のアジェンダ
- 設計思想
- デメリット
- ユースケース
- 特徴
MongoDB がデータベースで、NoSQL の一つだって知っている人は多いと思いますが、そもそも、MongoDB ってどんなもので、どんな事が出来るのでしょうか。
MongoDB の設計思想
右図は、MongoDB が目指すものとして紹介されている図ですが、MongoDB では KVS と同等のスケーラビリティとパフォーマンス、RDBMS に近い機能性の高さを目指して作られています。
MongoDB は柔軟性、パワー、スピード、そして簡単に使えることの4つに注力し開発されており、下記のような特徴があります(そう目指して開発されています)。
- JSON(正確には、BSON - Binary JSON)でデータを扱います。JSON は、プログラミング言語のネイティブな型とマップでき、スキーマレスです。柔軟性が高く、理解・管理しやすく、関連性を内部的にグループ化することで卓越したパフォーマンスを生みます。
- パフォーマンスと共に、純粋な KVS とは一線を画した機能性の高さのニーズに応えます。MongoDB では、セカンダリインデックスや動的なクエリやソート、リッチなアップデートや集計など、これまでのRDBMSのような多くの機能を提供します。
- 水平スケーリングが容易で、オート・シャーディングにより、ダウンタイムなく容量の増加に対応することも可能です。
- 多くの環境で(どこでも)動作し、インストール・設定・メンテナンスそして、使用が容易で、開発に専念できます。
MongoDB のデメリット
また、MongoDB のデメリットには下記のようなものが挙げられるでしょう。
- トランザクション、JOIN が無い
- メモリを食う(インデックスがメモリに乗らなくなると性能劣化が激しい)
- 歴史が浅い(MySQLやPostgreSQLなどのRDBMSと比べて)
ユースケース
メリットとデメリットから、以下の条件に当てはまる場合、MongoDB に向いています。
- 高速なデータのインサート・アップデートが必要
- 豊富で柔軟なクエリが必要
- スキーマレスなデータの保存
- 一貫性(トランザクション)を保てない場合があるのが許容できる
具体的に上げると、次のようなシステムに向いています。
- CMS
- リアルタイム統計
- アーカイブやイベントログ
- コメントや投票データ
- セッションデータ
- Eコマース(RDBMSとの組み合わせで。最終的な注文・会計処理ではトランザクションのあるRDBMSを使うべきでしょう)
- ゲーム/モバイル(MongoDBには地理情報インデックスもあります!)
- イテレーティブ/アジャイル開発での利用
MongoDB の特徴
さて、MongoDBの主な機能を俯瞰することで、MongoDB で何が出来るのかを見ていきましょう。
MongoDB の公式ホームページにはこう書かれています。
各々の特徴について簡単に見ていきましょう。
ドキュメント指向データベース
RDB(リレーショナルデータベース)では、テーブル(表)を定義した上で、データをレコードとして保存し、複数のテーブルを連結(join)することで、様々なデータを保存します。
対して、ドキュメント指向データベースでは、それぞれのデータをドキュメントとして保存し、それぞれのドキュメントはスキーマレス(RDBでいうテーブル定義が必要ない)なので、柔軟なデータを入れることが出来ます。
MongoDBではドキュメントを保存するために、JSON(正確には、BSON - Binary JSON)を用いています。
MongoDBから、2つのドキュメントを取得した例(コメントは私が追記):
// 1つ目のドキュメント
{
"_id" : ObjectId("4e6efb28dbfb278da997d208"),
"title" : "はじめてのMongoDB",
"tags" : [ "mongo", "db" ], // もちろん配列もOK
"created" : ISODate("2011-09-01T12:00:00Z")
}
// 2つ目のドキュメント
{
"_id" : ObjectId("4e6efb7edbfb278da997d209"),
"title" : "PHPでハマった",
"tags" : [ "php" ],
"created" : ISODate("2011-09-05T13:00:00Z"),
"modified" : ISODate("2011-09-06T02:00:00Z")
}
フル・インデックスのサポート
必要な時に、どの属性にもインデックスを作れます。
インデックスはクエリーのパフォーマンスをとても向上させます。MongoDB では RDBMS のようなインデックスを、簡単に作る事ができます。
レプリケーション & 高可用性
スケールと心の平和のために、LAN、WANにまたがったミラーリングを提供します。
MongoDB では、バックアップやフェールオーバーに備えて、マスター-スレーブやレプリカセットといった、柔軟なレプリケーションオプションがあります。
オート・シャーディング
機能性を損なわない水平スケーラビリティを提供します。
MongoDB には、負荷やデータ分布、マシンの追加などの変化に伴って自動的にスケールアウトできる、シャーディング機能があります。また、1000ノード以上でのスケールアウトでき、自動フェイルオーバー機能も備えています。
クエリ
リッチなドキュメントベースのクエリを提供します。
好きな条件で柔軟に検索できるクエリが使えるため、RDMBS からの移行でもクエリが物足りなく感じることはないでしょう。
高速な in-place(その場での)アップデート
MongoDB は、ドキュメント全体を入れ替えるための通常のアップデートだけでなく、アトミック、インプレース(その場での)アップデートをサポートしています。
Map/Reduce
柔軟な集約やデータ処理を提供します。
バッチでのデータ処理や集計の際に便利な MapReduce を MongoDB では備えています。
GridFS
MongoDB の GridFS を使うことで簡単に巨大なサイズのファイルを保存できます。
コマーシャルサポート
エンタープライズ向けのサポート、トレーニング、コンサルティングを MongoDB の開発元である 10gen が提供しています。
最後に
今回は MongoDB の軸となる部分をまとめましたが、本当に「はじめて」の方にはちんぷんかんぷんな内容も多かったと思います。
ただ、MongoDB の目指しているものと、特徴的な機能をまとめたものですので、頭の片隅に置いておくと、今後、理解しやすいかもしれません。
さあ、次回の第1回からは実際に MongoDB をインストールし、動かしながら話を進めていきましょう。
関連記事もどうぞ
- 2.0 からはじめる MongoDB
- 【番外編】MongoDB の歴史(MongoDB 2.0 まで)