sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb database Schema Design med delte data

Din udfordring kommer fra det faktum, at Prop_Info skal hentes af begge forespørgsler. Det gør det svært at finde ud af, hvilken Mongo-kollektion den skal bo i.

I MongoDB opretter du dit dokumentskema med det ideelle mål for et enkelt dokument at have al den information, du har brug for, givet dine forespørgselsmønstre. I det tilfælde, hvor du skal have de samme data D (såsom Prop_Info i dit tilfælde) returneret af to separate forespørgsler mod to separate samlinger A og B , skal du vælge mellem følgende tre strategier:

  1. Dublet D i dokumenterne til både A og B , og håndhæv overensstemmelse med din kode. Dette er typisk designvalget af højtydende systemer, der ønsker at eliminere behovet for en anden forespørgsel, selvom det kommer på bekostning af yderligere kodekompleksitet på indsætnings-/opdateringssiden og med nogle potentielle konsistensproblemer, da Mongo ikke er ACID.

  2. Indsæt D i A og gem en reference (DBRef eller en anden kombination af identificerende felter) i B så du kan komme til det med en anden forespørgsel. Dette er typisk designvalget, når antallet af forespørgsler til A overstiger antallet af forespørgsler til B . Den beholder D lokal til den hyppigst forespurgte samling. I dette skemadesignmønster behøver du kun at lave en anden forespørgsel, når du forespørger B .

  3. Indsæt D i en ny samling C og lav en anden forespørgsel til den fra både A og B . Dette er typisk designvalget i lyset af meget usikre fremtidige krav, hvor det ikke er klart, hvad afvejningen ville være, hvis du går med (1) eller (2) ovenfor. Det er det mest "relationelle" skema og det, der vil tvinge dig til at lave en anden forespørgsel, når du forespørger både A og B .

Hvilken strategi du vælger afhænger af dit domæne, forespørgselsmønstrene, den støtte du får fra din object-relational mapping (ORM) framework (hvis du bruger en), og sidst men ikke mindst din præference.

I de situationer, jeg har mødt, har jeg aldrig valgt (3). Jeg har brugt (1) i højtydende situationer (analysesystemer). Jeg har brugt (2) alle andre steder, siden forespørgselsadgangsmønstrene har gjort det indlysende, hvor de "delte" data skal bo.

Når du har valgt din strategi, og hvis du stadig har brug for hjælp, kan du stille endnu et SO-spørgsmål, der specifikt fokuserer på skemadesignproblemet givet den valgte strategi.

Tre sidste tips:

  1. Hvis de delte data D har en relationsmultiplicitet større end 1 brug en matrix. Du kan indeksere hele arrays, og du kan forespørge præcist inde i arrays ved hjælp af >$elemMatch .

  2. For at opdatere D i strategi (1) eller (2) brug MongoDB's atomare modifikator operationer , hvoraf mange er designet til at fungere på arrays.

  3. Dette SO-spørgsmål dækker DBRef to-forespørgselsmønsteret i @Stennies svar. (@Stennie arbejder for 10gen, markørerne for MongoDB.)

Held og lykke!



  1. Hierarkiske forespørgsler med Mongo ved hjælp af $graphLookup

  2. Redigere nøglenavnekonventioner?

  3. Sådan konfigureres MongoDb-samlingsnavn til en klasse i Spring Data

  4. Sådan indlejres det samme skema i mongoose js