【MongoDB】初めてでも分かる!MongoDB入門(前編)

MongoDB入門(前編)

 

こんにちは。八木澤です。

 

現在携わっているお仕事で「MongoDB」なるものを使うことになりました。

聞いたことはあったけど正直良く分かっていませんでしたので、これを機に勉強してみました。

今回の前編ではMongoDBの概要について触れたいと思います。

(MongoDBの実践は【MongoDB】初めてでも分かる!MongoDB入門(後編)で!)

 

mongo

 

1. NoSQLへの流れ

 

過去20年間でCPUの処理能力は数十倍になり,ディスクの1バイトあたりの金額は1000分の1になりました。開発環境はクラウドに移行し,扱うデータ量とWebサイトのアクセス数は大幅に増加しました。このような環境の変化から,データストアへ求められるものが変化してきています。

 

RDBでは,高トラフィックなWebシステムのバックエンドという箇所では,性能の限界があると考えられるようになってきました。その結果,RDBでは性能に限界がある適用箇所にNoSQLを補完することによって補おう,という流れが出てきたと考えています。

NoSQL

 

2. NoSQLの分類

 

現在NoSQLと呼ばれているものは,大きく分けて3つに分類されます。

(1) Key-Value Store(KVS)

  • データをKeyとValueのHash形式で持つ
  • 基本的にはKeyでの完全一致検索でしかデータを取得できないが,高速に動作する

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

  • スキーマを定義しなくても使用できるスキーマレスである(項目の定義をせずにデータを保存可能)
  • 複雑な検索条件でデータを取得することが可能

(3) 列指向データベース

  • RDBのような行単位ではなく,列単位での処理に特化している

 

3. MongoDBが目指すもの

 

MongoDBは,NoSQLの高パフォーマンス/スケーラビリティを保持しつつ,RDBライクな機能をバランスよく組み込むことを目指して開発されているドキュメント指向データベースです。従来のRDBが備えている一部の機能を制限することにより,KVSに近いパフォーマンスを実現させています。逆に言うと,KVSのパフォーマンスを多少犠牲にして,慣れ親しんだRDBの機能を実装しているという見方もできます。

 

RDBと比較してMongoDBが実装しなかった機能は,トランザクションリレーショナル(JOIN)です。これらの機能は場合によってはコストが高く,パフォーマンスを著しく劣化させる原因となると判断しました。また,開発者がデッドロックについて考えないで良いようなシンプルでわかりやすいシステムにしたいという目的もありました。MongoDBが目指す軽く速いデータベースのため,トランザクション・リレーショナル(JOIN)というRDBの代表的な機能を排除する選択をしました。

 

次にKVSと比較してMongoDBが備えている機能です。代表的なものに“RDBライクな検索クエリ”があります。KVSは基本的にkeyでの完全一致検索しかできません。MongoDBでは,RDBでいうwhere,likeを使った複雑な検索が可能です。またv2.2から集計処理に関する機能が追加され,SUM, AVGなどをgroup by, having, order byに相当するクエリと組み合わせて使用することが可能になりました。

 

上記の機能に加えて,インストールのしやすさ,主要なOS用バイナリの提供,多くのプログラミング言語用ドライバの充実から,他のKVSと比較して適用範囲が広く,導入しやすくなっています。

 

4. MongoDBの特徴

 

MongoDBの特徴として,以下のようなものが挙げられます。

(1) スキーマレスであるドキュメント指向データベースであること

・    データはスキーマレスなドキュメントで格納され,任意のフィールドを好きなときに追加できる

・    KVSでは苦手なValueを検索の条件としたり,ソート・集計を実現できる

(2) スケーラビリティに関する機能を標準機能として備えていること

・    レプリケーション機能,オートフェールオーバー機能を備えている

・    レンジパーティション機能,オートバランシング機能を備えている

(3) RDBと比較してRead/Writeの性能が高い

・    トランザクション・リレーションを制限した結果,KVSに近いパフォーマンスを出せる

(4) 開発のしやすさ

・    どのような環境でもパフォーマンスが出るように,ネイティブソケットプロトコルを使用したドライバを主要なプログラミング言語で開発元が提供している

・    RESTインターフェイスを標準で備えており,Webで広く普及しているJSONを使用してデータ送受信ができる

 

※REST:2000年にRoy Fielding氏が提唱した、分散システムにおいて複数のソフトウェアを連携させるのに適した設計原則の集合。また、狭義には、それをWebに適用したソフトウェアの設計様式のこと。一般には後者の意味で用いられることがほとんどである。


5. MongoDBの使いどころ

 

【向いているシステム】

(1) Webサイトの操作データログの蓄積

  • MongoDBをログストアにする事例はすでにWeb上に多く見られます。データサイズの制限があるコレクションであるCapped Collectionや一定期間が経過すると削除されるTTL Collectionといった機能が活用されています。またアプリによって出力フォーマットが違うログを一括して扱う場合,スキーマレスであることが有効に働きます。

(2) アドホックなフィールドを検索対象とするようなコンテンツ

  • たとえば,ユーザによって独自項目を定義できるようなシステム(アンケートシステムなど)の場合,スキーマレスであると柔軟に対応できます。また,それぞれの独自項目を検索対象にすることも可能です

(3) ソーシャルゲーム

  • 軽いRead/Writeが大量にあるようなソーシャルゲームにはMongoDBは向いていると言えます。スケーラビリティ機能とレプリケーション機能も用意されています。

 

【不向きであるシステム】

(1) 銀行や会計システムのような,複雑なトランザクションに重きを置くシステム

  • 複数のトランザクションを必要としたクエリが必要になる場合,MongoDBは向いていません。

(2) レガシーな夜間バッチの負荷がかかるビジネスインテリジェンスシステム

  • MongoDBはバッチ処理が不可能でこそないですが,リアルタイム処理のほうが得意です。

(3) SQLを必須としているシステム

  • MongoDBはSQLをサポートしていません。(NoSQLなので)

 

6. MongoDBの階層構造

 

MongoDBは、データベース、コレクション、ドキュメントという階層構造になっています。

 

RDBと違い、MongoDBではスキーマが不要です。RDBではテーブルの各行(レコード)が、どのようなデータをどの順に持っているかを最初に定義する必要があります。また、各レコードはスキーマで定義された共通の構造を持っています。

 

ところが、MongoDBのコレクションはスキーマレスであり、レコードに相当するドキュメントというデータを保持していますが、一つひとつのドキュメントは特に共通の構造を持つ必要がありません。このため、データベースに登録するデータの構成が変化しても、柔軟に対応できます。

 

7. MongoDBのデータ構造

 

MongoDBでは,データベースごとに複数のコレクションを持ち,コレクションごとに複数のドキュメントを持ちます。ドキュメントはJSON形式で,以下のような構造をしています。

{
“_id” : ObjectId(“1234567890asdfghjkl”),
“name” : “Taro Suzuki”,
“age” : “25”,
“scores” : [90, 85, 100],
“update” : ISODate(“2015-01-01T12:00:00.000z”)
}

※_idは常に一意なObjectIdを持ちます

 

8. RDBとMondoDBのデータ構造の比較

 

MongoDBのデータ構造とRDBのデータ構造の比較を以下の表に記載します。

No RDBでの呼称 MongoDBでの呼称
 1 database database
 2 table collection
 3 row document
 4 column field
 5 index index
 6 primary key _id

※ MongoDBでは,”_id”の値に自動的に一意な文字列が採番されます。

 

RDBとMongoDBの大きな違いは,RDBではテーブル中のすべてのレコードが同じカラムを有するのに対し,MongoDBではドキュメントごとに自由なフィールドを定義できる点です。

 

しかし,それ以外のデータ構造は,呼称は異なるものの,RDBとMongoDBで対応するものが存在します。すなわち,RDBにおいて,データベースが複数のテーブルを持ち,テーブルが複数のレコードを持ち,レコードがカラムにより区切られているように,MongoDBにおいても似たような構造を持つことができるのです。

 

いかがでしたでしょうか?

次回の後編では実際にMongoDBを触りながら理解を深めていきたいと思います。
【MongoDB】初めてでも分かる!MongoDB入門(後編)

コメントを残す

メールアドレスが公開されることはありません。