DynamoDb-Tabelle Gestaltung: Einzelne Tabelle oder mehrere Tabellen
Ich bin ganz neu auf dem NoSQL-und DynamoDB und ich verwendet, um zu RDBMS. Ich bin der Gestaltung Datenbank für ein Spiel und wir sind mit DynamoDB und AWS Lambda für unsere backend. Ich erstellte eine Tabelle namens "Benutzer" für den Spieler-Profil enthält die Informationen für den Benutzer und Ressourcen. Weil das Spiel hat ein Inventar-system, die ich auch erstellt eine Tabelle namens "UserItems".
Es ist alles gut, bis ich gemerkt habe DynamoDB nicht Transaktion und jede operation, die ausgeführt wird, auf beiden Tabelle (z.B. mit einem Gegenstand, der Steigerung der Ressourcen) eine chance hat, Fehler an einem Tisch, während der Erfolg auf andere und bewirkt, dass Daten fehlen, die Auswirkungen auf unsere Kunden.
So, ich war vielleicht denken meine mehrere Tabellen-design ist nicht gut, da es eine Gewohnheit von mir zu entwerfen mehrere Tisch, wenn ich arbeiten bin mit RDBMS. Die lassen mir zu denken, da der gesamte "UserItems" als hash in "Benutzer" aber ich bin nicht sicher, dies ist eine gute Praxis, weil die Größe einer einzelnen Zeile in der Users-Tabelle wird sehr groß werden (vielleicht haben wir 500 einzigartige Gegenstände pro Benutzer) und jedes mal, wenn ich ziehen oder setzen von Daten von/zu "Benutzer" (die meisten der Zeit, müssen nicht "UserItems" Daten) die lese - /schreib-Durchsatz werden auch wirklich groß.
Was soll ich tun, halten Sie die mehrere Tabellen entwerfen und verarbeiten die Transaktion manuell oder wechseln Sie in den single-table-design? Oder gibt es vielleicht eine 3. option?
Aktualisiert: weitere Informationen über meine
Derzeit habe ich 2 Tabellen
- Benutzer: Benutzer-id (key), Benutzername, Gold
- UserItems: UserId (partition key) ItemId (sort key), Name, GoldValue
Szenarien:
- Benutzer einen Artikel kaufen: - Benutzer.Gold abgeleitet, neue UserItem werden hinzufügen UserItems Tabelle.
- Benutzer ein Element zu verkaufen: - Benutzer.Gold wird erhöht werden, wird der Artikel gelöscht UserItems Tabelle.
In beiden Szenarien oben, ich werde zu tun haben, 2 update-Vorgang für 2 Tabellen, die ohne Transaktion gibt es eine chance, einer von Ihnen ist fehlgeschlagen.
Lösen, dass ich in Erwägung ziehen, Einzel-Tisch-Lösung, die einem einzelnen Benutzer-Tabelle mit 4 Spalten, die Benutzer-id(key), Benutzername, Gold, UserItems. Allerdings gibt es zwei Dinge, die ich mache mir sorgen über:
- Daten in UserItems sein könnte, kommen zu groß für eine einzige Zelle, weil ein Nutzer bis zu 500 Artikel.
- Hinzufügen/löschen von Elementen ich habe das ziehen der UserItems von dynamodb, hinzufügen/löschen von item und setze es dann wieder in die Nutzer. Also muss ich tun, 1 Lesen und 1 schreiben Vorgang für 1 Aktion. Und wegen der Frage (1) Lesen/schreiben von Daten die Größe könnte wirklich groß.
InformationsquelleAutor Binh Luong | 2016-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
NoSql-Datenbank ist am besten geeignet für nicht-trasactional Daten. Wenn Sie bringen Normalisierung(aufteilen der Daten in mehrere Tabellen) in noSQL, dann schlagen Sie der ganze Zweck. Wenn Leistung das wichtigste, dann sollten Sie nur eine einzelne Tabelle für Ihren Anwendungsfall. DynamoDB unterstützt Range-Tasten und unterstützt ebenfalls die Sekundären Indizes. Für deinen Anwendungsfall wäre es besser, das Design Ihrer Tabelle zu verwenden, Bereich Schlüssel.
Wenn Sie freigeben können mehr details über Ihre aktuellen Tabelle, vielleicht kann ich helfen, Sie mit mehr Eingängen.
aws.amazon.com/blogs/developer/...
Leider bin ich mit NodeJs für Lambda-und es gibt keine Transaktion Bibliothek für JS noch.
InformationsquelleAutor letmesolve
FWIW, der AWS-Dokumentation auf NoSQL-Design für DynamoDB schlägt die Verwendung einer einzigen Tabelle:
Guter Punkt @MichaelBrown. Einfach die folgenden dieses tutorial und Sie scheinen, verwenden Sie eine Tabelle pro Einheit, ohne Diskriminierung. Macht es schwer zu entscheiden. Dies ist jedoch eine gute Einsicht von allen.
InformationsquelleAutor Eugene Yarmash