Uw uitdaging komt voort uit het feit dat Prop_Info
moet door beide query's worden opgehaald. Dit maakt het moeilijk om erachter te komen in welke Mongo-collectie het zou moeten leven.
In MongoDB maakt u uw documentschema met het ideale doel voor een enkel document om alle informatie te hebben die u nodig hebt voor uw vraagpatronen. In het geval dat u dezelfde gegevens nodig heeft D
(zoals Prop_Info
in uw geval) geretourneerd door twee afzonderlijke zoekopdrachten tegen twee afzonderlijke verzamelingen A
en B
, moet u kiezen tussen de volgende drie strategieën:
-
Dubbele
D
in de documenten van beideA
enB
en dwing consistentie met uw code af. Dit is typisch de ontwerpkeuze van krachtige systemen die de noodzaak van een tweede query willen elimineren, zelfs als dat ten koste gaat van extra codecomplexiteit aan de invoeg-/updatekant en met enkele potentiële consistentieproblemen omdat Mongo niet ACID is. -
Zet
D
inA
en sla een referentie (DBref of een andere combinatie van identificerende velden) op inB
zodat u er met een tweede vraag kunt komen. Dit is meestal de ontwerpkeuze wanneer het aantal zoekopdrachten naarA
overschrijdt het aantal zoekopdrachten naarB
. Het houdtD
local naar de vaker opgevraagde collectie. In dit schemaontwerppatroon hoeft u alleen een tweede query te maken wanneer uB
. opvraagt . -
Zet
D
in een nieuwe verzamelingC
en maak er een tweede vraag naar vanuit beideA
enB
. Dit is meestal de ontwerpkeuze in het licht van zeer onzekere toekomstige vereisten, waarbij het niet duidelijk is wat de afwegingen zouden zijn als u (1) of (2) hierboven kiest. Het is het meest "relationele" schema en het schema dat je dwingt een tweede zoekopdracht te maken wanneer je beideA
bevraagt. enB
.
Welke strategie u kiest, hangt af van uw domein, de querypatronen, de ondersteuning die u krijgt van uw object-relationele mapping (ORM) raamwerk (als u er een gebruikt) en last but not least, uw voorkeur.
In de situaties die ik ben tegengekomen, heb ik nooit gekozen (3). Ik heb (1) gebruikt in situaties met hoge prestaties (analysesystemen). Ik heb (2) overal elders gebruikt sinds de toegangspatronen voor zoekopdrachten duidelijk hebben gemaakt waar de "gedeelde" gegevens zouden moeten leven.
Als je eenmaal je strategie hebt gekozen en nog steeds hulp nodig hebt, plaats dan nog een SO-vraag die specifiek is gericht op het schemaontwerpprobleem gezien de gekozen strategie.
Drie laatste tips:
-
Als de gedeelde gegevens
D
heeft een relatieveelvoud groter dan 1 gebruik een array. U kunt hele arrays indexeren en u kunt precies binnen arrays query's uitvoeren met$elemMatch
. -
Om
D
bij te werken in strategie (1) of (2) gebruik MongoDB's atomic modifier operaties , waarvan er vele zijn ontworpen om op arrays te werken. -
Deze SO-vraag behandelt het DBref-querypatroon met twee vragen in het antwoord van @Stennie. (@Stennie werkt voor 10gen, de markers van MongoDB.)
Veel geluk!