Anda dapat menghindari N+1
-masalah ratusan permintaan menggunakan $in
-kueri. Pertimbangkan ini:
Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
Sekarang Anda dapat menemukan komentar posting dengan $in
kueri, dan Anda juga dapat dengan mudah menemukan semua komentar yang dibuat oleh penulis tertentu.
Tentu saja, Anda juga dapat menyimpan komentar sebagai larik tersemat di postingan, dan melakukan $in
kueri informasi pengguna saat Anda mengambil komentar. Dengan begitu, Anda tidak perlu mendenormalisasi nama pengguna dan tetap tidak memerlukan ratusan kueri.
Jika Anda memilih untuk mendenormalisasi nama pengguna, Anda harus memperbarui semua komentar yang pernah dibuat oleh pengguna tersebut saat pengguna berubah mis. namanya. Di sisi lain, jika operasi seperti itu tidak sering terjadi, itu tidak akan menjadi masalah besar. Atau mungkin lebih baik untuk menyimpan nama pengguna saat dia membuat komentar, tergantung kebutuhan Anda.
Masalah umum dengan penyematan adalah penulis yang berbeda akan menulis ke objek yang sama
, jadi Anda harus menggunakan pengubah atom
(seperti $push
). Ini terkadang lebih sulit digunakan dengan pembuat peta (saya tidak tahu mongoalchemy), dan umumnya kurang fleksibel.