1

オンラインチャットを作成しています。

コンテキスト (必要な場合):

これまでのところ、PHP/MySQL と AJAX を使用して作業を行っていましたが、スケーラビリティに関する懸念がある「プル」タイプのアプリケーションで立ち往生しているため、これは健全なソリューションではありません。「プッシュ」メソッドの代替案について読みましたが、選択肢が限られているようで、PHP を除外しているようです。Websockets は、すべてのブラウザーに統合されていれば非常に興味深いオプションになる可能性がありますが、そうではありません (それを実装しているほとんどのブラウザーでは、デフォルトで無効になっているようです)。ロング ポーリングも候補の 1 つですが、同時に開いている接続の数など、Web アプリを停止させる可能性のある他の問題も伴います。

これが、私の意志に反して、実行可能な唯一のオプションがサーバー側の JavaScript を使用することだと思う理由です (node.js + now.js が私の選択です)。

そうは言っても、データベースの使用についても再考する必要があるかもしれません。各ユーザーの保存データを保持し、これらのユーザーを送信されたメッセージにリンクする必要があります。プッシュ システムによって駆動されるチャット エンジンの場合、MySQL は依然として価値のある選択肢でしょうか? NoSQL データ管理について読みましたが、MongoDB は node.js に追加するのに適しているようです。

私の2つの質問:

  1. リアルタイム Web アプリケーションの場合、MySQL (既に知っている) ではなく、NoSQL システム (ゼロから学ぶ必要がある) に移行した方が良い理由はありますか?

  2. MySQL で次のように言いましょう。

    • user (user_id_p, username) というテーブルがあります
    • メッセージというテーブルがあります (message_id, message, user_id_f)
    • ユーザー名「omgtheykilledkenny」に関連付けられたすべてのメッセージを取得する単一のクエリを作成したいと考えています。

    十分に単純ですが、MongoDB とそのコレクションの哲学でそれを達成するにはどうすればよいでしょうか?

ご協力ありがとうございました。

4

2 に答える 2

0
  1. Mongo のドキュメント構造はすでに JSON 風になっているため、node.js/MongoDB での作業はすばらしいので、クエリを JSON に変換する必要はありません。JavaScript を既に知っている場合は、MongoDB の学習を有利に進めることができます。Mongo は書き込みと読み取りのスケーリングが非常に簡単で、速度も非常に優れていますが、Mongo とよく比較される単一のシステムでの MySQL ベンチマークをいくつか見てきました。

  2. 別のメッセージ コレクションがあり、ユーザーの ID が既にわかっていると仮定すると、次のように実行できます。db.messages.find({user_id:ObjectId(...)});

更新: ユーザー ID がわからない場合は、2 つのクエリを実行する必要があります (他の回答で推奨されているように埋め込み配列を使用しない限り)。サブセットだけを表示するために、メッセージのドキュメント/リスト全体を照会することになるためです)。ユースケースによっては、明らかに、ユーザー名があれば、このような状況でユーザー ID を手元に置いておくこともできます。それが機能しないユーザー名を与えるクライアント入力である場合。

Update2: 一意のユーザー名がある場合は、この問題を回避するために、ユーザー名をユーザー コレクションの _id にすることができます。ほとんどの人はおそらくこれに反対するでしょうが、ユーザー名の変更が難しくなるなど、いくつかの明確な欠点があります.

于 2012-04-23T18:24:35.543 に答える
0

MongoDB では結合を実行できないため、2 番目の要件を達成できません。これを行うMongoの方法は、ユーザーコレクション内にメッセージをネストすることです。

{ ユーザー名: 'abc'、メッセージ: [...]}

または、結合とネストされたドキュメントの間の一種の中途半端な refId を使用します。

http://uk3.php.net/manual/en/class.mongodbref.php

MySQL から Mongo への切り替えに関しては、必ずしも MySQL を完全に捨てる必要はありません。一方が他方よりも適切なユースケースがあります。必要に応じて、システムのさまざまな部分に両方を使用できます。個人的には、過去に多くのことで MySQL を使用しており、現在は大きなプロジェクトで MongoDB を使用しています。MongoDB ドライバーを使用するのは非常に簡単で、MongoDB サイトはドキュメント全体として非常に優れているため、移行は非常に簡単であることがわかりました。

フロントエンドから json_encode と json_decode を使用して JSON との間で変換し、MongoDB の PHP ドライバーを使用して配列でクエリと挿入/更新を行うことができるため、MySQL よりも直感的で使いやすいと言えます。あとは慣れの問題ですね。

于 2012-04-23T19:04:02.200 に答える