1

私はeラーニングアプリを作成しており、学生の活動をタイムラインとして表示しています。userコレクションに埋め込むか、。を使用して別のコレクションを作成する必要がありuserIdます。

制約:

  • 1対多の関係。
  • ユーザーアクティビティは詳細で多数あります
  • 90%の時間、一度に1人のユーザーのみを表示する必要があります。もう一方のケースは、スーパーバイザー(教師)がユーザーのアクティビティの概要を表示する必要がある場合です(おそらく別のコレクションですか?)
  • アクティビティを検索して生徒を見つけるユースケースについては考えていませんが、後でこれを使用する可能性がありますか?(たとえば、誰が最初に特定のアクティビティを終了したかを確認しますか?しかし、それによって関係が多対多に変わり、まったく異なる質問になります)

これらの2つの質問で、関連する問題のさまざまなスキーマを見つけました。

4

2 に答える 2

2

それらの記事は両方とも正しく、両方とも間違っています。

埋め込むか、埋め込まないか?これは常に重要な質問であり、ニーズ、クエリ、ストレージ、さらにはワーキングセットにまで及びます。

結局のところ、私たちはあなたが実際にどれが最良であるかをあなたに伝えることができないポインタを与えることができるだけです。

ただし、アクティビティフィードのサイズを考慮すると、16メガ(ユーザーあたり)を超える可能性があるため、個人的には埋め込みません。ただし、クエリの速度と能力のために、たとえば、ユーザーの最後の20のアクティビティを集計してから埋め込むことができます。これをユーザーの行に追加します(通常、最後の20が最もクエリされるものであるため)。

ただし、集約の埋め込みは依存します。シャーディングは、水平方向にスケーリングされた膨大なコレクションのクエリを処理できます。適切なクエリを使用すると、埋め込みによる実際のメリットは得られず、インデックス、ストレージ、およびそのサブドキュメントを維持するために必要なクエリ。

死ぬまでの埋め込みも。現在クエリを実行しているMongoDBの多くは、主に1つまたは2つのレベルの埋め込みに依存しているため、たとえば12のネストされたテーブルを維持するのが難しくなる可能性があります。そのときに、こことGoogleグループでそのような維持方法に関する質問が表示されるようになります。巨大なドキュメント(本当に必要な場合は、答えはクライアント側です)。

90%の時間、一度に1人のユーザーのみを表示する必要があります。もう一方のケースは、スーパーバイザー(教師)がユーザーのアクティビティの概要を表示する必要がある場合です(おそらく別のコレクションですか?)

これを考慮して、私はユーザーに集合体を格納します。これは、ユーザーが1回の往復で自分または他のユーザーのアクティビティを特異的に見ることができることを意味します。

ただし、教師がすべてのユーザーからのページ結果を取得する必要がある可能性が高いことを考慮すると、別のアクティビティコレクションを格納し、それについてクエリを実行します。サブドキュメントの集合体のページングにはいくつかのクエリが必要です。この場合は、この方法で行う方がよいでしょう。

うまくいけば、それはあなたが始めるはずです。

于 2012-11-29T08:25:17.320 に答える
1

アクティビティを生徒のドキュメントに埋め込んではいけません。

私がこれにかなり自信を持っている理由は、次のステートメントです。

「ユーザーの活動は詳細で多数」
「学生の活動をタイムラインとして表示する」
「教師はユーザーの活動の概要を確認する必要がある」

ドキュメントが増え続けるスキーマを設計することは悪い習慣です。そのため、別のアクティビティを完了/追加するたびに増え続ける学生ドキュメントがあると、パフォーマンスが低下するレシピになります。

学生のアクティビティを並べ替える場合、それぞれがアクティビティコレクション内の個別のドキュメントである場合は、学生ドキュメント内の配列である場合よりもはるかに簡単です。

複数の生徒にまたがるアクティビティについてクエリを実行する必要がある場合、すべてのアクティビティを1つのコレクションに含めると簡単になりますが、アクティビティを生徒のドキュメントに埋め込むと難しくなります(おそらく、集計フレームワークが必要になり、処理が遅くなります)。

また、将来、「誰が特定の活動を最初に終えたかを確認する必要があるかもしれません。しかし、それによって関係が多対多に変わり、まったく別の質問になります」と言いますが、そうではありません。これを多対多の関係として扱う必要はありません。1人のユーザーに関連付けられた複数のアクティビティを保存し、アクティビティ「X」に一致するすべてのレコードをクエリして、終了時間(またはその他)で並べ替え、どの生徒を確認することができます。時間が最も短いです。

于 2012-11-29T20:44:22.400 に答える