2012-01-24 11 views
0

私はスケーラビリティが必要なWebアプリケーションを構築しています。簡単に言えば、組み合わせmysql mongodb

ユーザーがいて、友だちがいるのでフレンドリストがあります。ユーザーはメッセージを作成し、友人からのメッセージはホームページに表示され、各メッセージは場所にリンクされ、これらのメッセージは日付別にフィルタリングできます。たとえば、昨日投稿した場所の友だちからのメッセージをすべて表示する場所Xからのすべてのメッセージを表示してください。

私は現在、アプリケーションをMongoDbに完全に構​​築していますが、私はatmに問題に陥っています。たとえば:メインページに

  • 、我々はユーザーの友人のメッセージリストを持って、何の問題は、我々は使用しません:

$ DB->メッセージ - >「((配列を見つけますusers._id '=>配列(' $ in '=> $ userFriendListGoesHere)));

私たちは私たちのメッセージを受け取りましたが、その後、各メッセージには場所があり、すべてのメッセージをループして別のコレクションから場所を取得する必要があります。私たちはまた、MongoDb 2ループのMySqlで単に別のコレクションからすべてのユーザーデータを取得する必要があります。これは私の最初の質問です:これは問題ですか?これには多くのリソースが必要ですか?

私の考えはMySqlとMongoDbに分割することですが、私はMongoDbを使ってすべての場所を保存します(350.000以上の場所と長時間の計算を使用するため).MySQLはユーザーのメッセージ、ユーザー、 MongoDbをループで使っていけばいいのですか?または組み合わせを使用しますか?

読んでいただきありがとうございます。

答えて

2

.. MySqlでは、MongoDb 2ループの単純な結合クエリです。これが私の最初の質問です。これは問題ですか?

これはMongoDBのコースと同じですが、実際はMongoDBのトレードオフの中心です。

MongoDBは、結合が拡大縮小しないという教訓に基づいています。だから、それは結合を持っておらず、あなた自身を "あなた自身のもの"にする。 Morphia(:Java)のようなライブラリの中には、参照をロードするための組み込みロジックが用意されています。

PHPにはDoctrine projectがありますが、これはいくつかの助けになるはずです。

これには多くのリソースが必要ですか?

種類は?これは実際に実装に依存します。

明らかに、DBの前後に関係していますが、SQLバージョンよりもネットワークトラフィックが少ない可能性があります。あなたは戻って来るすべてのデータのためのメモリ空間が必要になります。しかし、これもSQLと大きく異なるわけではありません。

これがどのように実装され、誰が何をメモリに保持しているかに関して、トレードオフをすべて行うことは、本当にあなた次第です。あなたのデータはない本質的に関係あるとき

+0

SQLでは、1つのクエリを作成し、N個の結果をストリームします。この設定では、1つのクエリを作成し、N個の結果のまとまりを取得し、追加のN個のRPCを追加のデータを参照するようにします。これはほぼ確実に待ち時間/トラフィック・ヒットと比較して、SQLでローカルに実行します。余分なラウンドトリップ回数です。つまり、これらのルックアップのそれぞれは比較的安価でなければならず、何らかの理由でデータをストリーミングした場合(つまり、最初のNを表示してからスクロールして次のNを取得するAJAXリクエストを行うなど)は確かに実現可能です。 。)それはそれを相殺するかもしれません。 – James

+0

4つのテーブルを結合すると、サーバーは4つのインデックス検索+データ検索+一連のメモリ内のforループを実行する必要があります。もしあなたがMongoでそれを行うなら、あなたは引き続き4つのインデックス検索+データルックアップ+ 'for'ループを行います。 SQLのレスポンスは、通常、繰返し(結合に固有の)により多くのデータを必要とします。 Mongoはより多くのクエリを要求するでしょう。パズルの最も遅い部分はドライブですが、これらは同じように見えるので、これは4つの小さなクエリ対1つの大きなクエリ、またはレイテンシとスループットの問題になります。正直言って、どちらが良いか、レイテンシかスループットが良いかわからない。 –

0

私はMongoDBの

ループでのMongoDBを使用しておくべきは、素晴らしいアイデアです。

あなたが指定した例では、データがリレーショナルであるようです。 MySQLやその他のリレーショナルDB(Postgresなど)は、リレーショナルデータ用のMongoDBよりも優れたデータストアです。このblog postは、このトピックをより詳細にカバーしています。要約すると

、私は次のことをお勧めします:

  1. あなたのデータは、本質的に関係あるかどうかを分析するいくつかの時間をお過ごしください。
  2. もしそうでなければ、MongoDBはあなたにMySQLを使用する利点を与えることができます。
  3. リレーショナルであれば、MySQLが優れたソリューションです。
  4. 両方を使用することはもちろん可能ですが、複雑な作業が追加されます。&長期的に - それは努力する価値があるのですか?あなただけが答えを知っているでしょう。

あなたのウェブアプリに最適です!