9

同様の質問が寄せられていることは知っていますが、基本的な質問に対する非常に基本的な回答を探しています。私は MongoDB を初めて使用し、Twitter スタイルのアプリ (ブログ、フォロワーなど) を作成しています。使用する最適なスキーマを考えています。

現在、私は(非常に高いレベルで)持っています:

Member {
  login: string,
  pass: string,
  posts: [
    {
      title: string,
      blog: string,
      comments: [ { comment: string } ]
    }
  ]
}

まだまだありますが、それでアイデアが得られます。 問題は、「フォロー」機能を追加しようとしているのですが、最適なルートがわからないことです。

「次の」埋め込みドキュメントをメンバーに追加できますが、mongoDB を使用して最もスマートな方法が何であるかはわかりません。私の主な関心事は明らかに、フォローしているすべての人の投稿を表示するメインの「フィード」ページです。

4

3 に答える 3

11

これは、Twitterクローンにとって理想的なスキーマではありません。主な問題は、「投稿」が増え続ける配列であるということです。つまり、mongoは、ドキュメントのパディングが不足しているため、数件の投稿ごとに大量のドキュメントを移動する必要があります。さらに、ドキュメントには厳しい(16mb)サイズ制限があり、このスキーマはせいぜい制限的です。

理想的なスキーマは、Twitterの負荷を期待するかどうかによって異なります。保守性と使いやすさの点で「完璧な」mongodbスキーマは、Twitterのスループットで何かに使用するものと同じではありません。たとえば、前者の場合、投稿ごとにドキュメントを含む投稿コレクションを使用します。高スループットのシナリオでは、投稿の小さなグループ(たとえば、「もっと見る」ページごとに1つ)のバケットドキュメントの作成を開始します。さらに、高スループットのシナリオでは、フォロワーのタイムラインを個別のユーザータイムラインドキュメントで最新の状態に保つ必要がありますが、低スループットのシナリオでは、単純にクエリを実行できます。

于 2011-06-29T13:59:25.887 に答える
0

メンバードキュメントに「次の」配列を追加すると、うまくいくはずです。メンバーがフォローしているユーザーのユーザーIDが含まれている必要があります。コードはリストを取得し、それらのユーザーのツイートを取得するクエリを作成する必要があります。Mongoは非リレーショナルであるため、MemberコレクションとTweetコレクションを結合し、これを1つのクエリで実行するクエリを作成する方法はありませんが、サーバー側のコード実行を使用してデータベースサーバーでこれを実行することにより、ネットワークオーバーヘッドを削減できるはずです。 :http ://www.mongodb.org/display/DOCS/Server-side+Code+Execution 。

于 2011-06-29T05:34:15.330 に答える
0

この質問は、ブログ投稿の例で広く使用されている質問と、ブログ投稿とコメントをモデル化する方法と同じです。ここでも同じ概念を適用する必要があります。次のオプションがあります。

  • 埋め込みドキュメント
  • 専用のコレクションと複数のクエリの実行

長所と短所は広く議論されています。埋め込みドキュメントのサイズは 16MB しかなく、MongoDB で一致した配列の個々の部分を返すことはできません...選択してください。

前述のとおり、「スキーマ設計」に関する多くの質問で同じ質問が議論されているため、これ以上先に進みません。「Schema Design MongoDB」をグーグルで検索するか、SOで同じものを探してください。

于 2011-06-29T04:57:06.757 に答える