MongoDBまたは他のドキュメント指向データベースシステムをいつ使用するのですか?[閉まっている]


516

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

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

したがって、問題は、MongoDBをいつ使用し、RDBMSをいつ使用するかです。mongoDBまたはMySQLのどちらを選択しますか?


12
明らかにそうではないのに、なぜこれがオピニオンベースであるとマークされているのかわからない。ここには明確な正解または不正解があります。
スペンサー

回答:


659

NoSQL:それは簡単だった場合にのみ、 MongoDBの程度、著者の書き込み:

MongoDBはキー/値ストアではなく、かなり多くの機能を備えています。間違いなくRDBMSでもありません。私は本番環境でMongoDBを使用していませんが、テストアプリの構築に少し使用しました。これは非常に優れたキットです。それは非常にパフォーマンスが高いようで、フォールトトレランスと自動シャーディング(別名はスケーリング)を備えているか、すぐに備えます。Mongoは、これまでに見たRDBMSの置き換えに最も近いものだと思います。すべてのデータセットとアクセスパターンで機能するわけではありませんが、一般的なCRUD向けに作成されています。本質的に巨大なハッシュであるものを格納し、それらのキーのいずれかを選択できることは、ほとんどの人がリレーショナルデータベースを使用するためのものです。DBが3NFであり、結合を行わない場合(一連のテーブルを選択してすべてのオブジェクトをまとめるだけで、ほとんどの人がWebアプリで何をしているのか)、MongoDBはおそらくお尻を蹴ります。

次に、結論として:

指摘すべき本当のことは、データベースを選択できないために何かを非常に素晴らしいものにすることを妨げられている場合、それは間違っているということです。mysqlを知っている場合は、それを使用してください。実際に必要なときに最適化します。それをak / vストアのように使用し、rdbmsのように使用しますが、神のためにキラーアプリを作成してください!これはほとんどのアプリにとって重要ではありません。FacebookはまだMySQLを多く使用しています。ウィキペディアはMySQLをよく使用しています。FriendFeedは、MySQLをよく使用します。NoSQLは優れたツールですが、確かに競争力になることはなく、アプリを熱くすることはありません。何よりも、ユーザーはこれについて気にしません。

次のアプリは何に基づいて構築しますか?おそらくPostgres。NoSQLを使用しますか?多分。HadoopとHiveを使用することもあります。すべてをフラットファイルに保存する場合があります。たぶん、マグレブのハッキングを始めるでしょう。仕事に最適なものを使用します。 レポートが必要な場合は、NoSQLを使用しません。キャッシングが必要な場合は、Tokyo Tyrantを使用します。ACIDityが必要な場合は、NoSQLを使用しません。大量のカウンターが必要な場合は、Redisを使用します。トランザクションが必要な場合は、Postgresを使用します。 1種類のドキュメントが大量にある場合は、おそらくMongoを使用します。1日に10億のオブジェクトを書き込む必要がある場合は、おそらくヴォルデモートを使用します。全文検索が必要な場合は、おそらくSolrを使用します。揮発性データの全文検索が必要な場合は、おそらくSphinxを使用します。

私はこの記事が好きです。非常に有益であり、NoSQLの展望と誇大宣伝の概要がわかります。しかし、それが最も重要な部分であり、RDBMSとNoSQLのどちらを選択するかについて、適切な質問をすることは非常に役立ちます。読む価値がある私見。

記事への代替リンク


4
おかげで、それは確かに非常に興味深い記事です。
オーロラ


48
@iddqd ROFL!男、これは陽気だった。「ベンチマークを取得するためだけに信頼性を完全に無視できるほど愚かである場合は、データを/dev/nullにパイプすることをお勧めします。非常に高速になります。」:D
Pascal Thivent

3
誇大広告を知っている答えをありがとう。
デーモンは

2
うまくいけば、BJクラークが同じプロジェクトでこれらのテクノロジーをすべて使用することを選択しないことを望みます。それは少し学習曲線になります。
Adam Monsen

186

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

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

すべてのプロジェクトの98%は、通常のSQL RDBMSの方がNoSQLよりもはるかに優れていると思います。


10
興味深い考え...
luigi7up

3
一方、クエリ機能と説明する結合は問題になりません。MongoDBを使用している場合でも、コレクションを設計するための作業と、内部に配置するデータを複雑にする必要がないようにする必要があります。 JOINなど。とにかく、DBはボトルネックではなく、一部のユースケースではMemcacheのような回避策があります。ただし、最初から始めると、MongoDBの設計と使用がより簡単で高速であることがわかります(オブジェクトコードを扱う開発者として、私はORMは必要ありません)。確かにいくつかのスクリプトを記述する必要がありますが、実際にはそれほど難しくはなく、コードを再利用します
Aki

1
ほとんどの人は、作成された非常に特定のユースケースでNoSQLデータベースを使用せず、その後多くのホイールを再発明します。SQLの議論対のNoSQL、彼らがし、時間に20〜30年前に起こったかのように多くの人々がのNoSQLを使用して経験していることを示し-コッドを事前事前にリレーショナル、事前にSQL回、。または、Michael Stonebrakerが言うように、「周りに何が起こるか」
Lukas Eder

1
項目#3の「1つのインデックスのみを利用する」は現在も有効ですか?私は今MongoDBに入っていますが、これまでに読んだり見たりしたものから、複数のインデックスをサポートできるように思えますか?
Jeach、2014年

1
@Jeach:いいえ、#3は真実ではありません。MongoDB 2.6では、インデックスの共通部分が導入されました。
Rob Garrison

26

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

あなたが言ったように、MongoDBは非構造化データを保存するのに最適です。これにより、データをドキュメント形式に整理できます。NoSQLデータストア(MongoDBCouchDBVoldemort)と呼ばれるこれらのRDBMS代替は、大規模にスケーリングし、これらのビッグデータストアからの高速データアクセスを必要とするアプリケーションに非常に役立ちます。

また、これらのデータベースの実装は、通常のRDBMSよりも簡単です。これらは単純なキー値またはドキュメントスタイルのバイナリオブジェクトであるため、ディスクに直接シリアル化されます。これらのデータストアは、ACIDプロパティスキーマを適用しません。これはトランザクション機能を提供しません。したがって、これは大規模に拡張でき、より高速なアクセス(読み取りと書き込みの両方)を実現できます。

しかし対照的に、RDBMはデータにACIDとスキーマを適用します。構造化データを操作したい場合は、RDBMを使用できます。

この種のフォーラムを作成するには、MySQLを選択します。これは大規模に拡大するつもりはないので。そして、これはデータ間の構造化された関係を持つ非常にシンプルな(一般的な)アプリケーションです。


10
「私はフォーラムのようなものを作成するためにmysqlを選択します。」本当に?フォーラムのようなものは、リレーショナルよりもドキュメント指向データベースを使用して書く方が簡単だと思います(ゼロから作成する場合)。RDBMSの機能が特に必要ない場合は、MongoDBまたは同様のデータベースを使用すると、使いやすく、スケーリングが容易になります。
サーシャチェディゴフ2009年

2
CouchDBはACIDをサポートしています。couchdb.apache.org/docs/overview.html
ソニア

2018:MongoDBもACIDをサポート
Nepoxx

10

Mongoは基本的にJSONを格納することに注意してください。アプリが多くのJSオブジェクト(入れ子を含む)を処理していて、これらのオブジェクトを永続化したい場合は、Mongoを使用するための非常に強力な議論があります。DALレイヤーとMVCレイヤーは、すべてのJSオブジェクトプロパティをアンパックせず、自然に収まらない構造(スキーマ)にそれらを強制的にはめようとしないため、超薄型になります。

私たちはいくつかの複雑なJSオブジェクトを中心に持つシステムを持っており、すべてを本当に簡単に永続化できるので、Mongoが大好きです。私たちのオブジェクトもかなりアモルファスで構造化されておらず、モンゴは瞬きすることなくその複雑さを吸収します。私たちには、人間が消費するためのアモルファスデータを解読するカスタムレポートレイヤーがあり、開発はそれほど難しくありませんでした。


7

複雑なトランザクションが必要な場合は、RDBMSを使用すると思います。それ以外の場合は、MongoDBを使用します-より柔軟に操作でき、必要に応じて拡張できることをご存知でしょう。(私は偏っています-私はMongoDBプロジェクトに取り組んでいます)


7
複雑なトランザクションはMongoDBでは機能しませんが、MarkLogicなどの他のNoSQLデータベースでは機能します(MarkLogicの開発者コミュニティを運営しているため、バイアスもかかります)。
Eric Bloch、

MarkLogicへのヒントをありがとう-私はそれを知りませんでした。
オーロラ

それについてmdirolfから聞きたいのですが。MongoDBがトランザクションを実装しないことを選択したのはなぜですか?
アキ

7

分散した分割フォーラムが必要なのは誰ですか?たぶんFacebookかもしれませんが、Facebookの競争相手を作成しているのでなければ、MysqlやPostgresなど、最も使いやすいものを使用してください。MongoDBを試してみたい場合は、承知しましたが、MongoDBが魔法のように動作するとは思わないでください。それは他のすべてと同じように、その奇妙さと一般的な美しさを持っています。あなたが本当にそれに取り組んでいるのなら、あなたはすでに発見していると思います。

確かに、MongoDBは誇大広告で表面上は簡単に見えるかもしれませんが、より成熟した製品がすでに克服している問題に遭遇します。そんなに簡単に誘惑されるのではなく、 "nosql"が成熟するか死ぬまで待ちます。

個人的には、(ほとんどの場合定義による)基準が設定されていないため、「nosql」は枯渇して断片化によって死ぬと思います。したがって、長期的なプロジェクトについては、個人的には賭けません。

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

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


5
ご回答有難うございます。フォーラムを統合するのはめんどくさい-すでにこれを行っており、今後この方法に戻らないことに決めた。何千もの機能は必要ないが、ソフトウェアに完全に統合する必要はない。
オーロラ

4

多くの企業がアプリケーションログからのリアルタイム分析にMongoDBを使用しているのを見てきました。そのスキーマフリー性は、レコードスキーマが時々変更される傾向があるアプリケーションログに本当に適しています。また、Capped Collection機能は、古いデータを自動的にパージして、データをメモリに収めておくのに役立ちます。

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


4

あなたがモンゴを好むかもしれない2つの主な理由は、

  • スキーマ設計の柔軟性(JSONタイプのドキュメントストア)。
  • スケーラビリティ-ノードを追加するだけで、水平方向に非常に適切にスケーリングできます。

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


3

ご存知のとおり、結合と「複雑なトランザクション」に関するすべてのものですが、何年も前に、COMMIT / ROLLBACKの「必要性」を説明したのはモンティ自身でした。 (データベースではなく)とにかく '-繰り返しますが、同じことです。必要なのは、Webアプリの機能の99%に対応する、ダムでありながら非常に整頓された高速のデータストレージ/検索エンジンです。


ありがとう、あなたはここで興味深い点を提起しています。純粋なアプリケーションロジックで複数のテーブルにまたがる更新の複雑なロールバックがどのように行われるのかわからないので、私はモンティの説明に本当に興味があります-これが本当に可能かどうかはわかりませんか?
オーロラ

また、「最善の」方法もわかりません。私たちは常に、DBに対して行われたすべてを追跡し、コードでアプリケーションレベルでそれを許可または元に戻しました。私たちは、どこでも、どこでもトランザクションに依存したことはありません。Mongoのドキュメントでは、メタデータを使用して、ロールバック可能なトランザクションのどの部分が発生したか、トランザクションが壊れてロールバックする必要がある場合にトランザクションの状態を追跡することを推奨しています。おもしろいことに、MySQLやその他の製品と一緒にすでにすべての作業を行っています。それはそれほど多くの作業ではなく、ブラックボックス化するのではなく、何がいつ、どこで、なぜ起こっているのかに焦点を合わせ続けます。
FYA

10genのWebサイトのどこかにこれに関する注記があります...マルチステッププロセスのステータスを示すために「インターロック」フィールドまたは「ラチェット」を手動で使用する方法について言及しています。MySQLエンジン自体にズームインすると、「ブロックトランザクション」は、何があっても、一連のステップに拡張されるように思えます。インターロックまたはラチェットは、データベースフィールドで手動で追跡するよりもはるかに小さくて高速な方法で行われるだけです。
FYA

MongoDBデーモンを制限する良い方法はまだ見つかっていません。他のprocで必要になるとすぐにメモリが生成されますが、そのインデックスとデータストレージに使用可能なRAMをほぼすべて消費します。それでも、「use_max_memory」またはその他の簡単に定義可能な制限を設定して、MongoDBが暴走してサーバーがスワップスラッシングに陥らないようにするのは良いことです(これは、最新バージョンでも数回確認されています)。少なくともMySQLは、あらゆる種類の定義可能な制限と操作のヒントを受け入れます。
FYA

直接関連はありませんが、一種:memcachedを使用していましたが、まだ解決されていないMemcache / Memcached PHPドライバーの大失敗のため、あきらめました。私たちは、apc_store()がどれほど速くて簡単かを発見するまで、MongoDBを迅速な一時的なkey:valストアとして使用しました。APCがmemcachedに格納するために使用していた一時的なクラッド(プリコンパイルされたPHPに保存されている)でいっぱいになっている場合、key:valストレージ用にMongoDBに戻します。
FYA 2012

1

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

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

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


MySQL + memcachedは結果整合性を提供します。RDMBコンテキストでACIDを考慮しません。
R.ヴァン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.