MongoDB è un database di documenti e non mantiene relazioni tra documenti come database relazionali come PostgreSQL.
Tuttavia, MongoDB ti consente di creare relazioni tra documenti. Queste relazioni possono essere modellate tramite approcci incorporati o referenziati. Diamo un'occhiata più da vicino.
Relazioni incorporate vs. Relazioni di riferimento
In un approccio incorporato, un documento viene inserito direttamente all'interno di un altro documento, ottenendo dati nidificati. Il processo è anche chiamato "denormalizzazione".
L'approccio di riferimento, d'altra parte, utilizza i riferimenti ai documenti per puntare da un documento all'altro. Questo approccio è anche chiamato "normalizzazione".
MongoDB: relazioni uno-a-uno con documenti incorporati
È possibile creare una relazione uno-a-uno tra i documenti utilizzando l'approccio integrato. Questa relazione si verifica quando un oggetto documento può essere correlato solo a un altro documento.
Considera un database di studenti. Questo database contiene le raccolte di studenti e indirizzi con i seguenti documenti.
// Documento dello studente
{
"studentName": "Frodo Baggins",
"numero di telefono": "987654321",
};
// Documento di indirizzo
{
"studentName": "Frodo Baggins",
"street": "Bagshot Row",
"città": "Hobiton",
}
In questo database, uno studente può avere un solo indirizzo. Per recuperare l'indirizzo, dovrai interrogare la raccolta di indirizzi utilizzando il nome dello studente.
Imparentato: Come creare un database e una raccolta in MongoDB
Nei casi in cui l'indirizzo viene utilizzato insieme ad altri dettagli come a nome dello studente, dovrai interrogare il database più volte. Lo svantaggio di ciò è un numero elevato di operazioni di lettura e, di conseguenza, prestazioni di query ridotte.
Utilizzando l'approccio integrato, puoi inserire i dati dell'indirizzo direttamente nel documento dello studente e utilizzare solo una singola query per ottenere i dati.
{
"studentName": "Frodo Baggins",
"numero di telefono": "987654321",
"indirizzo": [{
"street": "Bagshot Row",
"città": "Hobiton"
}],
};
Per recuperare l'indirizzo tramite il nome dello studente, usa questa query.
db.student.findOne({"studentName":"Frodo Baggins"}, {"address":1})
Relazioni uno-a-molti con documenti incorporati in MongoDB
Considera una situazione in cui uno studente ha più indirizzi. Il rapporto tra lo studente e gli indirizzi diventa uno a molti.
Il modello incorporato consente di aggiungere più indirizzi al documento dello studente. Come nella relazione uno-a-uno che utilizza documenti incorporati, questo approccio ha prestazioni di query relativamente elevate.
{
"studentName": "Frodo Baggins",
"numero di telefono": "987654321",
"indirizzo": [
{
"street": "Bagshot Row",
"città": "Hobiton"
},
{
"street": "Un'altra fila di Bagshot",
"città": "Hobiton2"
},
]
};
La query seguente restituirà gli indirizzi del nome dello studente specificato.
db.student.findOne({studentName: “Frodo Baggins”}, {address: 1})
Imparentato: Come creare documenti in MongoDB
Ora, se hai più indirizzi e continui ad aggiungerli al campo dell'indirizzo, il documento può diventare disordinato abbastanza rapidamente. Una soluzione consiste nell'utilizzare i riferimenti ai documenti.
MongoDB: relazioni uno-a-molti con riferimenti a documenti
Puoi anche modellare una relazione uno-a-molti usando l'approccio di riferimento. In questo modello di dati, i dati dello studente e dell'indirizzo saranno conservati in raccolte separate. Per mettere in relazione lo studente con il suo indirizzo, aggiungi un campo contenente gli ID indirizzo al documento dello studente.
{
"studentName": "Frodo Baggins",
"numero di telefono": "987654321",
"indirizzo": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};
Ottenere i dettagli dell'indirizzo di uno studente implica recuperare gli ID indirizzo dal documento dello studente e utilizzare tali ID per recuperare gli indirizzi effettivi dalla raccolta.
const student = db.users.findOne({"name":"Frodo Baggins"},{"address":1})
const address = db.address.find({"_id":{"$in":student["address_ids"]}})
Scelta tra gli approcci incorporati e di riferimento
Sia i modelli di incorporamento che di riferimento hanno i loro pro e contro e dovrai considerare un paio di cose prima di fare una scelta.. Per cominciare, dovrai considerare il caso d'uso. Se i dati saranno correlati a un solo documento, l'incorporamento potrebbe essere l'opzione migliore.
Per creare relazioni uno-a-molti, è possibile utilizzare il modello di riferimento o il modello incorporato. Il riferimento risulta in un documento pulito e coerente poiché aggiungi solo l'ID di riferimento del documento a cui vuoi fare riferimento.
Tuttavia, il numero di operazioni di lettura richieste per recuperare i dati connessi è relativamente elevato e può influire sulle prestazioni. L'incorporamento del documento può aumentare le prestazioni, ma con molti documenti nidificati potresti ritrovarti con una raccolta congestionata.
La scelta di come implementare le relazioni di dati nel tuo documento dipende quindi interamente da te. Considera come utilizzerai il documento, il livello di prestazioni della query a cui miri e i compromessi che sei disposto a fare.
Considerando un approccio diverso ai database? Ecco come funziona la modellazione dei dati in MongoDB.
Leggi Avanti
- Programmazione
- Programmazione
- Banca dati
Mary Gathoni è una sviluppatrice di software con la passione per la creazione di contenuti tecnici non solo informativi ma anche coinvolgenti. Quando non sta programmando o scrivendo, le piace uscire con gli amici e stare all'aria aperta.
Iscriviti alla nostra Newsletter
Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!
Clicca qui per iscriverti