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
Din de documenten van beideAenBen 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
DinAen sla een referentie (DBref of een andere combinatie van identificerende velden) op inBzodat u er met een tweede vraag kunt komen. Dit is meestal de ontwerpkeuze wanneer het aantal zoekopdrachten naarAoverschrijdt het aantal zoekopdrachten naarB. Het houdtDlocal naar de vaker opgevraagde collectie. In dit schemaontwerppatroon hoeft u alleen een tweede query te maken wanneer uB. opvraagt . -
Zet
Din een nieuwe verzamelingCen maak er een tweede vraag naar vanuit beideAenB. 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 beideAbevraagt. 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
Dheeft 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
Dbij 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!