Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Schemadesign für Gaming-Profile in DynamoDB
Geschäftlicher Anwendungsfall für Gaming-Profile
In diesem Anwendungsfall geht es um die Verwendung von DynamoDB zum Speichern von Spielerprofilen für ein Gaming-System. Bevor Benutzer (in diesem Fall Spieler) mit vielen modernen Spielen, insbesondere Online-Spielen, interagieren können, müssen sie Profile erstellen. Gaming-Profile beinhalten in der Regel Folgendes:
-
Grundlegende Informationen wie beispielsweise den Benutzernamen
-
Spieledaten wie beispielsweise Gegenstände und Ausrüstung
-
Spieledatensätze wie beispielsweise Aufgaben und Aktivitäten
-
Soziale Informationen wie beispielsweise Freundeslisten
Um die differenzierten Anforderungen für den Zugriff auf Datenabfragen für diese Anwendung zu erfüllen, verwenden die Primärschlüssel (Partitionsschlüssel und Sortierschlüssel) generische Namen (PK und SK), sodass sie mit verschiedenen Arten von Werten überlastet werden können, wie wir weiter unten sehen werden.
Die Zugriffsmuster für dieses Schemadesign sind folgende:
-
Abrufen der Freundesliste eines Benutzers
-
Abrufen aller Informationen eines Spielers
-
Abrufen der Gegenstandsliste eines Benutzers
-
Abrufen eines spezifischen Gegenstands aus der Gegenstandsliste des Benutzers
-
Aktualisieren des Charakters eines Benutzers
-
Aktualisieren der Anzahl an Gegenständen für einen Benutzer
Die Größe des Gaming-Profils variiert je nach Spiel. Wenn Sie große Attributwerte komprimieren, liegen sie möglicherweise innerhalb der Elementeinschränkungen in DynamoDB, sodass Ihre Kosten reduziert werden. Die Strategie für die Durchsatzverwaltung würde von verschiedenen Faktoren abhängen, z. B. der Anzahl der Spieler, der Anzahl der pro Sekunde gespielten Spiele und der Saisonalität des Workloads. In der Regel sind bei einem neu gestarteten Spiel die Anzahl der Spieler und der Beliebtheitsgrad nicht bekannt, daher beginnen wir mit dem On-Demand-Durchsatzmodus.
Diagramm der Entitätsbeziehungen in Gaming-Profilen
Dies ist das Entitätsbeziehungsdiagramm (ERD), das wir für das Design des Spieleprofilschemas verwenden werden.
Zugriffsmuster für Gaming-Profile
Dies sind die Zugriffsmuster, die wir für das Schemadesign für soziale Netzwerke berücksichtigen werden.
-
getPlayerFriends
-
getPlayerAllProfile
-
getPlayerAllItems
-
getPlayerSpecificItem
-
updateCharacterAttributes
-
updateItemCount
Entwicklung des Schemas für Gaming-Profile
Aus den obigen Ausführungen können wir ersehenERD, dass es sich um eine Art von Datenmodellierung mit one-to-many Beziehungen handelt. In DynamoDB können one-to-many Datenmodelle in Elementsammlungen organisiert werden, was sich von herkömmlichen relationalen Datenbanken unterscheidet, bei denen mehrere Tabellen erstellt und über Fremdschlüssel verknüpft werden. Eine Elementauflistung ist eine Gruppe von Elementen, die den gleichen Partitionsschlüsselwert, aber unterschiedliche Sortierschlüsselwerte aufweisen. Innerhalb einer Elementauflistung hat jedes Element einen eindeutigen Sortierschlüsselwert, der es von anderen Elementen unterscheidet. Vor diesem Hintergrund verwenden wir das folgende Muster für HASH
- und RANGE
-Werte für jeden Entitätstyp.
Zu Beginn verwenden wir generische Namen wie PK
und SK
, um verschiedene Arten von Entitäten in derselben Tabelle zu speichern und das Modell zukunftssicher zu machen. Zur besseren Lesbarkeit können wir Präfixe zur Angabe des Datentyps oder ein beliebiges Attribut mit der Bezeichnung Entity_type
oder Type
hinzufügen. Im aktuellen Beispiel verwenden wir eine Zeichenfolge, die mit player
beginnt, um player_ID
als PK
zu speichern. Wir verwenden entity name#
als Präfix von SK
und fügen das Attribut Type
hinzu, um anzugeben, um welchen Entitätstyp es sich bei diesen Daten handelt. Auf diese Weise können wir in future das Speichern von mehr Entitätstypen unterstützen und fortschrittliche Technologien wie GSI Overloading und Sparse verwenden, um mehr GSI Zugriffsmustern gerecht zu werden.
Beginnen wir mit der Implementierung der Zugriffsmuster. Zugriffsmuster wie das Hinzufügen von Spielern und das Hinzufügen von Ausrüstung können über die Operation PutItem
realisiert werden, sodass wir sie ignorieren können. In diesem Dokument konzentrieren wir uns auf die oben aufgeführten typischen Zugriffsmuster.
Schritt 1: Zugriffsmuster 1 (getPlayerFriends
) angehen
In diesem Schritt gehen wir das Zugriffsmuster 1 (getPlayerFriends
) an. In unserem aktuellen Design ist die Freundschaft einfach und die Anzahl der Freunde im Spiel ist gering. Der Einfachheit halber verwenden wir einen Listendatentyp, um Freundeslisten zu speichern (1:1-Modellierung). In diesem Design verwenden wir GetItem
, um dieses Zugriffsmuster zu erfüllen. In der Operation GetItem
geben wir explizit den Partitions- und den Sortierschlüsselwert an, um ein spezifisches Element abzurufen.
Wenn ein Spiel jedoch eine große Anzahl von Freunden hat und die Beziehungen zwischen ihnen komplex sind (z. B. bidirektionale Freundschaften mit einer Einladungs- und einer Annahmekomponente), wäre es notwendig, eine many-to-many Beziehung zu verwenden, um jeden Freund einzeln zu speichern, um auf eine unbegrenzte Freundeslistengröße skalieren zu können. Und wenn die Änderung der Freundschaft beinhaltet, mehrere Objekte gleichzeitig zu bearbeiten, können DynamoDB-Transaktionen verwendet werden, um mehrere Aktionen zu gruppieren und sie als einzelne all-or-nothing TransactWriteItems
Oder-Operation einzureichen. TransactGetItems
Schritt 2: Zugriffsmuster 2 (getPlayerAllProfile
), 3 (getPlayerAllItems
) und 4 (getPlayerSpecificItem
) angehen
In diesem Schritt gehen wir die Zugriffsmuster 2 (getPlayerAllProfile
), 3 (getPlayerAllItems
) und 4 (getPlayerSpecificItem
) an. Was diese drei Zugriffsmuster gemeinsam haben, ist eine Bereichsabfrage, die die Operation Query verwendet. Je nach Umfang der Abfrage werden Schlüsselbedingung und Filterausdrücke verwendet, die in der praktischen Entwicklung häufig verwendet werden.
In der Abfrage-Operation geben wir einen einzelnen Wert für den Partitionsschlüssel an und rufen alle Elemente mit diesem Partitionsschlüsselwert ab. Das Zugriffsmuster 2 (getPlayerAllProfile
) wird auf diese Weise implementiert. Optional können wir einen Bedingungsausdruck für den Sortierschlüssel hinzufügen – eine Zeichenfolge, die bestimmt, welche Elemente aus der Tabelle gelesen werden sollen. Das Zugriffsmuster 3 (getPlayerAllItems
) wird implementiert, indem die Schlüsselbedingung sort key begins_with ITEMS#
hinzugefügt wird. Zum Vereinfachen der Entwicklung der Anwendungsseite können wir außerdem Filterausdrücke verwenden, um das Zugriffsmuster 4 (getPlayerSpecificItem
) zu implementieren.
Dies ist ein Pseudocode-Beispiel, das einen Filterausdruck verwendet, der Elemente der Kategorie Weapon
filtert:
filterExpression: "ItemType = :itemType" expressionAttributeValues: {":itemType": "Weapon"}
Anmerkung
Ein Filterausdruck wird angewendet, nachdem eine Abfrage abgeschlossen ist und bevor die Ergebnisse zurückgegeben werden. Folglich verbraucht eine Abfrage unabhängig davon, ob ein Filterausdruck vorhanden ist oder nicht, gleich viel Lesekapazität.
Wenn das Zugriffsmuster darin besteht, einen großen Datensatz abzufragen und eine große Datenmenge herauszufiltern, um nur eine kleine Teilmenge der Daten zu behalten, sollten der DynamoDB-Partitionsschlüssel und -Sortierschlüssel effektiver gestaltet werden. Wenn es im obigen Beispiel zum Abrufen eines bestimmten ItemType
beispielsweise viele Gegenstände für jeden Spieler gibt und die Abfrage eines bestimmten ItemType
ein typisches Zugriffsmuster ist, wäre es effizienter, ItemType
als zusammengesetzten Schlüssel in den SK
aufzunehmen. Das Datenmodell würde dann wie folgt aussehen: ITEMS#ItemType#ItemId
.
Schritt 3: Zugriffsmuster 5 (updateCharacterAttributes
) und 6 (updateItemCount
) angehen
In diesem Schritt gehen wir die Zugriffsmuster 5 (updateCharacterAttributes
) und 6 (updateItemCount
) an. Wenn der Spieler den Charakter modifizieren – z. B. die Währung reduzieren oder die Menge einer bestimmten Waffe in seinen Gegenständen ändern – muss, verwenden Sie UpdateItem
, um diese Zugriffsmuster zu implementieren. Wenn wir die Währung eines Spielers aktualisieren und gleichzeitig sicherstellen möchten, dass sie einen Mindestbetrag niemals unterschreitet, können wir Beispiel für einen DynamoDB-Bedingungsausdruck CLI hinzufügen, um das Guthaben nur dann zu reduzieren, wenn es größer oder gleich dem Mindestbetrag ist. Dies ist ein Pseudocode-Beispiel:
UpdateExpression: "SET currency = currency - :amount" ConditionExpression: "currency >= :minAmount"
Wenn wir bei der Entwicklung mit DynamoDB unteilbare Zähler zum Verringern des Inventars verwenden, können wir die Idempotenz sicherstellen, indem wir die optimistische Sperre verwenden. Dies ist ein Pseudocode-Beispiel für unteilbare Zähler:
UpdateExpression: "SET ItemCount = ItemCount - :incr" expression-attribute-values: '{":incr":{"N":"1"}}'
Darüber hinaus muss in einem Szenario, in dem der Spieler einen Gegenstand mit einer Währung kauft, der gesamte Vorgang die Währung abziehen und gleichzeitig einen Gegenstand hinzufügen. Wir können DynamoDB-Transaktionen verwenden, um mehrere Aktionen zu gruppieren und sie als einzelne all-or-nothing TransactWriteItems
TransactGetItems
ODER-Operation einzureichen. TransactWriteItems
ist eine synchrone und idempotente Schreiboperation, die bis zu 100 Schreibaktionen in einer einzigen Operation gruppiert. all-or-nothing Die Aktionen werden atomarisch ausgeführt, d. h. entweder sind alle von ihnen oder keine von ihnen erfolgreich. Mit Transaktionen lässt sich das Risiko beseitigen, dass eine Währung dupliziert wird oder verschwindet. Weitere Informationen zu Transaktionen finden Sie unter DynamoDB-Transaktionen-Beispiel.
Alle Zugriffsmuster und wie das Schemadesign sie behandelt, sind in der folgenden Tabelle zusammengefasst:
Zugriffsmuster | Basistabelle//GSILSI | Operation | Partitionsschlüsselwert | Sortierschlüsselwert | Sonstige Bedingungen/Filter |
---|---|---|---|---|---|
getPlayerFriends | Basistabelle | GetItem | PK=PlayerID | SK= „#playerID“ FRIENDS | |
getPlayerAllProfil | Basistabelle | Query | PK=PlayerID | ||
getPlayerAllArtikel | Basistabelle | Query | PK=PlayerID | SK beginnt_mit „#“ ITEMS | |
getPlayerSpecificArtikel | Basistabelle | Query | PK=PlayerID | SK beginnt_mit „#“ ITEMS | filterExpression: "ItemType =:itemType" expressionAttributeValues: {„: „: itemType „Waffe“} |
updateCharacterAttributes | Basistabelle | UpdateItem | PK=PlayerID | SK= „METADATA#playerID“ | UpdateExpression: "SETWährung = Währung -:Betrag“: „Währung >= ConditionExpression:“ minAmount |
updateItemCount | Basistabelle | UpdateItem | PK=PlayerID | SK = „#ItemID“ ITEMS | Ausdruck aktualisieren: "SET ItemCount = ItemCount -:incr“: '{“ :incr“ expression-attribute-values: {"N“ :"1"}}' |
Endgültiges Schema des Gaming-Profils
Dies ist das endgültige Schemadesign. Informationen zum Herunterladen dieses Schemadesign als JSON Datei finden Sie unter DynamoDB-Beispiele
Basistabelle:
Verwenden von No SQL Workbench mit diesem Schemadesign
Sie können dieses endgültige Schema in No SQL Workbench importieren, ein visuelles Tool, das Funktionen für Datenmodellierung, Datenvisualisierung und Abfrageentwicklung für DynamoDB bereitstellt, um Ihr neues Projekt weiter zu untersuchen und zu bearbeiten. Gehen Sie folgendermaßen vor, um zu beginnen:
-
Laden Sie No Workbench herunter. SQL Weitere Informationen finden Sie unter No SQL Workbench für DynamoDB herunterladen.
-
Laden Sie die oben aufgeführte JSON Schemadatei herunter, die bereits im No SQL Workbench-Modellformat vorliegt.
-
Importieren Sie die JSON Schemadatei in No SQL Workbench. Weitere Informationen finden Sie unter Importieren eines vorhandenen Datenmodells.
-
Sobald Sie in NOSQL Workbench importiert haben, können Sie das Datenmodell bearbeiten. Weitere Informationen finden Sie unter Bearbeiten eines vorhandenen Datenmodells.
-
Verwenden Sie die Data Visualizer-Funktion von No SQL Workbench, um Ihr Datenmodell zu visualisieren, Beispieldaten hinzuzufügen oder Beispieldaten aus einer CSV Datei zu importieren.