Berikut adalah beberapa pertimbangan. Pada akhirnya, itu tergantung pada kebutuhan Anda:
-
Peringkat adalah opsional, bukan?
Jika demikian, tanyakan pada diri Anda apakah Anda ingin menggabungkan fitur yang diperlukan (menyimpan asosiasi guru/siswa) dengan fitur yang bagus untuk dimiliki. Kode yang mengimplementasikan fitur yang bagus untuk dimiliki sekarang menulis ke koleksi terpenting Anda. Saya pikir Anda dapat meningkatkan pemisahan masalah dalam kode Anda dengan skema db yang berbeda.
-
Apakah Anda memerlukan lebih banyak fitur ?
Katakanlah Anda ingin memberikan daftar peringkat yang mereka berikan kepada siswa, nilai rata-rata yang diberikan siswa kepada guru, dan Anda ingin menunjukkan perkembangan peringkat dari waktu ke waktu. Ini akan sangat berantakan dengan dokumen yang disematkan. Dokumen yang disematkan kurang fleksibel .
-
Jika Anda membutuhkan kinerja baca terbaik, Anda perlu mendenormalisasi lebih banyak data
Jika Anda ingin tetap menggunakan dokumen yang disematkan, Anda mungkin ingin menyalin lebih banyak data. Katakanlah ada ikhtisar peringkat per guru di mana Anda dapat melihat nama siswa. Akan sangat membantu untuk menyematkan objek
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Sebagai alternatif, pertimbangkan
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
Himpunan guru/siswa akan tetap tersimpan di objek guru, tetapi peringkatnya berada di koleksi yang berbeda. Peringkat tidak dapat dibuat jika tidak ada hubungan antara guru dan siswa yang dapat ditemukan.
atau
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
Untuk menemukan semua siswa untuk guru tertentu, Anda harus menanyakan dokumen penaut terlebih dahulu, lalu melakukan $in
pertanyaan pada siswa, dan sebaliknya. Itu adalah satu lagi permintaan, tetapi datang dengan keuntungan besar dalam fleksibilitas.