タイトルには、投稿コレクションがあります。投稿にはuserId(著者)があります。別のユーザーが投稿を共有することができます。投稿にはタグもあります。これらのタグのIDの配列はカテゴリに分類されています。クイック検索のためにこれを保存するには?ソーシャルネットワーキングサイトにMongoDBの投稿を効率的に保存する方法は?
使用例:あなたは接続しています。あなたはあなたの接続からの投稿、またはあなたの接続で共有された投稿を見ます。投稿にはページ上で注文された「ベロシティ」があります。共有ポストはオリジナルの速度を継承して保持することも、独自の速度で生きることも死ぬこともできます。何が最善であるか分からない。
オプション私が考えられてきた:この方法では
Post {id :uniquePostId, userId: authorId, shares: [userIds of those who shared], tagIds: [tagIds for post]}
問題:モンゴはあなたのインデックス2つの配列をすることはできません。したがって、tagIdsと共有の両方でクエリを実行する場合は、クエリが遅くなることがあります。両方を個別に索引付けすると、ほぼ完全な表スキャンになります。
別のオプション:このアプローチの
Post {id: uniquePostId, userId: user who authored or shared the post, original: {postId: the original postId, or null if this is it, userId: the author of the original post}}
問題:あなたはどのように、あなたは20件の記事を取得したいと言うので、あなたがあなたの接続にはuserIdに問い合わせる
あなたはそうのようなポストを複製あなたの接続の重複した株式を扱う?一種の醜いものになる。私が読んだ
他のアプローチ:
post: {
shares_and_tags: [{type: share, id: 1}, {type: tag, id:4}, ...]
}
これは、インデックスの問題を解決しているようだが、私はここにパフォーマンスへの影響を知るためにはMongoについて十分に知りません。まもなくテストをするつもりですが、コミュニティにアドバイスや経験があるかどうかはわかります。ありがとう!コメントで議論を与え
ここで「共有」とは何ですか?リタウェイティングと同様ですか?タグに関しては、3番目のオプションが最も効率的です。配列のインデックスは非常に優れたパフォーマンスを提供します。 –
はい、リツイートのようです。 – Kareem
その場合、あなたの「共有」のための最も効率的なルートは、重複しています。これは例えばTwitterの仕組みです。そこにメッセージを投稿すると、送信者の「送信済み」ストリームではなく、すべてのフォロワーのストリームに格納されます。直観的/非効率的ではないと思われるかもしれませんが、リニアなスケーリングが可能で、フレンドリーで読みやすいです。 –