Di MongoDB, indeks unik memastikan bahwa nilai tertentu dalam bidang tidak ada di lebih dari satu dokumen. Ini akan tidak menjamin bahwa suatu nilai unik di seluruh larik dalam satu dokumen. Ini dijelaskan di sini di Manual MongoDB yang membahas Indeks multikey yang unik.
Dengan demikian, indeks unik tidak akan memenuhi kebutuhan Anda. Ini akan mencegah dokumen terpisah dari berisi kombinasi duplikat, tetapi masih akan memungkinkan satu dokumen berisi nilai duplikat di seluruh array.
Pilihan terbaik yang Anda miliki adalah mengubah model data Anda untuk membagi array objek technologyEmployeeRef ke dalam dokumen terpisah. Memisahkannya menjadi dokumen terpisah akan memungkinkan Anda menggunakan indeks unik untuk menegakkan keunikan.
Implementasi tertentu yang harus diambil untuk perubahan model data ini akan bergantung pada pola akses Anda (yang berada di luar cakupan pertanyaan ini).
Salah satu cara yang dapat dilakukan adalah dengan membuat koleksi TechnologyEmployee yang memiliki semua bidang yang saat ini ada dalam array technologyEmployeeRef. Selain itu, koleksi TechnologyEmployee ini akan memiliki bidang, seperti email, yang memungkinkan Anda mengaitkannya dengan dokumen dalam koleksi Employee.
Contoh Dokumen Karyawan
{
....
....
"firstName" : "John",
"lastName" : "Doe",
"email" : "[email protected]",
.....
.....
.....
}
Contoh Dokumen EmployeeTechnology
{
"email" : "[email protected]",
"technologyCd" : "Java",
"technologyName" : "Java8",
....
.....
"status" : "A"
}
Indeks dalam koleksi EmployeeTechnology
{'email' : 1, 'technologyCd' : 1}, {unique: true}
Kerugian dari pendekatan ini adalah Anda perlu membaca dari dua koleksi untuk mendapatkan semua data. Kelemahan ini mungkin bukan masalah besar jika Anda jarang perlu mengambil data dari kedua koleksi secara bersamaan. Jika Anda memang membutuhkan semua data, itu dapat dipercepat melalui penggunaan indeks. Dengan indeks, ini dapat lebih dipercepat melalui penggunaan kueri tertutup.
Pilihan lain adalah mendenormalisasi data. Anda akan melakukannya dengan menduplikasi data Karyawan yang perlu Anda akses pada saat yang sama dengan data Teknologi.
Contoh Dokumen
[
{
....
"firstName" : "John",
"lastName" : "Doe",
"email" : "[email protected]",
.....
"technologyCd" : "Java",
"technologyName" : "Java8",
....
"status" : "A"
},
{
....
"firstName" : "John",
"lastName" : "Doe",
"email" : "[email protected]",
.....
"technologyCd" : "Spring",
"technologyName" : "Spring Boot2",
....
"status" : "A"
}
]
Dalam posting blog MongoDB ini, mereka mengatakan bahwa
Anda akan melakukan ini hanya untuk bidang yang sering dibaca, dibaca lebih sering daripada yang diperbarui, dan di mana Anda tidak memerlukan konsistensi yang kuat, karena memperbarui nilai yang didenormalisasi lebih lambat, lebih mahal, dan tidak atomik.
Atau seperti yang telah Anda sebutkan, mungkin masuk akal untuk membiarkan model data apa adanya dan melakukan pemeriksaan keunikan di sisi aplikasi. Ini mungkin bisa memberi Anda kinerja membaca terbaik, tetapi itu memang datang dengan beberapa kelemahan. Pertama, ini akan memperlambat operasi penulisan karena aplikasi perlu menjalankan beberapa pemeriksaan sebelum dapat memperbarui database.
Ini mungkin tidak mungkin, tetapi ada juga kemungkinan bahwa Anda masih bisa berakhir dengan duplikat. Jika ada dua permintaan back-to-back untuk memasukkan objek EmployeeTechnology yang sama ke dalam array, maka validasi permintaan kedua dapat selesai (dan lulus) sebelum permintaan pertama ditulis ke database. Saya sendiri telah melihat skenario serupa dengan aplikasi yang saya kerjakan. Meskipun aplikasi sedang memeriksa keunikan, jika pengguna mengklik dua kali tombol kirim, akan ada entri duplikat dalam database. Dalam hal ini, menonaktifkan tombol pada klik pertama secara drastis mengurangi risiko. Risiko kecil ini mungkin dapat ditoleransi, tergantung pada kebutuhan Anda dan dampak dari entri duplikat.
Pendekatan mana yang paling masuk akal sangat bergantung pada pola akses dan persyaratan Anda. Semoga membantu.