MongoDB er en dokumentdatabase og vedligeholder ikke relationer mellem dokumenter som relationelle databaser såsom PostgreSQL.
Alligevel giver MongoDB dig mulighed for at skabe relationer mellem dokumenter. Disse relationer kan enten modelleres gennem indlejrede eller refererede tilgange. Lad os se nærmere.
Indlejrede relationer vs. Referenceforhold
I en indlejret tilgang indsættes et dokument direkte i et andet dokument, hvilket resulterer i indlejrede data. Processen kaldes også "denormalisering".
Referencetilgangen bruger på den anden side dokumentreferencer til at pege fra et dokument til et andet. Denne tilgang kaldes også "normalisering".
MongoDB: En-til-en-relationer med indlejrede dokumenter
Du kan oprette et en-til-en-forhold mellem dokumenter ved hjælp af den indlejrede tilgang. Dette forhold opstår, når ét dokumentobjekt kun kan relatere til ét andet dokument.
Overvej en elevdatabase. Denne database indeholder elev- og adressesamlinger med følgende dokumenter.
// Elevdokument
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
};
// Adressedokument
{
"studentName": "Frodo Baggins",
"street": "Bagshot række",
"city": "Hobiton",
}
I denne database må en elev kun have én adresse. For at hente adressen skal du forespørge adressesamlingen ved hjælp af elevens navn.
Relaterede: Sådan opretter du en database og samling i MongoDB
I tilfælde hvor adressen bruges sammen med andre detaljer som f.eks elevnavn, bliver du nødt til at forespørge databasen flere gange. Ulempen ved dette er et højt antal læseoperationer og dermed lav forespørgselsydeevne.
Ved at bruge den indlejrede tilgang kan du indsætte adressedataene direkte i elevdokumentet og kun bruge en enkelt forespørgsel til at hente dataene.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresse": [{
"street": "Bagshot række",
"city": "Hobiton"
}],
};
For at hente adressen gennem elevnavn, brug denne forespørgsel.
db.student.findOne({"studentName":"Frodo Baggins"}, {"address":1})
En-til-mange forhold med indlejrede dokumenter i MongoDB
Overvej en situation, hvor en elev har flere adresser. Relationen mellem eleven og adresserne bliver én-til-mange.
Den indlejrede model giver dig mulighed for at tilføje flere adresser til elevdokumentet. Som i en-til-en-forholdet, der bruger indlejrede dokumenter, har denne tilgang en relativt høj forespørgselsydeevne.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresse": [
{
"street": "Bagshot række",
"city": "Hobiton"
},
{
"street": "Endnu en Bagshot-række",
"city": "Hobiton2"
},
]
};
Forespørgslen nedenfor vil returnere adresserne på det angivne elevnavn.
db.student.findOne({studentName: “Frodo Baggins”}, {adresse: 1})
Relaterede: Sådan opretter du dokumenter i MongoDB
Hvis du nu har flere adresser og bliver ved med at tilføje dem til adressefeltet, kan dokumentet ret hurtigt blive rodet. En løsning er at bruge dokumentreferencer.
MongoDB: En-til-mange forhold med dokumentreferencer
Du kan også modellere et en-til-mange forhold ved hjælp af referencetilgangen. I denne datamodel vil elev- og adressedata blive vedligeholdt i separate samlinger. For at relatere eleven til deres adresse skal du tilføje et felt, der indeholder adresse-id'erne til elevdokumentet.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adresse": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};
At få en elevs adresseoplysninger involverer at hente adresse-id'erne fra elevdokumentet og bruge disse id'er til at hente de faktiske adresser fra samlingen.
const student = db.users.findOne({"name":"Frodo Baggins"},{"address":1})
const addresses = db.address.find({"_id":{"$in":student["address_ids"]}})
Valg mellem indlejrede og referencemetoder
Både indlejrings- og referencemodellerne har deres fordele og ulemper, og du skal overveje et par ting, før du træffer et valg. For det første skal du overveje brugssagen. Hvis dataene kun vil være relateret til ét dokument, kan indlejring være din bedste mulighed.
For at oprette en-til-mange-relationer kan du bruge enten referencemodellen eller den indlejrede model. Referencer resulterer i et rent og konsistent dokument, da du kun tilføjer reference-id'et for det dokument, du vil relatere til.
Antallet af læseoperationer, der kræves for at hente de tilsluttede data, er dog relativt højt og kan påvirke ydeevnen. Indlejring af dokumentet kan øge ydeevnen, men med mange indlejrede dokumenter kan du ende med en overbelastet samling.
Det er derfor helt op til dig at vælge, hvordan du implementerer datarelationerne i dit dokument. Overvej, hvordan du vil bruge dokumentet, det forespørgselsydeniveau, du sigter efter, og de afvejninger, du er villig til at foretage.
Overvejer du en anden tilgang til databaser? Her er, hvordan datamodellering fungerer i MongoDB.
Læs Næste
- Programmering
- Programmering
- database
Mary Gathoni er en softwareudvikler med en passion for at skabe teknisk indhold, der ikke kun er informativt, men også engagerende. Når hun ikke koder eller skriver, nyder hun at hænge ud med venner og være udendørs.
Abonner på vores nyhedsbrev
Tilmeld dig vores nyhedsbrev for tekniske tips, anmeldelser, gratis e-bøger og eksklusive tilbud!
Klik her for at abonnere