2012-01-13 11 views
1

タイトルには、投稿コレクションがあります。投稿には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について十分に知りません。まもなくテストをするつもりですが、コミュニティにアドバイスや経験があるかどうかはわかります。ありがとう!コメントで議論を与え

+0

ここで「共有」とは何ですか?リタウェイティングと同様ですか?タグに関しては、3番目のオプションが最も効率的です。配列のインデックスは非常に優れたパフォーマンスを提供します。 –

+0

はい、リツイートのようです。 – Kareem

+0

その場合、あなたの「共有」のための最も効率的なルートは、重複しています。これは例えばTwitterの仕組みです。そこにメッセージを投稿すると、送信者の「送信済み」ストリームではなく、すべてのフォロワーのストリームに格納されます。直観的/非効率的ではないと思われるかもしれませんが、リニアなスケーリングが可能で、フレンドリーで読みやすいです。 –

答えて

0

OK、:

これは、それがMongoDBの中に保存された後、それはTwitterのストリーミングAPIから来るとき、私は非必須データの一部を取り除いてきたようにつぶやきが見えるものです

{ 
    "_id" : ObjectId("4f2849353ac01aebf231408a"), 
    "place" : null, 
    "text" : "tweet text", 
    "created_at" : "Tue Jan 31 20:04:05 +0000 2012", 
    "retweet_count" : 0, 
    "favorited" : false, 
    "source" : "<a href=\"http://mobile.twitter.com\" rel=\"nofollow\">Mobile Web</a>", 
    "in_reply_to_screen_name" : null, 
    "in_reply_to_user_id" : null, 
    "retweeted" : false, 
    "in_reply_to_status_id" : null, 
    "in_reply_to_status_id_str" : null, 
    "id_str" : "123456767800304", 
    "user" : { 
    }, 
    "truncated" : false, 
    "id" : NumberLong("1234567890"), 
    "in_reply_to_user_id_str" : null, 
    "entities" : { 
     "hashtags" : [ ], 
     "user_mentions" : [ ], 
     "urls" : [ ] 
    } 
} 

ご覧のとおり、各ツイートは新しいツイートとして保存されています。これがリツイートの場合は、retweetedフラグがtrueに設定され、レスポンスであった投稿のIDと、トップレベルのフィールドで参照されたユーザの応答を返します。

関連する問題