0

MongoDB を使用して、Hacker-News または Reddit スタイルのソーシャル ニュース サイトを構築しています。クリック数をリンクの人気スコアに組み込むために、各リンクをクリックした人数を保存したいとします。データをどのように整理すればよいですか? 私はできた:

A) リンクをクリックしたユーザーの配列を各リンク オブジェクトに格納します。

B)各ユーザーオブジェクトでクリックされたリンクの配列を保存します

C) 両方を行う

D) 何か他のことを… (しかし、何?)

A) の利点は、各リンクのクリック数を簡単に取得できることです。一方、B) の利点は、ユーザーがクリックしたリンクの履歴を簡単に表示できることです。もちろん、C) では両方を実行できますが、データが複製されるという犠牲が伴います。

最高のパフォーマンスを得るには、どのソリューションを選択すればよいでしょうか? これにアプローチする「正しい」方法はありますか?

4

5 に答える 5

4

ドキュメントの最大サイズのため、おそらくこれらすべての情報を含む、redis のような新しいデータベースを追加します。そうすることでパフォーマンスを上げることができます。私が構築したアプリでこの問題が発生しました。実際、多くのいいねの後、ドキュメントの読み込みが遅くなり始めます。

しかし、mongodb だけが必要な場合は、おそらく別のコレクションに追加します。これにより、ある程度の冗長性が得られますが、その部分は完全にリレーショナル部分であり、noSQL ドキュメント指向のデータベースではややこしい場合があります。

それらを数えやすくするために、もちろん、リンク ドキュメントにいいね! の数を保持することができます。しかし、そこをクリックしたすべてのユーザーを保持しようとはしません。また、それをユーザーに埋め込むこともありません。

お役に立てれば

于 2012-10-21T09:34:06.807 に答える
1

一般に、NoSQL データベースでは、データを冗長に格納することが推奨されます。(これは、リレーショナル結合をサポートしていないため、データの取得を容易にするためにスキーマをある程度非正規化する必要があるためです。)そして、この場合、指摘したように、リンクをユーザーのレコードにのみ保存する場合、またはその逆の場合、必要なすべてのクエリを実行するのは簡単でも効率的でもありません (基本的に、コレクション内のすべてのドキュメントをスキャンする必要があります)。

Cしたがって、最良のアプローチは、検索を容易にするためにデータを双方向に保存することだと思います。

于 2012-10-21T09:16:43.150 に答える
0

両方のコレクションにデータを保存します...ただし、必要なプロパティのみを使用します。

アプリで、どこかでそのデータに到達する必要がある場合... 1 つのマップで取得するのが最善です...

もし私があなたなら、ためらわずにデータを複製します...

一方、私たちが話しているリンクやユーザーの数は?

于 2012-10-21T09:53:26.197 に答える
0

あなたの質問によると

ユーザーオブジェクトにリンクを保存し、リンクオブジェクトの数値を使用してクリック数をカウントするだけです。

次に、ユーザー オブジェクトのリンク配列にインデックスを設定します。

だからあなたはできる

  • ユーザー オブジェクト内のすべてのクリック リンクを取得します。
  • リンク オブジェクトを使用して、クリック数を取得します。
  • ユーザー オブジェクトのリンク インデックスを使用して、リンクをクリックしたユーザーをすばやく見つけます。

インデックス配列の例: MongoDB はどのように配列にインデックスを付けますか?

于 2012-10-21T20:32:45.287 に答える
0

ドキュメントの各クリックをユーザーとリンクとともに保存し、クエリを実行して、リンクごとのクリック数とクリックしたリンクの履歴の両方を取得できます。

(パフォーマンスについては、私はそれが何の価値があるのか​​ わかりません。ユーザーとリンクにインデックスを付けるかもしれません)

于 2012-10-21T09:25:37.813 に答える