MongoDB er en dokumentdatabase og opprettholder ikke relasjoner mellom dokumenter som relasjonsdatabaser som PostgreSQL.
Likevel lar MongoDB deg skape relasjoner mellom dokumenter. Disse relasjonene kan enten modelleres gjennom innebygde eller refererte tilnærminger. La oss ta en nærmere titt.
Innebygde relasjoner vs. Referanseforhold
I en innebygd tilnærming settes et dokument direkte inn i et annet dokument, noe som resulterer i nestede data. Prosessen kalles også "denormalisering".
Referansetilnærmingen, derimot, bruker dokumentreferanser for å peke fra ett dokument til et annet. Denne tilnærmingen kalles også "normalisering".
MongoDB: En-til-en-forhold med innebygde dokumenter
Du kan opprette et en-til-en-forhold mellom dokumenter ved å bruke den innebygde tilnærmingen. Dette forholdet oppstår når ett dokumentobjekt bare kan relatere til ett annet dokument.
Vurder en studentdatabase. Denne databasen inneholder student- og adressesamlingene med følgende dokumenter.
// Studentdokument
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
};
// Adressedokument
{
"studentName": "Frodo Baggins",
"street": "Bagshot-rad",
"city": "Hobiton",
}
I denne databasen kan en student kun ha én adresse. For å hente adressen må du spørre adressesamlingen ved å bruke studentens navn.
I slekt: Hvordan lage en database og samling i MongoDB
I tilfeller hvor adressen brukes sammen med andre detaljer som f.eks student navn, må du spørre databasen flere ganger. Ulempen med dette er et høyt antall leseoperasjoner og følgelig lav søkeytelse.
Ved å bruke den innebygde tilnærmingen kan du sette inn adressedataene rett inn i studentdokumentet og bare bruke en enkelt spørring for å få dataene.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresse": [{
"street": "Bagshot-rad",
"city": "Hobiton"
}],
};
For å hente adressen gjennom student navn, bruk denne spørringen.
db.student.findOne({"studentName":"Frodo Baggins"}, {"address":1})
En-til-mange forhold med innebygde dokumenter i MongoDB
Tenk på en situasjon der en student har flere adresser. Forholdet mellom eleven og adressene blir en-til-mange.
Den innebygde modellen lar deg legge til flere adresser i studentdokumentet. Som i en-til-en-forholdet ved bruk av innebygde dokumenter, har denne tilnærmingen en relativt høy søkeytelse.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresse": [
{
"street": "Bagshot-rad",
"city": "Hobiton"
},
{
"street": "Enda en Bagshot-rad",
"city": "Hobiton2"
},
]
};
Spørsmålet nedenfor vil returnere adressene til det angitte studentnavnet.
db.student.findOne({studentnavn: “Frodo Baggins”}, {adresse: 1})
I slekt: Hvordan lage dokumenter i MongoDB
Nå, hvis du har flere adresser og fortsetter å legge dem til i adressefeltet, kan dokumentet bli rotete ganske raskt. En løsning er å bruke dokumentreferanser.
MongoDB: En-til-mange forhold med dokumentreferanser
Du kan også modellere en en-til-mange-relasjon ved å bruke referansetilnærmingen. I denne datamodellen vil elev- og adressedata bli opprettholdt i separate samlinger. For å knytte studenten til adressen deres, legg til et felt som inneholder adresse-ID-ene til studentdokumentet.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresse": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};
Å få adressedetaljene til en student innebærer å hente adresse-ID-ene fra studentdokumentet og bruke disse ID-ene til å hente de faktiske adressene fra samlingen.
const student = db.users.findOne({"name":"Frodo Baggins"},{"address":1})
const addresses = db.address.find({"_id":{"$in":student["address_ids"]}})
Velge mellom innebygde og referansetilnærminger
Både innbyggings- og referansemodellene har sine fordeler og ulemper, og du må vurdere et par ting før du tar et valg. For det første må du vurdere brukstilfellet. Hvis dataene bare vil være relatert til ett dokument, kan innebygging være det beste alternativet.
For å lage en-til-mange-relasjoner kan du bruke enten referansemodellen eller den innebygde modellen. Referering resulterer i et rent og konsistent dokument siden du bare legger til referanse-IDen til dokumentet du ønsker å forholde deg til.
Antallet leseoperasjoner som kreves for å hente de tilkoblede dataene er imidlertid relativt høyt og kan påvirke ytelsen. Innbygging av dokumentet kan øke ytelsen, men med mange nestede dokumenter kan du ende opp med en overbelastet samling.
Å velge hvordan du implementerer datarelasjonene i dokumentet ditt er derfor helt opp til deg. Vurder hvordan du vil bruke dokumentet, søkeytelsesnivået du sikter mot, og avveiningene du er villig til å gjøre.
Vurderer du en annen tilnærming til databaser? Her er hvordan datamodellering fungerer i MongoDB.
Les Neste
- Programmering
- Programmering
- database
Mary Gathoni er en programvareutvikler med en lidenskap for å lage teknisk innhold som ikke bare er informativt, men også engasjerende. Når hun ikke koder eller skriver, liker hun å henge med venner og være utendørs.
Abonner på vårt nyhetsbrev
Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!
Klikk her for å abonnere