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

Er der nogen fordele ved at bruge et brugerdefineret _id til dokumenter i MongoDB?

Fordele ved at generere dit eget _id s:

  • Du kan gøre dem mere menneskevenlige ved at tildele stigende tal:1 , 2 , 3 , ...

  • Eller du kan gøre dem mere menneskevenlige ved at bruge tilfældige strenge:t3oSKd9q

    (Det optager ikke for meget plads på skærmen, kan udvælges fra en liste og kan potentielt kopieres manuelt, hvis det er nødvendigt. Du skal dog gøre den lang nok for at forhindre hemmelige aftaler.)

  • Hvis du bruger tilfældigt genererede strenge, vil de have en tilnærmelsesvis jævn sharding-fordeling, i modsætning til standard mongo ObjectIds, som har en tendens til at gruppere poster, der er oprettet omkring samme tid, på den samme shard. (Om det er nyttigt eller ej afhænger virkelig af din skæringsstrategi.)

  • Eller du kan have lyst til at generere dit eget tilpassede _id s, der vil gruppere relaterede objekter på ét shard, f.eks. efter ejer eller geografisk region eller en kombination. (Igen, om det er ønskeligt eller ej afhænger af, hvordan du har til hensigt at forespørge dataene, og/eller hvor hurtigt du producerer og lagrer dem. Du kan også gøre dette ved at angive en shard-nøgle i stedet for _id sig selv. Se diskussionen nedenfor.)

Fordele ved at bruge ObjectId s:

  • ObjectId'er er meget gode til at undgå kollisioner. Hvis du genererer dit eget _id s tilfældigt eller samtidigt, så skal du selv styre kollisionsrisikoen.

  • ObjectId'er indeholder deres oprettelsestid i dem. Det kan være en billig og nem måde at bevare et dokuments oprettelsesdato og at sortere dokumenter kronologisk. (På den anden side, hvis du ikke ønsker at afsløre/lække oprettelsesdatoen for et dokument, så må du ikke afsløre dets ObjectId!)

nanoid modul kan hjælpe dig med at generere korte tilfældige id'er. De leverer også en lommeregner som kan hjælpe dig med at vælge en god id-længde, afhængigt af hvor mange dokumenter/id'er du genererer hver time.

Alternativt skrev jeg mongoose-generate-unique-key for at generere meget korte tilfældige id'er (forudsat at du bruger mongoose-biblioteket).

Shardingstrategier

Jeg vil ikke hævde, at jeg er ekspert i, hvordan man bedst sønderdeler data, men her er nogle situationer, vi kan overveje:

  1. Et astronomisk observatorium eller partikelaccelerator håndterer gigabyte data i sekundet. Når en interessant begivenhed opdages, vil de måske gemme en enorm mængde data på kun få sekunder. I dette tilfælde vil de sandsynligvis have en jævn fordeling af dokumenter på tværs af skærverne, så hvert skær vil arbejde lige hårdt for at gemme dataene, og ingen skærver vil blive overvældet.

  2. Du har en enorm mængde data, og du skal nogle gange behandle det hele på en gang. I dette tilfælde (men afhængigt af algoritmen) kan en jævn fordeling igen være ønskelig, så alle shards kan arbejde lige hårdt på at behandle deres del af dataene, før de kombinerer resultaterne til sidst. (Selvom vi i dette scenarie muligvis kan stole på MongoDB's balancer, snarere end vores shard-nøgle, til den lige fordeling. Balanceren kører i baggrunden, efter at data er blevet gemt. Efter at have indsamlet en masse data, skal du muligvis lad det omfordele bidderne natten over.)

  3. Du har en app til sociale medier med en stor mængde data, men denne gang stiller mange forskellige brugere mange lette forespørgsler relateret hovedsageligt til deres egne data eller deres specifikke venner eller emner. I dette tilfælde giver det ikke mening at involvere hvert shard hver gang en bruger laver en lille forespørgsel. Det kan være fornuftigt at dele efter bruger-id (eller efter emne eller geografisk område), så alle dokumenter, der tilhører én bruger, bliver gemt på ét fragment, og når denne bruger laver en forespørgsel, er det kun ét shard der skal udføre arbejde. Dette skulle give de andre shards fri til at behandle forespørgsler for andre brugere, så mange brugere kan betjenes på én gang.

  4. Deling af dokumenter efter oprettelsestidspunkt (som standard ObjectIds vil give dig) kan være ønskeligt, hvis du har mange lette forespørgsler, der ser på data for lignende tidsperioder. For eksempel mange forskellige brugere, der forespørger på forskellige historiske diagrammer.

    Men det er måske ikke så ønskværdigt, hvis de fleste af dine brugere kun forespørger efter de seneste dokumenter (en almindelig situation på sociale medieplatforme), fordi det ville betyde, at et eller to skår ville få det meste af arbejdet. Fordeling efter emne eller måske efter region kan give en fladere overordnet fordeling, samtidig med at relaterede dokumenter kan klumpes sammen på et enkelt skår.

Du må gerne læse de officielle dokumenter om dette emne:



  1. MongoDB design - tags

  2. Data null efter lagring af enhed med Moongose ​​og GraphQL

  3. Mongoose unshift findAndUpdateById

  4. Hvordan gavner fluentd dette scenarie?