MongoDBってなんだ?

最近いろいろなところでMongoDBという単語を聞きますよね。
そういうわけで興味だけは持っていたが、なかなか腰が重くて取り組んでいなかったMongoDB。
話題になる新技術は、「ただ話題になっているだけ」なのか「本当に便利」なのかが良く分かりませんが、MongoDBはどうやら「本当に便利」っぽいので勉強してみました。そして、実際に便利っぽかったです。
 

MongoDBってなんだ?

Wikipediaによると、こういうものだそうです。

高パフォーマンス、スキーマレス、オープンソースのドキュメント指向データベース

高パフォーマンスは分かるとして、スキーマレス、ドキュメント指向ってなんだという話です。
 

スキーマレスってなんだ?

「MongoDBはJSONのような構造でデータを持ちます」というと、JSONでWeb APIを利用したことがある人は「お、何やら便利そうだな」と思うんじゃないかと思います。JSONって扱いやすいですよね。
MongoDBはJSONのデータをそのままデータベースに投げ込むことができます。

db.practice.save({"user_id":1,"screen_name":"katty0324","age":23})

ここで、「おっと、practiceテーブルのカラム定義をしていなかった!」とならないのが驚きです。
それどころか、「おっと、テーブル自体作ってなかった!」ともならないので驚愕します。
何事もなかったかのように自動でテーブルが作成され、データが保存されます。
ちなみに、MongoDBではテーブルのことをコレクションと呼ぶそうです。
これが「スキーマレス」ということ、つまりカラムの定義なしにデータを保存するということです。
 

MySQLでもスキーマレスできるよ!

カラム定義なしにデータを保存したいというのならMySQLでもできます。

create table practice (data text);
insert into practice (data) values ('{"user_id":1,"screen_name":"katty0324","age":23}');

こうすれば同じことです。テーブルの作成はしたものの、その中に何を入れるかは柔軟で、ある意味スキーマレス(?)です。
でも、「じゃあ、どうやって取り出すの?」という話になります。user_idをキーにして検索をかけるのは至難の業です。

create table practice (user_id int, screen_name varchar(16), age int);
insert into practice (user_id, screen_name, age) value (1, 'katty0324', 23);

だから、ちゃんと検索できるようにするために、MySQLではカラム定義をして、カラムごとにデータを分けて入力します。

select * from practice where user_id = 1;
select * from practice where age = 23;

そしてカラムごとに検索条件を指定してデータを取り出します。
 

MongoDBなら、ちゃんと取り出せる

MongoDBはカラム定義をしないと言っても、雑多にデータを保持しているわけではなく、ちゃんと取り出せる状態で持っています。JSONのような形で、データの検索ができます。検索のキーはuser_idでなくても良いです。

db.practice.find({"user_id":1})
db.practice.find({"age":23})

さらっと言ってますが、MySQLの世界からすると驚くべきことです。
 

しかもデータ構造を柔軟に変えられる。

カラム定義をしなくても良いというだけでは、あまり旨みがないような気がしますよね。
よくよく考えてみるとカラム定義をしなくて良いということは、データ構造が変化しても良いということです。話が戻りますが、「スキーマレス」ということです。

db.practice.save({"user_id":2,"screen_name":"yutomukoyama","age":24,"sex":1})

データ構造にsexを追加した新しいデータを入れてみます。このようなことが、何もしなくても当たり前にできるのが、MongoDBの強みの一つだと思います。
たとえば、MySQLではデータ構造を変えるためには、alter tableなどでカラムを追加する必要があります。

alter table practice add sex tinyint;

もちろん開発中はこうしてカラムを追加しても問題ないのですが、実際に運用を始めるとカラム一つ追加するのにも恐ろしい処理時間がかかったり、恐怖の不整合エラーが生じたりして絶望することになるので、これは非常にありがたい。
 

でもクエリの書き方を覚えるのが面倒くさい

そんなあなたにこちら。
SQL脳に優しいMongoDBクエリー入門
神がかり的に分かりやすい、SQLとMongoDBクエリの対応表を書かれている方がいました。これを見ると、「あれ、意外に簡単に書けるかも・・・」と思えてしまいます。
 

結局、何に使えるんだ?

今この本を読んでいるのですが、この本によるとアンケートデータの集計などに使えると書かれています。「アンケートの項目が増えたりしても大丈夫」ということです。

というより、下のスライドのようにWebサービスへのアクセスログデータの集計・解析などの目的が使えそうです。
こえ部 で fluentd と MongoDB 入れた話
「アクセスログをガシガシとMongoDBに突っ込んであとから必要なデータを取り出して解析などできる」というのは助かります。もう少しMongoDBの勉強をして、不具合の追跡・修正に役立てようと思います。

コメント

  1. […] MongoDBってなんだ? […]

  2. […] MongoDBってなんだ? | 三度の飯とエレクトロン […]

タイトルとURLをコピーしました