sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb databas Schema Design med delad data

Din utmaning kommer från det faktum att Prop_Info måste hämtas av båda frågorna. Detta gör det svårt att lista ut vilken Mongo-samling den ska bo i.

I MongoDB skapar du ditt dokumentschema med det idealiska målet för ett enda dokument att ha all information du behöver med tanke på dina frågemönster. I det fall du behöver ha samma data D (som Prop_Info i ditt fall) returneras av två separata frågor mot två separata samlingar A och B , måste du välja mellan följande tre strategier:

  1. Duplicera D i dokumenten för båda A och B , och framtvinga överensstämmelse med din kod. Detta är vanligtvis designvalet för högpresterande system som vill eliminera behovet av en andra fråga även om det kommer till priset av ytterligare kodkomplexitet på infognings-/uppdateringssidan och med vissa potentiella konsistensproblem eftersom Mongo inte är ACID.

  2. Sätt D i A och lagra en referens (DBRef eller någon annan kombination av identifierande fält) i B så att du kan komma till det med en andra fråga. Detta är vanligtvis designvalet när antalet frågor till A överskrider antalet frågor till B . Den behåller D lokalt för den mer frekvent efterfrågade samlingen. I detta schemadesignmönster behöver du bara göra en andra fråga när du frågar B .

  3. Sätt D i en ny samling C och gör en andra fråga till den från både A och B . Detta är vanligtvis designvalet inför mycket osäkra framtida krav där det inte är klart vad avvägningarna skulle vara om du går med (1) eller (2) ovan. Det är det mest "relationella" schemat och det som kommer att tvinga dig att göra en andra fråga när du frågar både A och B .

Vilken strategi du väljer beror på din domän, frågemönster, det stöd du får från ditt ramverk för objektrelationell kartläggning (OM du använder en), och sist men inte minst, dina preferenser.

I de situationer jag har stött på har jag aldrig valt (3). Jag har använt (1) i högpresterande situationer (analyssystem). Jag har använt (2) överallt annars eftersom frågeåtkomstmönstren har gjort det uppenbart var den "delade" informationen ska bo.

När du väl har valt din strategi, om du fortfarande behöver hjälp, ställ en annan SO-fråga som specifikt fokuserar på schemadesignproblemet givet den valda strategin.

Tre sista tips:

  1. Om de delade data D har en relationsmångfald större än 1 använd en array. Du kan indexera hela arrayer och du kan fråga exakt inuti arrayer med code>$elemMatch .

  2. För att uppdatera D i strategi (1) eller (2) använd MongoDB:s atommodifierare operationer , av vilka många är designade för att fungera på arrayer.

  3. Denna SO-fråga täcker DBRef två frågemönster i @Stennies svar. (@Stennie arbetar för 10gen, markörerna för MongoDB.)

Lycka till!



  1. Chef Solo-fel:Kokboken hittades inte

  2. Är detta en giltig användning av ServiceStack Redis?

  3. mongodb - utför batchfråga

  4. NodeJS och MongoDB applikationsautentisering av JWT