MongoDB is een documentendatabase en onderhoudt geen relaties tussen documenten zoals relationele databases zoals PostgreSQL.
Toch kunt u met MongoDB relaties tussen documenten creëren. Deze relaties kunnen worden gemodelleerd via ingebedde of gerefereerde benaderingen. Laten we dat eens van dichterbij bekijken.
Ingesloten relaties vs. Referentierelaties
Bij een ingebedde benadering wordt een document rechtstreeks in een ander document ingevoegd, wat resulteert in geneste gegevens. Het proces wordt ook wel "denormalisatie" genoemd.
De referentiebenadering daarentegen gebruikt documentverwijzingen om van het ene document naar het andere te verwijzen. Deze benadering wordt ook wel "normalisatie" genoemd.
MongoDB: één-op-één relaties met ingesloten documenten
U kunt een één-op-één-relatie tussen documenten creëren met behulp van de ingesloten benadering. Deze relatie treedt op wanneer een documentobject slechts betrekking kan hebben op een ander document.
Denk aan een studentendatabase. Deze database bevat de studenten- en adressenverzamelingen met de volgende documenten.
// Studentendocument
{
"studentName": "Frodo Balings",
"telefoonnummer": "987654321",
};
// Adresdocument
{
"studentName": "Frodo Balings",
"straat": "Bagshot Rij",
"stad": "Hobiton",
}
In deze database mag een student maar één adres hebben. Om het adres op te halen, moet je de adresverzameling opvragen met de naam van de student.
Verwant: Een database en verzameling maken in MongoDB
In gevallen waarin het adres wordt gebruikt in combinatie met andere details, zoals een studenten naam, moet u de database meerdere keren opvragen. Het nadeel hiervan is een groot aantal leesbewerkingen en bijgevolg lage queryprestaties.
Met behulp van de geïntegreerde aanpak kunt u de adresgegevens rechtstreeks in het studentendocument invoegen en slechts één zoekopdracht gebruiken om de gegevens op te halen.
{
"studentName": "Frodo Balings",
"telefoonnummer": "987654321",
"adres": [{
"straat": "Bagshot Rij",
"stad": "Hobiton"
}],
};
Om het adres op te halen via de studenten naam, gebruik deze vraag.
db.student.findOne({"studentName":"Frodo Baggins"}, {"address":1})
Een-op-veel-relaties met ingesloten documenten in MongoDB
Denk aan een situatie waarin een leerling meerdere adressen heeft. De relatie tussen de student en de adressen wordt een-op-veel.
Met het embedded model kun je meerdere adressen aan het studentendocument toevoegen. Net als in de één-op-één-relatie met ingesloten documenten, heeft deze benadering een relatief hoge queryprestatie.
{
"studentName": "Frodo Balings",
"telefoonnummer": "987654321",
"adres": [
{
"straat": "Bagshot Rij",
"stad": "Hobiton"
},
{
"street": "Nog een Bagshot Row",
"stad": "Hobiton2"
},
]
};
De onderstaande query retourneert de adressen van de opgegeven studentnaam.
db.student.findOne({studentName: “Frodo Baggins”}, {adres: 1})
Verwant: Documenten maken in MongoDB
Als u nu meer adressen heeft en ze blijft toevoegen aan het adresveld, kan het document vrij snel onoverzichtelijk worden. Een oplossing is het gebruik van documentverwijzingen.
MongoDB: één-op-veel-relaties met documentverwijzingen
U kunt ook een een-op-veel-relatie modelleren met behulp van de referentiebenadering. In dit datamodel worden de student- en adresgegevens in aparte collecties bijgehouden. Om de student aan zijn adres te koppelen, voegt u een veld met de adres-ID's toe aan het studentendocument.
{
"studentName": "Frodo Balings",
"telefoonnummer": "987654321",
"adres": [
ObjectId ("61fa7bfeebdadf8ac71427ea"),
ObjectId ("61fa7d19ebdadf8ac71427eb")
]
};
Het verkrijgen van de adresgegevens van een student omvat het ophalen van de adres-ID's uit het studentendocument en het gebruiken van die ID's om de daadwerkelijke adressen uit de verzameling op te halen.
const student = db.users.findOne({"name":"Frodo Balings"},{"address":1})
const-adressen = db.address.find({"_id":{"$in":student["address_ids"]}})
Kiezen tussen ingebedde en referentiebenaderingen
Zowel de inbeddings- als de referentiemodellen hebben hun voor- en nadelen, en je moet een aantal dingen overwegen voordat je een keuze maakt. Om te beginnen moet u rekening houden met de use-case. Als de gegevens slechts betrekking hebben op één document, kan insluiten uw beste optie zijn.
Als u een-op-veel-relaties wilt maken, kunt u het verwijzingsmodel of het ingesloten model gebruiken. Verwijzen resulteert in een schoon en consistent document, omdat u alleen de referentie-ID toevoegt van het document waaraan u wilt relateren.
Het aantal leesbewerkingen dat nodig is om de verbonden gegevens op te halen, is echter relatief hoog en kan de prestaties beïnvloeden. Het insluiten van het document kan de prestaties verbeteren, maar met veel geneste documenten kan het zijn dat u een overvolle verzameling krijgt.
De keuze hoe u de gegevensrelaties in uw document implementeert, is dus geheel aan u. Overweeg hoe u het document gaat gebruiken, het prestatieniveau van de zoekopdracht dat u nastreeft en de afwegingen die u bereid bent te maken.
Overweegt u een andere benadering van databases? Hier leest u hoe gegevensmodellering werkt in MongoDB.
Lees volgende
- Programmeren
- Programmeren
- database
Mary Gathoni is een softwareontwikkelaar met een passie voor het maken van technische inhoud die niet alleen informatief maar ook boeiend is. Als ze niet aan het coderen of schrijven is, gaat ze graag met vrienden om en is ze graag buiten.
Abonneer op onze nieuwsbrief
Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!
Klik hier om je te abonneren