sql >> Databáze >  >> NoSQL >> MongoDB

Jak zacházet s kruhovými dokumenty v MongoDB/DynamoDB?

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).




  1. Docker mongo obrázek 'Spojení odmítnuto' z jiného kontejneru

  2. Chování Redis s více souběžnými programy, které provádějí čtení/odstranění na stejném hash klíči

  3. Ukládání a načítání souboru v MongoDB pomocí Java &GridFs

  4. Hledání průsečíku mezi dvěma kolekcemi v MongoDb