0

私は MongoDB でソーシャル ネットワークを実装しており、ユーザーごとにフォロワーとフォローを追跡する必要があります。ユーザーを検索するときに、ユーザー名、写真、フォロワーとフォローの数を含む Facebook のようなリストを表示したいと考えています。ユーザー名と画像 (変更されない情報) を表示したいだけなら簡単ですが、フォロワーとフォローの数 (かなり定期的に変更されます) も表示する必要があります。

私の現在の戦略は、ユーザーがフォローしているユーザーを各ユーザー ドキュメントに埋め込むことです。

firstName: "Joe",
lastName: "Bloggs",
follows: [
 {
   _id: ObjectId("520534b81c9aac710d000002"),
   profilePictureUrl: "https://pipt.s3.amazonaws.com/users/xxx.jpg",
   name: "Mark Rogers",
 },
 {
   _id: ObjectId("51f26293a5c5ea4331cb786a"),
   name: "The Palace Bar",
   profilePictureUrl: "https://s3-eu-west-1.amazonaws.com/businesses/xxx.jpg",
 }
]

問題は、フォロワー数と各ユーザーのフォロー数を追跡するための最良の戦略は何ですか?

埋め込みドキュメントの一部としてフォロー/フォローの数を含めると、つまり

follows: [
{
  _id: ObjectId("520534b81c9aac710d000002"),
  profilePictureUrl: "https://pipt.s3.amazonaws.com/users/xxx.jpg",
  name: "Mark Rogers",
  **followers: 10,**
  **following: 400**
}

次に、ユーザーが誰かをフォローするたびに、すべての埋め込みドキュメントにわたって複数の更新が必要になります。

このデータの一貫性はそれほど重要ではないので (つまり、11 人のフォロワーではなく 10 人のフォロワーを誰かに見せても、世界の終わりではありません)、この更新をキューに入れることができます。このアプローチは大丈夫ですか、それともより良いアプローチを提案できますか?

4

2 に答える 2

1

あなたは正しい軌道に乗っています。どちらの計算がより多く実行されるかを考えてみてください - フォロワー数の決定/フォローまたはフォロワー数の変更/フォロー? フォロワー数/フォロー数の計算の出力をキャッシュしている場合でも、数を変更するよりも 1 桁または 2 桁多く実行されます。

また、逆のことも考えてください。これらのユーザーごとにフォロワー/フォローの数を表示する必要がある場合は、ロードごとに集計を行う必要があります (または、どこかにキャッシュしますが、まだ多くの計算を行っています)。

オプション 1 : 埋め込みドキュメントのフォロワー/フォローの数をキャッシュします。
利点: O(1) 時間で統計を表示できる欠点:
フォロー/フォロー解除に O(N) 時間が必要

オプション 2 : ページ ビューごとにフォロワー/フォローの数をカウントする (またはキャッシュの無効化)
利点: O(1) 時間でフォロー/フォロー解除できる 欠点:
表示に O(N) 時間かかる

フォロワー/フォロー中の統計は最終的に一貫している可能性があるという事実を追加しますが、カウントはオンデマンドで表示する必要があり、それをキャッシュするのは非常に簡単な決定だと思います.

于 2013-08-20T17:56:41.663 に答える