2016-12-28 1 views
1

Ich bin ziemlich neu in NoSQL und DynamoDB und ich verwendete RDBMS. Ich entwerfe eine Datenbank für ein Spiel und wir verwenden DynamoDB und AWS Lambda für unser Backend. Ich habe den Tabellennamen "Benutzer" für das Spielerprofil erstellt, das die Benutzerinformationen und Ressourcen enthält. Da das Spiel Inventar System hat, habe ich auch einen Tabellennamen "UserItems" erstellt.DynamoDb Tischdesign: Einzelne Tabelle oder mehrere Tabellen

Es ist alles gut, bis ich erkannte DynamoDB haben keine Transaktion und jede Operation, die auf beiden Tabellen ausgeführt wird (zum Beispiel mit einem Element, das Ressource erhöhen) hat eine Chance auf einen Fehler auf einem Tisch, während Erfolg auf anderen und wird verursachen fehlende Daten, die unsere Kunden betreffen.

Also dachte ich, dass mein Design für mehrere Tabellen nicht gut ist, da es eine Angewohnheit ist, mehrere Tabellen zu entwerfen, wenn ich mit RDBMS arbeite. Das lässt mich darüber nachdenken, die gesamten "UserItems" als Hash in "Users" zu speichern, aber ich bin nicht sicher, ob das eine gute Übung ist, da die Größe einer einzelnen Zeile in der Users-Tabelle sehr groß ist (wir haben vielleicht 500 Unique Items) pro Benutzer) und jedes Mal, wenn ich Daten von/zu "Benutzern" abrufe oder ablege (die meiste Zeit benötige ich keine "UserItems" -Daten), ist der Lese/Schreib-Durchsatz ebenfalls sehr groß.

Was soll ich tun, halten Sie die mehrere Tabellen Design und Transaktion manuell behandeln oder wechseln zu Single-Table-Design? Oder vielleicht gibt es eine dritte Option?

Aktualisiert: Weitere Informationen über meine Use Case

Zur Zeit habe ich zwei Tabellen

  • Benutzer: Benutzer-ID (Schlüssel), Benutzername, Gold
  • UserItems: UserId (Partitionsschlüssel), ItemId (Sortierschlüssel), Name, Goldwert

Szenarien:

  1. Benutzer kaufen ein Element: Users.Gold wird abgeleitet, neues UserItem wird zur UserItems-Tabelle hinzugefügt.
  2. Benutzer verkaufen einen Artikel: Users.Gold wird erhöht, der Artikel wird aus der UserItems-Tabelle gelöscht.

In beiden Szenarien oben muss ich 2 Update-Operation für 2 Tabellen, die ohne Transaktion gibt es eine Chance, eine von ihnen fehlgeschlagen.

Um das zu lösen, betrachte ich die Verwendung einer einzelnen Tabelle Lösung, die eine einzelne Benutzer Tabelle mit 4 Spalten UserId (Schlüssel), Benutzername, Gold, UserItems ist. Es gibt jedoch zwei Dinge, über die ich mir Sorgen mache:

  1. Daten in UserItems könnten für eine einzelne Zelle zu groß werden, weil ein Benutzer bis zu 500 Elemente haben könnte.
  2. Um ein Element hinzuzufügen/zu löschen, muss ich die UserItems aus dynamodb ziehen, Element hinzufügen/löschen und dann wieder in Users einfügen. Also muss ich 1 Lese- und 1 Schreibvorgang für 1 Aktion machen. Und wegen des Problems (1) könnte die Lese/Schreib-Datengröße wirklich groß werden.

Antwort

0

Die NoSql-Datenbank eignet sich am besten für nicht übertragungsrelevante Daten. Wenn Sie die Normalisierung (Teilen Ihrer Daten in mehrere Tabellen) in noSQL bringen, dann schlagen Sie den ganzen Zweck davon. Wenn Leistung am wichtigsten ist, sollten Sie nur eine einzige Tabelle für Ihren Anwendungsfall in Betracht ziehen. DynamoDB unterstützt Bereichsschlüssel und unterstützt auch Sekundärindizes.Für Ihren Anwendungsfall wäre es besser, Ihre Tabelle so umzugestalten, dass sie Bereichsschlüssel verwendet. Wenn Sie mehr Details über Ihre aktuelle Tabelle teilen können, kann ich Ihnen vielleicht mit mehr Eingaben helfen.

+0

Danke für die Antwort. Es scheint Single Table ist die Lösung für meinen Anwendungsfall. Dennoch mache ich mir Gedanken über die Größe der Daten in einer einzelnen Zeile und den Lese-/Schreibprozess, wenn ich alles in einer einzigen Tabelle abspeichere. Ich habe meine Frage aktualisiert. Ich hoffe es hilft dir meine Situation zu verstehen. –

+0

https://aws.amazon.com/blogs/developer/performing-conditional-writes-using-the-amazon-dynamodb-transaction-library/ –

+0

Leider verwende ich NodeJs für Lambda und es gibt keine Transaktionsbibliothek für JS noch. –

Verwandte Themen