MongoDB - Hubungan
Hubungan di MongoDB menunjukkan bagaimana berbagai dokumen secara logis terkait satu sama lain. Hubungan dapat dimodelkan melaluiEmbedded dan Referencedpendekatan. Hubungan tersebut dapat berupa 1: 1, 1: N, N: 1 atau N: N.
Mari kita pertimbangkan kasus penyimpanan alamat untuk pengguna. Jadi, satu pengguna dapat memiliki beberapa alamat sehingga menjadikannya sebagai hubungan 1: N.
Berikut adalah contoh struktur dokumen user dokumen -
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
Berikut adalah contoh struktur dokumen address dokumen -
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
Memodelkan Hubungan Tertanam
Dalam pendekatan tertanam, kami akan menanamkan dokumen alamat di dalam dokumen pengguna.
> db.users.insert({
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address": [
{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "Chicago",
"state": "Illinois"
}
]
}
})
Pendekatan ini memelihara semua data terkait dalam satu dokumen, yang membuatnya mudah untuk diambil dan dipelihara. Seluruh dokumen dapat diambil dalam satu query seperti -
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Perhatikan bahwa dalam kueri di atas, db dan users adalah database dan koleksi masing-masing.
Kekurangannya adalah jika ukuran dokumen yang disematkan terus bertambah, hal itu dapat memengaruhi kinerja baca / tulis.
Memodelkan Hubungan yang Dirujuk
Ini adalah pendekatan mendesain hubungan yang dinormalisasi. Dalam pendekatan ini, dokumen pengguna dan alamat akan disimpan secara terpisah tetapi dokumen pengguna akan berisi bidang yang akan mereferensikan dokumen alamat.id bidang.
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
Seperti yang ditunjukkan di atas, dokumen pengguna berisi bidang array address_idsyang berisi ObjectIds dari alamat yang sesuai. Dengan menggunakan ObjectIds ini, kita dapat menanyakan dokumen alamat dan mendapatkan detail alamat dari sana. Dengan pendekatan ini, kita membutuhkan dua query: pertama untuk mengambiladdress_ids bidang dari user dokumen dan kedua untuk mengambil alamat ini dari address koleksi.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})