はじめに
node.jsの勉強で出てきたmongodb。ドキュメント指向データベースということで、気に入っています。何よりめんどくさくない。スキーマレス最高。
mongodbについては記事を書いた。
mongodbの薄い本
前はnode.jsの本から簡単にCRUD操作しただけだったんだけど、だんだん興味が湧いてきたのでmongodb単独でいろいろ試してみることにした。そうするとちょうどいいサイズの本があった。
http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf
英語版はthe little mongodb book。
http://openmymind.net/mongodb.pdf
どんな時にmongodbを利用するか
これはおそらくみんなが1番興味があることだと思います。薄い本の第5章です。
従来のリレーショナル・データベースで扱えたものは代替可能だと思う。パフォーマンスは比較してみないと分からないけど、1番目立つ「スキーマレス」=柔軟性は、めちゃくちゃな構造のデータベースをぶちこめるという意味ではない。
最初はきっちりデータ構造を設計してからmongodbを利用しはじめるものの、途中での変更が柔軟に行える、という点がメリットだと思う。あと、webAPIを設計する上で、データに重複が許すデータモデルを設計する上でも使いやすいと思う。(RDBMSは正規化の手法が成立しているから、データの重複は基本的にないはず)
jsonでそのままレスポンスを返すwebAPIとも相性がいい気がする。
あとMapReduceの集計機能、これってRDBMSでもあるんでしょうか?これをデータベースで機能持ってるってのは強いですね。
何より使いやすい、使う上で障壁がほとんどない点、この点がただひとつ愛しいです。学習コストの低さは価値だと僕は思います。
map reduce
軽々と使いましたが、はじめて知った概念で、理解に少し時間がかかりました。
目的はデータ集計。そのためにmapとreduceの二段階で処理を行う。
まずmapでは必要となる項目を決定する。ユーザのデータベースのうち、性別と年齢だけのデータが必要で、他の所属部署や従業員番号のデータは必要ないかもしれない。ここではまずデータベース上で集計したいデータを変数に割り当てる。(マッピング)
次のreduceはまとめる、という意味合いだろうか。ある条件。。。つまり[男性かつ30歳]、[女性かつ25歳]というふうに同じ条件に当てはまるものをcountしていく。
最終的な出力結果は、性別と年齢別の組み合わせごとそれぞれ何人いたかという結果が得られる。
これ、いろんなことができると思うんです。例えばログを集計してこの種類のエラーが何回起きたかとか。
インデックス
データベースのインデックスって概念もはじめて知りました。
従来のDBでいえばカラム、1つの要素のデータは規則性なく並んでいて、通常検索する際には上から順に検索するので最悪の時間が大きい。それを解決するために(何らかの探しやすい順序に)並び替える、アクセスしやすいようにする、というのがインデックスとのこと。
ところで内部のアルゴリズムは何なんだろう?以下のサイトが丁寧に解説している。
B-Tree、木構造か。このページに載ってるアクセス速度の比較はちゃんとやる。
まとめ
mongodbはもっとたくさんの機能があると思う。あとは実際に使ってみて、こんな機能がないか?という視点で少しずつ学んでいきたい。
作りたいアプリケーションが見つからないんだけど、次はmongodbを使いたいな。こんなに興味が持てるデータベースはじめて。