web-dev-qa-db-ja.com

MongoDBや他のドキュメント指向のデータベースシステムを使うのはいつ?

ビデオクリップ、オーディオクリップ、写真、ベクトルグラフィックス用のプラットフォームを提供しています。 MongoDBはデータベースのバックエンドとして始め、最近はファイルのすべてのメタ情報を保存するための MongoDB を含んでいました。MongoDBが要件を満たしているからです。例えば、写真には Exif という情報があり、ビデオにはメタ情報を格納したいオーディオトラックがあるかもしれません。動画やベクトルグラフィックは一般的なメタ情報などを共有していないので、MongoDBはこの非構造化データを保存して検索可能にするのに最適です。

ただし、プラットフォームの開発と機能の追加は続けています。今次のステップの1つは私達のユーザーのためのフォーラムを提供することです。ここで生じる問題は、MySQLデータベースを使用することです。これはフォーラムやフォーラム投稿などを保存するのに適していますか、それともMongoDBを使用しますか。

だから問題は、いつMongoDBを使うべきか、そしていつRDBMSを使うべきかということです。 mongoDBとMySQLのどちらを選択すればいいのでしょうか。

503
aurora

NoSQL:それが簡単だったら で、著者はMongoDBについて次のように書いています。

MongoDBはキー/バリューストアではありません。もう少しだけです。もちろんRDBMSでもありません。私は本番環境でMongoDBを使用したことはありませんが、テストアプリを作成するためにMongoDBを使用しています。これは非常にクールなキットです。それは非常に高性能であるように思われ、そしてフォールトトレランスと自動シャーディングを持っているか、まもなくそうするでしょう(別名それは拡大縮小するでしょう)。私はこれまで見てきたRDBMSの置き換えに最も近いのはMongoだと思います。すべてのデータセットやアクセスパターンに対して機能するわけではありませんが、通常のCRUD用に構築されています。本質的に巨大なハッシュであるものを保存し、それらのキーのいずれかを選択できるということが、ほとんどの人がリレーショナルデータベースを使用するためのものです。 あなたのDBが3NFで、何も結合していない場合(たくさんのテーブルを選択し、すべてのオブジェクトをまとめて配置している、ほとんどの人がWebアプリでやっていること)、MongoDBはおそらくあなたにお尻を蹴るでしょう。

それで、結論として:

あなたがデータベースを選ぶことができないという理由であなたが何かを超すごいものにすることを妨げられているならば、あなたがそれを間違ってやっているということです。 mysqlを知っているのなら、それを使ってください。実際に必要なときに最適化します。 K/Vストアのようにそれを使用し、RDBMSのようにそれを使用しますが、神のために、あなたのキラーアプリケーションを構築してください!これのどれもほとんどのアプリには関係ありません。 FacebookはまだMySQLを多用しています。ウィキペディアはMySQLを多用しています。 FriendFeedはMySQLを多用しています。 NoSQLは優れたツールですが、競合他社のエッジになることは確実ではありませんし、アプリを熱くすることもないので、とりわけ、ユーザーはこれを気にする必要はありません。

次のアプリを構築する予定は何ですか。おそらくPostgresです。 NoSQLを使用しますか?多分。私はHadoopとHiveも使うかもしれません。私はすべてをフラットファイルに保存するかもしれません。多分私はMaglevをハッキングし始めるでしょう。 仕事に最適なものをすべて使用します。 報告が必要な場合は、NoSQLを使用しないでください。 キャッシングが必要な場合は、おそらくTokyo Tyrantを使用します。 ACIDityが必要な場合は、NoSQLを使用しません。 大量のカウンターが必要な場合は、Redisを使用します。 取引が必要な場合は、Postgresを使用します。 1種類のドキュメントを大量に持っている場合は、おそらくMongoを使用します。 1日に10億個のオブジェクトを作成する必要がある場合は、おそらくVoldemortを使用します。全文検索が必要な場合は、おそらくSolrを使用します。揮発性データの全文検索が必要な場合は、おそらくSphinxを使用します。

私はこの記事が好きです、私はそれが非常に有益であると思います、それはNoSQLの展望と誇大宣伝の良い概観を与えます。しかし、それが最も重要な部分です。RDBMSとNoSQLのどちらを選択するかについては、それ自体が正しい質問をするのに役立ちます。私見に値する。

記事への代替リンク

643
Pascal Thivent

ソーシャルアプリにMongoDbを使用して2年が経ちましたが、SQL RDBMSなしで生きることが本当に何を意味するのかを見てきました。

  1. さまざまなテーブルやコレクションのデータを結合するなど、RDBMSが自動的に実行するようなことを実行するためのジョブを作成することになります。
  2. NoSQLを使ったあなたの問い合わせ能力は劇的に不自由です。 MongoDbはSQLに最も近いものかもしれませんが、それでもまだかなり遅れています。私を信じて。 SQLクエリは、非常に直感的で柔軟かつ強力です。 MongoDbクエリは違います。
  3. MongoDbクエリは、1つのコレクションからのみデータを取得し、1つのインデックスのみを利用できます。そしてMongoDbはおそらく最も柔軟なNoSQLデータベースの1つです。多くのシナリオで、これは関連レコードを見つけるためにサーバーへのより多くのラウンドトリップを意味します。次に、データの正規化解除を開始します。これはバックグラウンドジョブを意味します。
  4. それがリレーショナルデータベースではないという事実は、あなたのデータが一貫していることを保証するためにあなたが(ある人は悪いパフォーマンスだと考える)外部キー制約を持たないことを意味します。私はこれが最終的にあなたのデータベースにデータの矛盾を作成することになることをあなたに保証します。準備して。データベースの整合性を保つためのプロセスやチェックの作成を開始する可能性が最も高いでしょう。これは、RDBMSに実行させるよりもおそらくうまく機能しません。
  5. 休止状態のような成熟したフレームワークを忘れる。

私は、すべてのプロジェクトの98%が、NoSQLよりも一般的なSQL RDBMSの方がはるかに優れていると思う。

176
Marquez

この非構造化データを保管する

あなたが言ったように、MongoDBは非構造化データを格納するのに最も適しています。そしてこれはあなたのデータを文書フォーマットに編成することができます。これらのRDBMS代替は、NoSQLデータストアと呼ばれます( MongoDBCouchDBVoldemort )は、大規模に拡張し、これらのビッグデータストアからの高速データアクセスを必要とするアプリケーションに非常に便利です。

そしてこれらのデータベースの実装は通常のRDBMSよりも簡単です。これらは単純なキー値またはドキュメントスタイルのバイナリオブジェクトなので直接ディスクにシリアル化されています。これらのデータストアは、ACIDプロパティ、および任意のスキーマを強制しません。 。これはトランザクションの能力を提供しません。そのため、これは大幅に拡大し、より高速なアクセス(読み取りと書き込みの両方)を達成できます。

しかし対照的に、RDBMはACIDとスキーマをデータに適用します。構造化データを処理したい場合は、RDBMを使用してください。

私はMySQLフォーラムを作成するために選択するでしょう。これはそれほど大きくならないからです。そしてこれは、データ間の構造化された関係を持つ非常に単純な(共通の)アプリケーションです。

26
RameshVel

Mongoは基本的にJSONを格納していることに注意してください。あなたのアプリがたくさんのJSオブジェクトを(ネストして)扱っていて、それらのオブジェクトを永続化したいのであれば、Mongoを使うための非常に強い議論があります。それはあなたのDALとMVC層を非常に薄くします、なぜならそれらはすべてのJSオブジェクトプロパティをアンパッケージ化していなくてそれらが自然にはフィットしない構造(スキーマ)にそれらを強制的にフィットさせようとしているからです。

複雑なJSオブジェクトを中心としたシステムがありますが、Mongoが大好きです。すべてを本当に簡単に永続化できるからです。私たちのオブジェクトもまたかなり不定形で構造化されていません、そしてMongoは瞬くことなくその複雑さを吸収します。私たちは人間の消費のために非晶質データを解読するカスタム報告層を持っています、そしてそれは開発するのがそれほど難しくありませんでした。

10
Journeyman

誰が分散型の、鋭利なフォーラムを必要としていますか?たぶんFacebookかもしれないが、あなたがFacebookの競合相手を作っているのでなければ、Mysql、Postgres、あるいはあなたが最も慣れ親しんでいるものなら何でも使ってください。 MongoDBを試してみたいのであれば、大丈夫ですが、それがあなたのために魔法をかけるとは思わないでください。あなたが本当にそれに取り組んできたかどうかあなたがすでに発見したと確信しているように、それは他のすべてのものと同じようにその奇妙さと一般的な意地悪さを持ちます。

確かに、MongoDBは急増しており、表面的には簡単に見えるかもしれませんが、より成熟した製品がすでに克服している問題に遭遇するでしょう。そんなに簡単に誘惑されないで、むしろ「nosql」が成熟するか死ぬまで待ちなさい。

個人的には、(ほとんど定義による)標準が設定されていないため、 "nosql"は断片化して枯れて死ぬと思います。だから私は長期的なプロジェクトのために個人的にそれに賭けることはしません。

私の本で "nosql"を節約できるのは、コーディングや設計のオーバーヘッドをほとんど発生させることなく、Rubyまたは類似の言語にシームレスに統合し、その言語を "永続的"にできる場合だけです。それは過ぎ去るかもしれません、しかし、私はそれまで待っているでしょう、そして今ではなく、そしてそれはもちろんもっと成熟している必要があります。

ところで、なぜあなたは最初からフォーラムを作成しているのですか?あなたが本当に次世代のフォーラムを作成しているのでなければ、ほとんどの要件に合うように調整できるオープンソースフォーラムがたくさんあります(私は疑っています)。

7
Fred

複雑なトランザクションが必要な場合は、RDBMSを使用します。そうでなければ、私はMongoDBを使います - より柔軟に作業し、あなたが必要とする時にそれが拡大できることをあなたは知っています。 (私は偏っています - 私はMongoDBプロジェクトに取り組んでいます)

7
mdirolf

あなたがMongoを好む理由は2つあります。

  • スキーマ設計の柔軟性(JSON型ドキュメントストア).
  • スケーラビリティ - ノードを追加するだけで、水平方向に非常にうまく拡張できます。

ビッグデータアプリケーションに適しています。 RDBMSはビッグデータには向いていません。

4
Sushant Gupta

私は多くの企業がアプリケーションログからのリアルタイム分析にMongoDBを使用しているのを見ました。そのスキーマフリー性は、レコードスキーマが時々刻々と変化する傾向があるアプリケーションログに本当に適しています。また、 Capped Collection 機能は、古いデータを自動的に消去してデータをメモリに収めるために便利です。

それは私が本当にMongoDBに適していると思う1つの分野ですが、MySQL/PostgreSQLは一般的にもっと推奨されます。 Web上には多くのドキュメントと開発者向けリソース、そしてそれらの機能と堅牢性があります。

4
Kazuki Ohta

結合と '複雑なトランザクション'に関するすべてのことをご存知でしょう。しかし、何年も前に、COMMIT/ROLLBACKの「必要性」を説明したのはMonty自身でした。 (データベースではありません)とにかく ' - それはまたしても同じことです。必要とされているのは、Webアプリケーションが行うことの99%を達成するための、ダムだが信じられないほどきれいで高速なデータ保存/検索エンジンです。

3
FYA

前述のように、あなたはたくさんの選択肢の中から選ぶことができます、それらすべての選択肢を見てみましょう: http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

MySQL + Memcacheは、ACIDが必要で、いくつかのテーブルに参加したい場合に最適です。MongoDB+ Redisは、ドキュメントストアに最適ですNeo4Jは、グラフデータベースに最適です。

私がしていること:私はに慣れているので、私はMySQl + Memcacheから始めます、それから私は他のデータベースフレームワークを使い始めます。単一のプロジェクトでは、例えばMySQLとMongoDBを組み合わせることができます。

1