Sebaliknya, solusi 1 dan 2 adalah pilihan terbaik Anda. Solusi 3 dapat dipertimbangkan ketika frekuensi pembaruan/pembuatan sangat kurang dibandingkan dengan frekuensi membaca proyek dan pengguna karena meskipun untuk memperbarui/membuat, memerlukan dua kueri, kemudahan membaca akan menebusnya.
Untuk memilih di antara solusi 1 dan 2, Anda perlu mempertimbangkan frekuensi baca. Apakah Anda memerlukan proyek pengguna atau penggunaan proyek lebih sering dan memilih yang sesuai dengan itu. Jika Anda merasa keduanya memiliki frekuensi yang relatif sama, lebih baik untuk menjaga objek pengguna sesedikit mungkin. Opsi apa pun yang Anda pilih, pertimbangkan untuk menyimpan index
pada larik yang menyimpan _id
s (dari proyek atau pengguna).
Misalnya.
userSchema = new Schema(
{//otherstuff
project_ids: [{type: Schema.Types.ObjectId, ref: 'Project'}})
...
})
userSchema.index({'project_ids':1})
atau
projectSchema = new Schema(
{//otherstuff
user_ids: [{type: Schema.Types.ObjectId, ref: 'User'}})
...
})
projectSchema.index({'user_ids':1})
Menjaga indeks pada larik _id
akan sangat meningkatkan kecepatan kueri Anda di sisi yang Anda khawatirkan akan ada overhead yang signifikan.
Tapi pertahankan index
hanya jika relasi ini merupakan relasi penting dengan banyak pertanyaan yang terjadi. Jika ini hanya fitur sampingan dari proyek Anda, Anda dapat melakukannya without
indeks juga.
Jika pengguna dapat melakukan banyak hal dan memiliki banyak relasi, Anda akan membutuhkan objek pengguna itu terus-menerus di seluruh aplikasi Anda, jadi jika aplikasi Anda tidak spesifik untuk proyek, akan lebih baik untuk tidak menempatkan id proyek dalam skema pengguna . Tetapi karena kami hanya meletakkan id, itu tidak terlalu membebani. Tidak perlu khawatir tentang itu.
Reg indeks pada kedua array:Ya tentu saja bisa. Tetapi ketika Anda menggunakan solusi 3, Anda tidak memerlukan indeks sama sekali karena Anda tidak akan melakukan kueri untuk mendapatkan daftar proyek pengguna atau daftar pengguna dalam suatu proyek. Solusi 3 membuat membaca menjadi sangat mudah tetapi menulis sedikit rumit. Tetapi seperti yang Anda sebutkan bahwa kasus penggunaan Anda melibatkan reading>>writing
, gunakan solusi 3 tetapi selalu ada bahaya ketidakkonsistenan data yang harus Anda tangani.
Pengindeksan hanya membuat segalanya lebih cepat. Buka dokumen dan lakukan sedikit googling. Tidak ada yang mewah. Permintaan atas array yang diindeks lebih efisien daripada array normal. Untuk mantan Mari kita asumsikan Anda menggunakan solusi 2.Simpan id proyek di bidang project_ids.
Anda bisa mendapatkan proyek pengguna dengan mudah. Ini lurus ke depan.
Tetapi untuk mendapatkan pengguna project1. Anda perlu membuat kueri seperti ini.
User.find({project_ids:project._id},function(err,docs){
//here docs will be the list of the users of project1
})
//The above query might be slow if the user base is large.
//But it can be improved vastly by indexing the project_ids field in the User schema.
Persamaan untuk solusi 1. Setiap proyek memiliki bidang user_ids. Mari kita asumsikan kita memiliki pengguna 1. Untuk mendapatkan proyek pengguna, kita lakukan query berikut
Project.find({user_ids:user1._id},function(err,docs){
//here docs will be the projects of user1
//But it can be improved vastly by indexing the user_ids field in the Project schema.
Jika Anda merenungkan solusi 1 vs solusi 2, saya kira solusi 1 lebih baik. Mungkin ada kasus di mana Anda membutuhkan pengguna tanpa proyeknya tetapi kemungkinan membutuhkan proyek tanpa pengguna cukup rendah. Tapi itu tergantung pada kasus penggunaan Anda.