sql >> Database >  >> NoSQL >> MongoDB

Hoe om te gaan met circulaire documenten in MongoDB/DynamoDB?

Hoewel NoSQL over het algemeen denormalisatie aanbeveelt van datamodellen, is het het beste om geen onbegrensde lijst in een enkele database-ingang te hebben. Om deze gegevens in DynamoDB te modelleren, moet u een gebruiken aangrenzendheidslijst voor het modelleren van de veel-op-veel-relatie . Er is geen kosteneffectieve manier om de gegevens te modelleren, die ik ken, zodat u alle gewenste gegevens in één gesprek kunt krijgen. U hebt echter gezegd dat snelheid het belangrijkst is (zonder een latentievereiste te geven), dus ik zal proberen u een idee te geven van hoe snel u de gegevens kunt krijgen als ze in DynamoDB zijn opgeslagen.

Je schema's zouden er ongeveer zo uit zien:

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
}

Om aan te geven dat een acteur in een film heeft gespeeld, hoeft u slechts één keer schrijven uit te voeren (wat in mijn ervaring consequent eencijferige milliseconden is met DynamoDB) om een ​​ActedIn-item aan uw tabel toe te voegen.

Om alle films voor een acteur te krijgen, moet je één keer vragen om alle gespeelde relaties in relaties te krijgen, en dan een batch lezen om alle films te krijgen. Typische latenties voor een zoekopdracht (naar mijn ervaring) zijn minder dan 10 ms, afhankelijk van de netwerksnelheden en de hoeveelheid gegevens die via het netwerk worden verzonden. Aangezien de ActedIn-relatie zo'n klein object is, denk ik dat je voor een query gemiddeld 5 ms kunt verwachten, als je query afkomstig is van iets dat ook in een AWS-datacenter (EC2, Lambda, enz.) draait.

Het krijgen van een enkel item kost minder dan 5 ms, en u kunt dat parallel doen. Er is ook een BatchGetItems API, maar daarover heb ik geen statistieken voor je.

Dus, is ~10ms snel genoeg voor jou?

Zo niet, dan kunt u DAX gebruiken , die een caching-laag toevoegt aan DynamoDB en een verzoeklatentie van <1ms belooft.

Wat is de onhoudbare, niet-kosteneffectieve manier om dit in één gesprek te doen?

Sla uw gegevens voor elke ActedIn-relatie als volgt op:

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

U hoeft slechts één zoekopdracht te doen voor een bepaalde acteur om al hun filmdetails te krijgen, en slechts één zoekopdracht om alle acteursdetails voor een bepaalde film te krijgen. Doe dit niet. De dubbele gegevens betekenen dat elke keer dat u de details voor een acteur moet bijwerken, u deze moet bijwerken voor elke film waarin ze zich bevonden, en op dezelfde manier voor filmdetails. Dit wordt een operationele nachtmerrie.

Ik ben niet overtuigd; het lijkt erop dat NoSQL hier verschrikkelijk voor is.

U moet onthouden dat NoSQL in vele varianten voorkomt (NoSQL =Not Only SQL), en dus zelfs als één NoSQL-oplossing niet voor u werkt, moet u het niet helemaal uitsluiten. Als je dit absoluut nodig hebt in een enkele oproep, kun je overwegen een Graph_database te gebruiken (wat een ander type NoSQL-database is).




  1. OF zoekvraag die overeenkomt met nul of met Mongoid nog steeds overeenkomt?

  2. Spark HBase-connector – een jaaroverzicht

  3. Over MongoDB, waarom gebruiken we het? MongoDB's terminologie en implementatie

  4. mangoestmodel, array van strings, array van objectenstructuur