MongoDB är en dokumentdatabas och upprätthåller inte relationer mellan dokument som relationsdatabaser som PostgreSQL.
Ändå låter MongoDB dig skapa relationer mellan dokument. Dessa relationer kan antingen modelleras genom inbäddade eller refererade tillvägagångssätt. Låt oss ta en närmare titt.
Inbäddade relationer vs. Referensrelationer
I en inbäddad metod infogas ett dokument direkt i ett annat dokument, vilket resulterar i kapslade data. Processen kallas också "denormalisering".
Referensmetoden, å andra sidan, använder dokumentreferenser för att peka från ett dokument till ett annat. Detta tillvägagångssätt kallas också "normalisering".
MongoDB: En-till-en-relationer med inbäddade dokument
Du kan skapa en en-till-en-relation mellan dokument med den inbäddade metoden. Denna relation uppstår när ett dokumentobjekt endast kan relatera till ett annat dokument.
Överväg en studentdatabas. Denna databas innehåller student- och adresssamlingarna med följande dokument.
// Studentdokument
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
};
// Adressdokument
{
"studentName": "Frodo Baggins",
"street": "Bagshot Row",
"city": "Hobiton",
}
I denna databas får en student endast ha en adress. För att hämta adressen måste du fråga adresssamlingen med studentens namn.
Relaterad: Hur man skapar en databas och samling i MongoDB
I de fall adressen används tillsammans med andra uppgifter som t.ex elevs namnmåste du fråga databasen flera gånger. Nackdelen med detta är ett stort antal läsoperationer och följaktligen låg frågeprestanda.
Med den inbäddade metoden kan du infoga adressdata direkt i studentdokumentet och använda endast en enda fråga för att få informationen.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adress": [{
"street": "Bagshot Row",
"city": "Hobiton"
}],
};
För att hämta adressen via elevs namn, använd den här frågan.
db.student.findOne({"studentName":"Frodo Baggins"}, {"address":1})
En-till-många-relationer med inbäddade dokument i MongoDB
Tänk på en situation där en elev har flera adresser. Relationen mellan eleven och adresserna blir en-till-många.
Den inbäddade modellen låter dig lägga till flera adresser till studentdokumentet. Precis som i en-till-en-relationen med inbäddade dokument har detta tillvägagångssätt en relativt hög frågeprestanda.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adress": [
{
"street": "Bagshot Row",
"city": "Hobiton"
},
{
"street": "Ännu en Bagshot-rad",
"city": "Hobiton2"
},
]
};
Frågan nedan kommer att returnera adresserna till det angivna studentnamnet.
db.student.findOne({studentName: “Frodo Baggins”}, {adress: 1})
Relaterad: Hur man skapar dokument i MongoDB
Nu, om du har fler adresser och fortsätter att lägga till dem i adressfältet, kan dokumentet bli rörigt ganska snabbt. En lösning är att använda dokumentreferenser.
MongoDB: En-till-många relationer med dokumentreferenser
Du kan också modellera en en-till-många-relation med referensmetoden. I denna datamodell kommer student- och adressdata att bevaras i separata samlingar. För att relatera studenten till sin adress, lägg till ett fält som innehåller adress-ID: n till studentdokumentet.
{
"studentName": "Frodo Baggins",
"phoneNumber": "987654321",
"adress": [
ObjectId("61fa7bfeebdadf8ac71427ea"),
ObjectId("61fa7d19ebdadf8ac71427eb")
]
};
Att få adressuppgifterna för en student innebär att man hämtar adress-ID: n från studentdokumentet och använder dessa ID: n för att hämta de faktiska adresserna från samlingen.
const student = db.users.findOne({"name":"Frodo Baggins"},{"address":1})
const addresses = db.address.find({"_id":{"$in":student["address_ids"]}})
Att välja mellan inbäddade och referensmetoder
Både inbäddnings- och referensmodellerna har sina för- och nackdelar, och du måste överväga ett par saker innan du gör ett val. Till att börja med måste du överväga användningsfallet. Om data bara kommer att vara relaterade till ett dokument, kan inbäddning vara ditt bästa alternativ.
För att skapa en-till-många-relationer kan du använda antingen referensmodellen eller den inbäddade modellen. Referenser resulterar i ett rent och konsekvent dokument eftersom du bara lägger till referens-ID för det dokument du vill relatera till.
Däremot är antalet läsoperationer som krävs för att hämta anslutna data relativt högt och kan påverka prestandan. Att bädda in dokumentet kan öka prestandan, men med många kapslade dokument kan du få en överbelastad samling.
Att välja hur du ska implementera datarelationerna i ditt dokument är därför helt upp till dig. Tänk på hur du kommer att använda dokumentet, vilken frågeprestandanivå du siktar på och de avvägningar du är villig att göra.
Funderar du på ett annat förhållningssätt till databaser? Så här fungerar datamodellering i MongoDB.
Läs Nästa
- Programmering
- Programmering
- databas
Mary Gathoni är en mjukvaruutvecklare med en passion för att skapa tekniskt innehåll som inte bara är informativt utan också engagerar. När hon inte kodar eller skriver tycker hon om att umgås med vänner och att vara utomhus.
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera