MongoDB - Relazioni
Le relazioni in MongoDB rappresentano il modo in cui i vari documenti sono logicamente correlati tra loro. Le relazioni possono essere modellate tramiteEmbedded e Referencedapprocci. Tali relazioni possono essere 1: 1, 1: N, N: 1 o N: N.
Consideriamo il caso della memorizzazione degli indirizzi per gli utenti. Quindi, un utente può avere più indirizzi rendendo questa relazione 1: N.
Di seguito è riportata la struttura del documento di esempio di user documento -
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
Di seguito è riportata la struttura del documento di esempio di address documento -
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
Modellazione di relazioni incorporate
Nell'approccio incorporato, incorporeremo il documento dell'indirizzo all'interno del documento dell'utente.
> 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"
}
]
}
})
Questo approccio mantiene tutti i dati correlati in un unico documento, il che ne semplifica il recupero e la manutenzione. L'intero documento può essere recuperato in una singola query come:
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Nota che nella query sopra, db e users sono rispettivamente il database e la raccolta.
Lo svantaggio è che se il documento incorporato continua a crescere di dimensioni eccessive, può influire sulle prestazioni di lettura / scrittura.
Modellazione delle relazioni referenziate
Questo è l'approccio per progettare una relazione normalizzata. In questo approccio, sia il documento dell'utente che quello dell'indirizzo verranno conservati separatamente, ma il documento dell'utente conterrà un campo che farà riferimento al documento dell'indirizzoid campo.
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
Come mostrato sopra, il documento utente contiene il campo array address_idsche contiene ObjectIds di indirizzi corrispondenti. Usando questi ObjectID, possiamo interrogare i documenti dell'indirizzo e ottenere i dettagli dell'indirizzo da lì. Con questo approccio, avremo bisogno di due query: prima di recuperare il fileaddress_ids campi da user documento e il secondo da cui recuperare questi indirizzi address collezione.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})