Zatímco NoSQL obecně doporučuje denormalizaci datových modelů je nejlepší nemít neomezený seznam v jedné položce databáze. K modelování těchto dat v DynamoDB byste měli použít seznam sousedství pro modelování vztahu many-to-many . Neexistuje žádné nákladově efektivní způsob modelování dat, o kterém vím, aby vám umožnil získat všechna požadovaná data v jediném hovoru. Řekl jste však, že rychlost je nejdůležitější (aniž byste uváděli požadavek na latenci), takže se vám pokusím poskytnout představu, jak rychle můžete získat data, pokud jsou uložena v DynamoDB.
Vaše schémata by vypadala nějak takto:
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
}
Chcete-li označit, že herec hrál ve filmu, stačí provést jeden zápis (což je podle mých zkušeností při použití DynamoDB konzistentně jednociferné milisekundy), abyste do tabulky přidali položku ActedIn.
Chcete-li získat všechny filmy pro herce, museli byste se jednou zeptat, abyste získali všechny herce ve vztazích, a poté je hromadně přečíst, abyste získali všechny filmy. Typická latence pro dotaz (podle mých zkušeností) je pod 10 ms, v závislosti na rychlosti sítě a množství dat odesílaných přes síť. Vzhledem k tomu, že vztah ActedIn je tak malý objekt, myslím, že byste mohli očekávat průměrný případ 5 ms pro dotaz, pokud váš dotaz pochází z něčeho, co také běží v datovém centru AWS (EC2, Lambda atd.).
Získání jedné položky bude pod 5 ms a můžete to udělat paralelně. Existuje také API BatchGetItems, ale o tom pro vás nemám žádné statistiky.
Takže, stačí vám ~10 ms?
Pokud ne, můžete použít DAX , která do DynamoDB přidává vrstvu mezipaměti a slibuje latenci požadavku <1 ms.
Jaký je neudržitelný a nenákladový způsob, jak toho dosáhnout během jediného hovoru?
Pro každý vztah ActedIn uložte svá data takto:
ActedIn {
ActorId,
ActorName,
ActorAge,
ActorBio,
FilmId,
FilmTitle,
FilmDescription,
FilmReleaseDate
}
Chcete-li získat všechny podrobnosti o jeho filmu, stačí zadat jeden dotaz pro daného herce a pro získání všech podrobností o herci pro daný film pouze jeden dotaz. Ve skutečnosti to nedělejte. Duplicitní data znamenají, že pokaždé, když musíte aktualizovat podrobnosti o herci, musíte je aktualizovat pro každý film, ve kterém byli, a podobně pro podrobnosti o filmu. To bude provozní noční můra.
Nejsem přesvědčen; zdá se, že NoSQL je pro to hrozné.
Měli byste si pamatovat, že NoSQL je k dispozici v mnoha variantách (NoSQL =Not Only SQL), takže i když vám jedno řešení NoSQL nefunguje, neměli byste ho úplně vyloučit. Pokud to nezbytně potřebujete v jednom hovoru, měli byste zvážit použití databáze grafů (což je jiný typ databáze NoSQL).