MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie gehe ich mit Umlaufdokumenten in MongoDB/DynamoDB um?

Während NoSQL im Allgemeinen Denormalisierung empfiehlt von Datenmodellen ist es am besten, keine unbegrenzte Liste in einem einzigen Datenbankeintrag zu haben. Um diese Daten in DynamoDB zu modellieren, sollten Sie einen verwenden Adjazenzliste zur Modellierung der Viele-zu-Viele-Beziehung . kostengünstig gibt es nicht Methode zur Modellierung der Daten, die ich kenne, um Ihnen zu ermöglichen, alle gewünschten Daten in einem einzigen Anruf zu erhalten. Sie haben jedoch gesagt, dass Geschwindigkeit am wichtigsten ist (ohne eine Latenzanforderung anzugeben), daher werde ich versuchen, Ihnen eine Vorstellung davon zu geben, wie schnell Sie die Daten abrufen können, wenn sie in DynamoDB gespeichert sind.

Ihre Schemas würden in etwa so aussehen:

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
}

Um anzuzeigen, dass ein Schauspieler in einem Film mitgespielt hat, müssen Sie nur einen Schreibvorgang ausführen (der meiner Erfahrung nach mit DynamoDB durchgehend einstellige Millisekunden beträgt), um Ihrer Tabelle ein ActedIn-Element hinzuzufügen.

Um alle Filme für einen Schauspieler zu erhalten, müssten Sie einmal abfragen, um alle Darsteller in Beziehungen zu erhalten, und dann einen Stapel lesen, um alle Filme zu erhalten. Typische Latenzen für eine Abfrage (meiner Erfahrung nach) liegen unter 10 ms, abhängig von der Netzwerkgeschwindigkeit und der Datenmenge, die über das Netzwerk gesendet wird. Da es sich bei der ActedIn-Beziehung um ein so kleines Objekt handelt, können Sie meiner Meinung nach mit einem durchschnittlichen Fall von 5 ms für eine Abfrage rechnen, wenn Ihre Abfrage von etwas stammt, das auch in einem AWS-Rechenzentrum (EC2, Lambda usw.) ausgeführt wird.

Das Abrufen eines einzelnen Elements dauert weniger als 5 ms, und Sie können dies parallel tun. Es gibt auch eine BatchGetItems-API, aber dazu habe ich keine Statistiken für Sie.

Sind ~10 ms schnell genug für Sie?

Wenn nicht, können Sie DAX verwenden , das DynamoDB eine Caching-Schicht hinzufügt und eine Anfragelatenz von <1ms.

verspricht

Was ist der nicht wartbare, nicht kosteneffiziente Weg, dies in einem einzigen Anruf zu tun?

Speichern Sie Ihre Daten für jede ActedIn-Beziehung wie folgt:

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

Sie müssen nur eine Abfrage für einen bestimmten Schauspieler durchführen, um alle Filmdetails zu erhalten, und nur eine Abfrage, um alle Schauspielerdetails für einen bestimmten Film zu erhalten. Tun Sie das nicht wirklich. Die duplizierten Daten bedeuten, dass Sie jedes Mal, wenn Sie die Details für einen Schauspieler aktualisieren müssen, sie für jeden Film aktualisieren müssen, in dem sie waren, und ähnlich für Filmdetails. Das wird ein operativer Alptraum.

Ich bin nicht überzeugt; es scheint, als wäre NoSQL dafür schrecklich.

Sie sollten bedenken, dass es NoSQL in vielen Varianten gibt (NoSQL =Not Only SQL), und selbst wenn eine NoSQL-Lösung für Sie nicht funktioniert, sollten Sie sie nicht vollständig ausschließen. Wenn Sie dies unbedingt in einem einzigen Aufruf benötigen, sollten Sie die Verwendung einer Graph-Datenbank in Erwägung ziehen (das ist eine andere Art von NoSQL-Datenbank).