ここにいくつかの考慮事項があります。結局、それはあなたの要件に依存します:
-
評価はオプションですよね?
もしそうなら、必要な機能(教師/生徒の関連付けを保存する)と便利な機能を組み合わせるかどうかを自問してください。便利な機能を実装するコードが、最も重要なコレクションに書き込まれるようになりました。 コード内の関心の分離を改善できると思います 別のデータベーススキーマを使用します。
-
その他の機能が必要ですか ?
生徒に与えた評価のリスト、生徒が教師に与えた平均評価を提供し、時間の経過に伴う評価の変化を示したいとします。これは、埋め込まれたドキュメントでは非常に厄介になります。 埋め込まれたドキュメントは柔軟性が低くなります 。
-
最高の読み取りパフォーマンスが必要な場合は、より多くのデータを非正規化する必要があります
埋め込まれたドキュメントに固執したい場合は、より多くのデータをコピーすることをお勧めします。生徒の名前を確認できる、教師ごとの評価の概要があるとします。オブジェクトを埋め込むと便利です
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
別の方法として、検討してください
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
教師/生徒の関連付けは引き続き教師オブジェクトに保存されますが、評価は別のコレクションにあります。教師と生徒の間に関連性が見つからない場合、評価を作成することはできません。
または
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
特定の教師のすべての生徒を見つけるには、最初にリンカードキュメントをクエリしてから、$in
を実行する必要があります。 生徒に質問する、またはその逆。これはもう1つのクエリですが、柔軟性が大幅に向上します。