2011-11-21 5 views
6

私は、フォロワーのコレクションを次の場所に埋め込むべきかどうかに関する基本的な質問をmongo dbに持っています。ユーザーオブジェクトに次の組み込みコレクションを組み込むのは理にかなっていますが、逆のフォロワーコレクションも組み込むことも意味がありますか?それは私が更新し、両方のプロファイル記録に埋め込む必要がありますを意味します:フォロイーの組み込みリストフォロワー 以下のmongo dbデザインとフィード、どこに埋め込むべきですか?

  • に埋め込まリスト以下やフォロワー

    I」をすることができます私が何らかの理由でトランザクションを保持したり、状況をどこかで更新しない限り、それに対するアトミック性は保証されません。それは両方のエンティティに埋め込む価値がありますか?私はフォロワーのプロファイルに次の埋め込みを埋め込み、#1を更新して、それにインデックスを付けてすべてのプロファイルにわたって逆のフォロワーを照会することができますか?パフォーマンスがあまりにも高すぎますか?

    これは埋め込まれてはならないコレクションの候補ですか?私はfolloweridとfollowsbyIdで独自のコレクションに次のように保存する辺のコレクションを持っているだけでしょうか?

    私は両方のユーザーにフィードを更新する必要がある場合は、それをフォローしたりフォローしたりするときに、どうすればいいですか?

    ユースケースとして、ユーザーは自分のフィードを見るときに従う人物を見ることになります。これは非常に頻繁に起こります。また、誰かのプロフィールの詳細を見るとプロフィールのフォロワーも見られます第1の場合ほどはない。どちらの場合も、すべてのプロファイルページでフォローしているフォロワーとフォロワーの合計数が表示されます。

    一般に
  • 答えて

    11

    、いくつかの理由のために、以下の/に続く-により、ユーザー文書に関係を埋め込むために悪い考えです:

    (1)が16メガバイトの最大原稿サイズ制限があり、人気のあること、それはもっともらしいです十分に購読されているサイトのユーザーは最大文書サイズに近づく数十万人のフォロワーに終わることがあります。

    (2)フォロワー関係は頻繁に変更されるため、あなたがフォロワーを埋め込んでいるならば、文書の成長が繰り返されます。頻繁な文書の増加は、MongoDBのパフォーマンスを大幅に低下させるので避けてください(特に、文書が安定した最終サイズになる傾向があり、パフォーマンスが低下することはありません)。

    したがって、次の/後続の関係を、それぞれ_id:、oid:}の2つのフィールドを持つレコードの別々のコレクションに分割し、_idにインデックスを付けます私は?」)とoid(「誰が私に従っている?」という質問)個々の状態の変化は、単一のドキュメントの追加または削除によってモデル化されますが、フォロワー数なども表示している場合は、エッジの挿入/削除後に更新するカウンタを別々にする必要があります。

    (もちろん、ビジネス要件では一貫性の詳細に柔軟性があると仮定しています。一般に、表示コードで304人のフォロワーがいることをユーザーに伝えて列挙する場合は、従業員は304までの集計を列挙していました。ビジネス要件では絶対的な一貫性が必要な場合は、トランザクションを隔離するデータベースが必要です。そうしないと、すべてのユーザーIDを表示する際にカウントする必要があります)。

    +1

    本質的に非常にリレーショナルであるにもかかわらず、私はあなたの解釈に完全に同意します。これは関係が完璧な意味を持つ場所の1つであり、あなたはこのようにパフォーマンスペナルティに終わることはありません。 –

    +0

    これは「好き」にも適用されますか? mongoウェブサイトの投票の例では、ドキュメントにそのようなものが埋め込まれていますが、同様の理由だけでなく推論の行も同じように見えます。 – MonkeyBonkey

    +0

    @MonkeyBonkey - このアプローチは「好き」にも使用される可能性がありますが、おそらくインデックスのうちの1つしか必要としません。 "likes"シナリオに埋め込む利点は、$ inc演算子を使って "likers"の正確な数を維持できることです。また、これはサイトにも依存しますが、1つのポストを好む人の数は、トラフィックの多いユーザーのフォロワーと同じレベルに達する可能性は低いので、最悪の場合のパフォーマンスはそれほど重要ではありません。 – mpobrien

    関連する問題