Medan NoSQL generellt rekommenderar denormalisering av datamodeller är det bäst att inte ha en obegränsad lista i en enda databaspost. För att modellera denna data i DynamoDB bör du använda en angränsande lista för modellering av många-till-många-relationen . Det finns ingen kostnadseffektiv sätt att modellera data, som jag känner till, så att du kan få all data du vill ha i ett enda samtal. Du har dock sagt att hastigheten är viktigast (utan att ge ett latenskrav), så jag ska försöka ge dig en uppfattning om hur snabbt du kan få data om den lagras i DynamoDB.
Dina scheman skulle bli ungefär så här:
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
}
För att indikera att en skådespelare medverkade i en film behöver du bara göra en skrivning (vilket är konsekvent ensiffriga millisekunder med DynamoDB enligt min erfarenhet) för att lägga till ett ActedIn-objekt till ditt bord.
För att få alla filmer för en skådespelare, skulle du behöva fråga en gång för att få alla skådespelare i relationer, och sedan läsa en grupp för att få alla filmer. Typiska latenser för en fråga (enligt min erfarenhet) är under 10 ms, beroende på nätverkshastigheterna och mängden data som skickas över nätverket. Eftersom ActedIn-relationen är ett så litet objekt tror jag att du kan förvänta dig ett genomsnittligt fall på 5ms för en fråga, om din fråga kommer från något som också körs i ett AWS-datacenter (EC2, Lambda, etc).
Att få ett enstaka föremål kommer att vara under 5 ms, och du kan göra det parallellt. Det finns också ett BatchGetItems API, men jag har ingen statistik för dig om det.
Så, är ~10ms tillräckligt snabbt för dig?
Om inte kan du använda DAX , som lägger till ett cachinglager till DynamoDB och lovar fördröjningsfördröjning på <1ms.
Vad är det ohållbara, inte kostnadseffektiva sättet att göra detta i ett enda samtal?
För varje ActedIn-förhållande, lagra dina data så här:
ActedIn {
ActorId,
ActorName,
ActorAge,
ActorBio,
FilmId,
FilmTitle,
FilmDescription,
FilmReleaseDate
}
Du behöver bara göra en fråga för en given skådespelare för att få alla deras filmdetaljer, och bara en fråga för att få alla skådespelaredetaljer för en given film. Gör faktiskt inte det här. Duplicerade data innebär att varje gång du måste uppdatera detaljerna för en skådespelare, måste du uppdatera den för varje film de var med i, och på samma sätt för filmdetaljer. Det här kommer att bli en operationell mardröm.
Jag är inte övertygad; det verkar som att NoSQL är hemskt för detta.
Du bör komma ihåg att NoSQL finns i många varianter (NoSQL =Not Only SQL), så även om en NoSQL-lösning inte fungerar för dig, bör du inte utesluta det helt. Om du absolut behöver detta i ett enda samtal bör du överväga att använda en Graph-databas (vilket är en annan typ av NoSQL-databas).