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

Hvordan håndterer man cirkulære dokumenter i MongoDB/DynamoDB?

Mens NoSQL generelt anbefaler denormalisering af datamodeller, er det bedst ikke at have en ubegrænset liste i en enkelt databasepost. For at modellere disse data i DynamoDB skal du bruge en tillægsliste til modellering af mange-til-mange-forholdet . Der er ingen omkostningseffektiv måde at modellere de data på, som jeg kender til, så du kan få alle de data du ønsker i et enkelt opkald. Du har dog sagt, at hastigheden er vigtigst (uden at give et latenskrav), så jeg vil forsøge at give dig en idé om, hvor hurtigt du kan få dataene, hvis de er gemt i DynamoDB.

Dine skemaer ville blive noget som dette:

Actor {
    ActorId, <-- This is the application/database id, not the actor's actual ID
    Name,
    Age,
    Bio
}

Film {
    FilmId, <-- This is the application/database id for the film
    Title,
    Description,
    ReleaseDate
}

ActedIn {
    ActorId,
    FilmId
}

For at indikere, at en skuespiller medvirkede i en film, behøver du kun at udføre én skrivning (som konsekvent er etcifrede millisekunder ved brug af DynamoDB efter min erfaring) for at tilføje et ActedIn-element til din tabel.

For at få alle filmene til en skuespiller, skal du forespørge én gang for at få alle de optrådte i forhold, og derefter læse en batch for at få alle filmene. Typiske latenser for en forespørgsel (efter min erfaring) er under 10ms, afhængigt af netværkshastighederne og mængden af ​​data, der sendes over netværket. Da ActedIn-forholdet er så lille et objekt, tror jeg, du kan forvente et gennemsnitligt tilfælde på 5ms for en forespørgsel, hvis din forespørgsel stammer fra noget, der også kører i et AWS-datacenter (EC2, Lambda osv.).

At få et enkelt element vil være under 5 ms, og du kan gøre det parallelt. Der er også en BatchGetItems API, men jeg har ingen statistik til dig om det.

Så er ~10ms hurtigt nok for dig?

Hvis ikke, kan du bruge DAX , som tilføjer et cachinglag til DynamoDB og lover anmodningsforsinkelse på <1ms.

Hvad er den uvedligeholdelige, ikke-omkostningseffektive måde at gøre dette på i et enkelt opkald?

For hvert ActedIn-forhold skal du gemme dine data på denne måde:

ActedIn {
    ActorId,
    ActorName,
    ActorAge,
    ActorBio,
    FilmId,
    FilmTitle,
    FilmDescription,
    FilmReleaseDate
}

Du behøver kun at lave én forespørgsel for en given skuespiller for at få alle deres filmdetaljer, og kun én forespørgsel for at få alle skuespillerdetaljerne for en given film. Gør faktisk ikke dette. De duplikerede data betyder, at hver gang du skal opdatere detaljerne for en skuespiller, skal du opdatere dem for hver film, de var med i, og tilsvarende for filmdetaljer. Dette vil være et operationelt mareridt.

Jeg er ikke overbevist; det ser ud til, at NoSQL er forfærdeligt til dette.

Du skal huske, at NoSQL findes i mange varianter (NoSQL =Not Only SQL), og så selvom en NoSQL-løsning ikke virker for dig, bør du ikke udelukke det helt. Hvis du absolut har brug for dette i et enkelt opkald, bør du overveje at bruge en Graph-database (som er en anden type NoSQL-database).




  1. $først i mongodb

  2. Hvordan udskriver man mere end 20 elementer (dokumenter) i MongoDBs shell?

  3. Tilføj valgfri forespørgselsparameter ved hjælp af spring data mongodb repository

  4. Hvordan sikrer man en unik vare i et array baseret på specifikke felter - mongoDB?