U kunt een schema ontwerpen waarin u naar documenten kunt verwijzen of deze kunt insluiten. Laten we eens kijken naar de eerste optie van ingesloten documenten. Met uw bovenstaande toepassing kunt u de informatie als volgt in een document opslaan:
// db.table1 schema
{
"_id": 3, // table1_id
"is_active": true,
"created": ISODate("2015-04-07T16:00:30.798Z"),
"lang": [
{
"name": "foo",
"surname": "bar",
"address": "xxx"
},
{
"name": "abc",
"surname": "def",
"address": "xyz"
}
]
}
In het bovenstaande voorbeeldschema zou u in wezen de table1_lang
. hebben ingesloten informatie in de hoofd table1
document. Dit ontwerp heeft zijn voordelen, waaronder datalokaliteit. Aangezien MongoDB gegevens aaneengesloten op schijf opslaat, zorgt het plaatsen van alle gegevens die u nodig hebt in één document ervoor dat de draaiende schijven minder tijd nodig hebben om naar een bepaalde locatie op de schijf te zoeken. Als uw toepassing vaak table1
gebruikt informatie samen met de table1_lang
gegevens, dan wilt u vrijwel zeker de ingebedde route gaan. Het andere voordeel van ingesloten documenten is de atomiciteit en isolatie bij het schrijven van gegevens. Om dit te illustreren, stel dat u een document wilt verwijderen met een langtoets "name" met waarde "foo", dit kan met één enkele (atomaire) bewerking:
db.table.remove({"lang.name": "foo"});
Lees voor meer informatie over gegevensmodellering in MongoDB de documenten Inleiding Gegevensmodellering , in het bijzonder Model Een-op-veel-relaties met ingesloten documenten
De andere ontwerpoptie verwijst naar documenten waarin u een genormaliseerd schema volgt. Bijvoorbeeld:
// db.table1 schema
{
"_id": 3
"is_active": true
"created": ISODate("2015-04-07T16:00:30.798Z")
}
// db.table1_lang schema
/*
1
*/
{
"_id": 1,
"table1_id": 3,
"name": "foo",
"surname": "bar",
"address": "xxx"
}
/*
2
*/
{
"_id": 2,
"table1_id": 3,
"name": "abc",
"surname": "def",
"address": "xyz"
}
De bovenstaande aanpak geeft meer flexibiliteit bij het uitvoeren van query's. Om bijvoorbeeld alle onderliggende table1_lang
. op te halen documenten voor de hoofdmoederentiteit table1
met id 3 zal eenvoudig zijn, maak gewoon een query tegen de verzameling table1_lang
:
db.table1_lang.find({"table1_id": 3});
Het bovenstaande genormaliseerde schema met behulp van documentreferentiebenadering heeft ook een voordeel wanneer u een-op-veel-relaties hebt met een zeer onvoorspelbare ariteit. Als je honderden of duizenden table_lang
. hebt documenten per give table
entiteit, heeft inbedding zoveel tegenslagen wat betreft ruimtelijke beperkingen, want hoe groter het document, hoe meer RAM het gebruikt en MongoDB-documenten hebben een harde limiet van 16 MB.
De algemene vuistregel is dat als het querypatroon van uw toepassing bekend is en gegevens meestal maar op één manier worden benaderd, een ingebedde aanpak goed werkt. Als uw toepassing op veel manieren gegevens opvraagt of u niet kunt anticiperen op de gegevensquerypatronen, is een meer genormaliseerd documentverwijzingsmodel geschikt voor dergelijke gevallen.
Ref: