今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

2.0 からはじめる MongoDB - 第0回 #mongodbjp

一部の方から“SymfonyのMongoDBの人”などと呼ばれたりしますが、実はSymfonyもMongoDBも業務では使っていない、という痛い感じの @madapaja です。

大事なことは最初に言う。という事で、宣伝から始めます。
ここ1年で急伸している MongoDB。日本でもMongoDB JP(MongoDBの日本ユーザー会)が去年の11月18日に立ちあがって以来、勉強会やカンファレンス等も開かれ、盛り上がりは加速し続けています。
MongoDBをもっと知りたい、と思ったら、以下のGoogle グループや勉強会にもぜひ参加してください!みんなでMongoDBを楽しみましょう。
MongoDB JP | Google グループ
「第6回 MongoDB 勉強会 in Tokyo」 : ATND(すでに定員オーバーしてますね。。。)

宣言 2.0からはじめるMongoDB という記事をブログに書く!宣言しないと書かなそうなので…

と大見得を切ったので、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 で何が出来るのかを見ていきましょう。

MongoDB の公式ホームページにはこう書かれています。

 

素早くて、スケーラブル
MongoDB ("humongous" = どでかい)は、スケーラブル、ハイパフォーマンス、オープンソースなドキュメント指向データベースです。C++で書かれ、以下のような特徴があります。

  • ドキュメント指向ストレージ
  • 完全なインデックスのサポート
  • レプリケーション & 高可用性
  • オート・シャーディング
  • クエリ
  • 高速な in-place(その場での)アップデート
  • Map/Reduce
  • GridFS
  • コマーシャルサポート

各々の特徴について簡単に見ていきましょう。

ドキュメント指向データベース

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 をインストールし、動かしながら話を進めていきましょう。

関連記事もどうぞ