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

MongoDB - børn og forældrestruktur

Du skal overveje, hvilken type forespørgsler du skal udføre, og hvor ofte hver type vil være nødvendig. Da jeg arbejdede på noget lignende, fandt jeg på seks mulige handlinger:

  • Gør noget med forælderen
  • Gør noget med børnene
  • Gør noget med forfædrene (forældre til forældre, forældre til forældre til forældre osv.)
  • Gør noget med efterkommerne (børn af børn, børn af børn af børn osv.)
  • Skift relationer (tilføj/flyt/slet noder i hierarkiet)
  • Skift hoveddataene i den aktuelle node (f.eks. ændring af værdien i "title"-feltet)

Du vil gerne vurdere, hvor vigtig hver af disse er for din ansøgning.

Hvis det meste af dit arbejde involverer at arbejde med lagrede data for en given artikel, inklusive dens nærmeste forælder og børn, er den første idé er mest nyttig. I MongoDB er det faktisk ret almindeligt at placere alle de oplysninger, du har brug for, i det samme dokument i stedet for at referere det eksternt, så du kun behøver at hente én ting og bare arbejde med disse data. De sidste fire handlinger på listen er dog mere vanskelige.

Især skal du krydse træet for at hente forfædre og efterkommere i dette tilfælde, bevæge dig gennem mellemliggende dokumenter og følge en sti, selvom du måske kun bekymrer dig om det sidste dokument på stien. Dette kan være langsomt for lange hierarkier. Ændring af relationer kan kræve at flytte en masse information rundt i flere dokumenter på grund af alle de data, der er til stede i hvert enkelt dokument. Men selv at ændre et enkelt felt som "title" kan være irriterende, fordi du skal overveje, at dette felt findes i flere forskellige dokumenter, enten som et hovedfelt eller under forældre- eller børnefelterne.

Dybest set din første idé fungerer bedst i mere statiske applikationer hvor du ikke vil ændre meget på dataene efter at have oprettet dem, men hvor du skal læse dem regelmæssigt.

MongoDB-dokumentationen har fem anbefalede tilgange til håndtering af trælignende (hierarkiske) strukturer. De har alle forskellige fordele og ulemper, selvom de alle gør det nemt at opdatere hoveddataene i en artikel ved kun at skulle gøre det i ét dokument.

  • Forældrereferencer :hver node indeholder en reference til sin overordnede.
  • Fordele :
    • Hurtigt forældreopslag (opslag efter "_id" =din dokumenttitel, returner "forælder"-feltet)
    • Hurtigt børneopslag (opslag efter "forælder" =din dokumenttitel, som returnerer alle underordnede dokumenter)
    • Opdatering af relationer er blot et spørgsmål om at ændre feltet "forælder"
    • Ændring af de underliggende data kræver kun ændringer af ét dokument
  • Ulempe :
    • Søgning efter forfædre og efterkommere er langsom og kræver en gennemgang
  • Børnehenvisninger :hver node indeholder en referencematrix til dens børn
    • Fordele :
      • Hurtig hentning af børn (returner børnearrayet)
      • Hurtig opdatering af forholdet (bare opdater børns array, hvor det er nødvendigt)
    • Ulempe :
      • For at finde en forælder skal du slå dit _id op i alle underordnede arrays af alle dokumenter, indtil du finder det (da forælderen vil indeholde den aktuelle node som et barn)
      • Søgning efter forfædre og efterkommere kræver gennemgange af træet
  • Række af forfædre :hver node indeholder en reference til en række af dens forfædre og dens forælder
    • Fordele :
      • Hurtig hentning af forfædre (ingen gennemgang kræves for at finde en bestemt)
      • Nem at søge efter forældre og børn ved at følge "Forældrereferencer"-tilgangen
      • For at finde efterkommere skal du bare slå forfædrene op, for alle efterkommere skal indeholde de samme forfædre
    • Ulempe :
      • Du skal bekymre dig om at holde rækken af ​​forfædre såvel som det overordnede felt opdateret, når der er en ændring i relationer, ofte på tværs af flere dokumenter.
  • Materialiserede stier :hver node indeholder en sti til sig selv - kræver regex
    • Fordele :
      • Nemt at finde børn og efterkommere ved hjælp af regulært udtryk
      • Kan bruge en sti til at hente forældre og forfædre
      • Fleksibilitet, såsom at finde noder efter delvise stier
    • Ulempe :
      • Relationsændringer er vanskelige, da de kan kræve ændringer af stier på tværs af flere dokumenter
  • Indlejrede sæt :Hver node indeholder et "venstre" og "højre" felt for at hjælpe med at finde undertræer
    • Fordele :
      • Nemt at hente efterkommere på en optimal måde ved at søge mellem "venstre" og "højre"
      • Ligesom "Forældrereference"-tilgangen er det nemt at finde forældre og børn
    • Ulempe :
      • Behov for at krydse struktur for at finde forfædre
      • Relationsændringer klarer sig dårligst her end nogen anden mulighed, fordi hvert enkelt dokument i træet muligvis skal ændres for at sikre, at "venstre" og "højre" stadig giver mening, når noget ændrer sig i hierarkiet

De fem tilgange diskuteres mere detaljeret i MongoDB-dokumentationen .

Din anden idé kombinerer tilgangene "Forældrereferencer" og "Børnehenvisninger" diskuteret ovenfor. Denne tilgang gør det nemt at finde både børnene og forældrene og gør det nemt at opdatere relationer og hoveddataene i en artikel (selvom du skal opdatere både forældre- og børnefelterne), men du skal stadig gennemgå det at finde forfædre og efterkommere.

Hvis du er interesseret i at finde forfædre og efterkommere (og bekymrer dig om dette mere end at være i stand til nemt at opdatere relationer), kan du overveje at tilføje en forfædre-array til din anden idé for at gøre det også nemt at forespørge efter forfædre og efterkommere. Selvfølgelig bliver det en reel smerte at opdatere forhold, hvis du gør dette.

Konklusion:

  • I sidste ende afhænger det hele af, hvilke handlinger der er mest nødvendige. Da du arbejder med artikler, hvis underliggende data (som titlen) ofte kan ændre sig, vil du måske undgå den første idé, da du ikke kun skal opdatere hoveddokumentet for den pågældende artikel, men alle underordnede dokumenter samt forælder.

  • Din anden idé gør det nemt at hente den nærmeste forælder og børn. At opdatere relationer er heller ikke for svært (det er bestemt bedre end nogle af de andre tilgængelige muligheder).

  • Hvis du virkelig vil gøre det nemt at finde forfædre og efterkommere på bekostning af at opdatere relationer lige så nemt, skal du vælge at inkludere en række forfædrereferencer.

  • Prøv generelt at minimere antallet af krævede gennemløb, da de kræver at køre en form for iteration eller rekursion for at komme til de data, du ønsker. Hvis du værdsætter evnen til at opdatere relationer, bør du også vælge en mulighed, der ændrer færre noder i træet (forældrereferencer, underordnede referencer og din anden idé kan gøre dette).



  1. bruger streng til mongodb _id

  2. Lagring af en PDF-fil i DB med Flask-admin

  3. Hvordan får man data fra MongoDB til simpelt array ved hjælp af Node.JS og Mongoose?

  4. Hvad er den bedste praksis at forbinde/afbryde forbindelsen til en database?