sql >> Database >  >> NoSQL >> MongoDB

Mongodb-database Schema Design met gedeelde gegevens

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:

  1. Dubbele D in de documenten van beide A en B 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.

  2. Zet D in A en sla een referentie (DBref of een andere combinatie van identificerende velden) op in B zodat u er met een tweede vraag kunt komen. Dit is meestal de ontwerpkeuze wanneer het aantal zoekopdrachten naar A overschrijdt het aantal zoekopdrachten naar B . Het houdt D local naar de vaker opgevraagde collectie. In dit schemaontwerppatroon hoeft u alleen een tweede query te maken wanneer u B . opvraagt .

  3. Zet D in een nieuwe verzameling C en maak er een tweede vraag naar vanuit beide A en B . 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 beide A bevraagt. en B .

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:

  1. 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 .

  2. 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.

  3. 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!



  1. Reguliere expressie Spring data mongodb repositories

  2. Hoe gebruik ik GraphQL met Mongoose en MongoDB zonder Mongoose-modellen te maken?

  3. Verward over Mongoose / Mongo-terminologie. Zijn subdocumenten/ingesloten documenten ook verzamelingen?

  4. Extra velden voor paspoort-lokale-mangoest-accountregistratie?