MongoDB este o bază de date de documente și nu menține relații între documente, cum ar fi bazele de date relaționale, cum ar fi PostgreSQL.
Totuși, MongoDB vă permite să creați relații între documente. Aceste relații pot fi fie modelate prin abordări încorporate, fie prin abordări de referință. Să aruncăm o privire mai atentă.
Relații încorporate vs. Relații de referință
Într-o abordare încorporată, un document este inserat direct în interiorul altui document, rezultând date imbricate. Procesul se mai numește și „denormalizare”.
Abordarea de referință, pe de altă parte, folosește referințe la documente pentru a indica de la un document la altul. Această abordare este numită și „normalizare”.
MongoDB: Relații unu-la-unu cu documentele încorporate
Puteți crea o relație unu-la-unu între documente folosind abordarea încorporată. Această relație apare atunci când un obiect de document se poate referi doar la un alt document.
Luați în considerare o bază de date pentru studenți. Această bază de date conține colecțiile de studenți și adrese cu următoarele documente.
// Document de student
{
"studentName": "Frodo Baggins",
„phoneNumber”: „987654321”,
};
// Document de adresă
{
"studentName": "Frodo Baggins",
"street": "Bagshot Row",
„oraș”: „Hobiton”,
}
În această bază de date, un student are voie să aibă o singură adresă. Pentru a prelua adresa, va trebui să interogați colecția de adrese folosind numele studentului.
Legate de: Cum se creează o bază de date și o colecție în MongoDB
În cazurile în care adresa este utilizată în tandem cu alte detalii precum a numele studentului, va trebui să interogați baza de date de mai multe ori. Dezavantajul acestui lucru este un număr mare de operațiuni de citire și, în consecință, performanța scăzută a interogărilor.
Folosind abordarea încorporată, puteți insera datele despre adresa direct în documentul studentului și puteți utiliza doar o singură interogare pentru a obține datele.
{
"studentName": "Frodo Baggins",
„phoneNumber”: „987654321”,
"abordare": [{
"street": "Bagshot Row",
„oraș”: „Hobiton”
}],
};
Pentru a prelua adresa prin intermediul numele studentului, utilizați această interogare.
db.student.findOne({"studentName":"Frodo Baggins"}, {"adresa":1})
Relații unu-la-mulți cu documentele încorporate în MongoDB
Luați în considerare o situație în care un student are mai multe adrese. Relația dintre student și adrese devine unu-la-mai multe.
Modelul încorporat vă permite să adăugați mai multe adrese la documentul studentului. Ca și în relația unu-la-unu care utilizează documente încorporate, această abordare are o performanță de interogare relativ ridicată.
{
"studentName": "Frodo Baggins",
„phoneNumber”: „987654321”,
"abordare": [
{
"street": "Bagshot Row",
„oraș”: „Hobiton”
},
{
"street": "Un alt rând Bagshot",
„oraș”: „Hobiton2”
},
]
};
Interogarea de mai jos va returna adresele numelui de student specificat.
db.student.findOne({studentName: „Frodo Baggins”}, {address: 1})
Legate de: Cum se creează documente în MongoDB
Acum, dacă aveți mai multe adrese și continuați să le adăugați în câmpul de adresă, documentul poate deveni aglomerat destul de repede. O soluție este utilizarea referințelor documentelor.
MongoDB: Relații unu-la-mai multe cu referințe la documente
De asemenea, puteți modela o relație unu-la-mulți folosind abordarea de referință. În acest model de date, datele despre student și adresa vor fi păstrate în colecții separate. Pentru a lega studentul la adresa sa, adăugați un câmp care conține ID-urile adresei în documentul studentului.
{
"studentName": "Frodo Baggins",
„phoneNumber”: „987654321”,
"abordare": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};
Obținerea detaliilor adresei unui student implică preluarea ID-urilor de adresă din documentul studentului și utilizarea acelor ID-uri pentru a prelua adresele reale din colecție.
const student = db.users.findOne({"name":"Frodo Baggins"},{"adresa":1})
const adrese = db.address.find({"_id":{"$in":student["address_ids"]}})
Alegerea între abordările încorporate și de referință
Atât modelele de încorporare, cât și cele de referință au avantajele și dezavantajele lor și va trebui să luați în considerare câteva lucruri înainte de a face o alegere. Pentru început, va trebui să luați în considerare cazul de utilizare. Dacă datele vor fi legate doar de un document, încorporarea ar putea fi cea mai bună opțiune.
Pentru a crea relații unu-la-mai multe, puteți utiliza fie modelul de referință, fie modelul încorporat. Referința are ca rezultat un document curat și consecvent, deoarece adăugați doar ID-ul de referință al documentului la care doriți să vă raportați.
Cu toate acestea, numărul de operațiuni de citire necesare pentru a prelua datele conectate este relativ mare și poate afecta performanța. Încorporarea documentului poate crește performanța, dar cu multe documente imbricate s-ar putea ajunge la o colecție aglomerată.
Prin urmare, alegerea modului de implementare a relațiilor de date din documentul dvs. depinde în totalitate de dvs. Luați în considerare modul în care veți utiliza documentul, nivelul de performanță al interogărilor pe care îl vizați și compromisurile pe care sunteți dispus să le faceți.
Luați în considerare o abordare diferită a bazelor de date? Iată cum funcționează modelarea datelor în MongoDB.
Citiți în continuare
- Programare
- Programare
- Bază de date
Mary Gathoni este un dezvoltator de software cu o pasiune pentru crearea de conținut tehnic care nu este doar informativ, ci și antrenant. Când nu codifică sau nu scrie, îi place să iasă cu prietenii și să fie în aer liber.
Aboneaza-te la newsletter-ul nostru
Alăturați-vă buletinului nostru informativ pentru sfaturi tehnice, recenzii, cărți electronice gratuite și oferte exclusive!
Click aici pentru a te abona