Verwendung von DynamoDB als Datenspeicher für einen Online-Shop - Amazon DynamoDB

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.

Verwendung von DynamoDB als Datenspeicher für einen Online-Shop

In diesem Anwendungsfall geht es um die Verwendung von DynamoDB als Datenspeicher für einen Online-Shop (E-Store).

Anwendungsfall

In einem Online-Shop können Benutzer verschiedene Produkte durchsuchen und diese schließlich kaufen. Basierend auf der generierten Rechnung kann ein Kunde mit einem Rabattcode oder einer Geschenkkarte bezahlen und dann den Restbetrag mit einer Kreditkarte begleichen. Die gekauften Produkte werden von einem der Warenlager abgeholt und an die angegebene Adresse versandt. Zu den typischen Zugriffsmustern für einen Online-Shop gehören folgende:

  • Kunden für eine bestimmte CustomerId abrufen

  • Produkt für eine bestimmte ProductId abrufen

  • Warenlager für eine bestimmte WarehouseId abrufen

  • Produktbestand für alle Warenlager nach ProductId abrufen

  • Bestellung für eine bestimmte OrderId abrufen

  • Alle Produkte für eine bestimmte OrderId abrufen

  • Rechnung für eine bestimmte OrderId abrufen

  • Alle Lieferungen für eine bestimmte OrderId abrufen

  • Alle Bestellungen für eine bestimmte ProductId für einen bestimmten Zeitraum abrufen

  • Rechnung für eine bestimmte InvoiceId abrufen

  • Alle Zahlungen für eine bestimmte InvoiceId abrufen

  • Versanddetails für eine bestimmte ShipmentId abrufen

  • Alle Lieferungen für eine bestimmte WarehouseId abrufen

  • Bestand aller Produkte für eine bestimmte WarehouseId abrufen

  • Alle Rechnungen für eine bestimmte CustomerId für einen bestimmten Zeitraum abrufen

  • Alle von einer bestimmten CustomerId bestellten Produkte für einen bestimmten Zeitraum abrufen

Diagramm der Entitätsbeziehungen

Dieses Diagramm der Entitätsbeziehungen (Entity Relationship Diagram, ERD) verwenden wir, um DynamoDB als Datenspeicher für einen Online-Shop zu verwenden.

ERD für das Datenmodell eines Online-Shops mit Entitäten wie „Product“, „Order“, „Payment“ und „Customer“.

Zugriffsmuster

Das sind die Zugriffsmuster, die wir in Betracht ziehen, wenn wir DynamoDB als Datenspeicher für einen Online-Shop verwenden.

  1. getCustomerByCustomerId

  2. getProductByProductId

  3. getWarehouseByWarehouseId

  4. getProductInventoryByProductId

  5. getOrderDetailsByOrderId

  6. getProductByOrderId

  7. getInvoiceByOrderId

  8. getShipmentByOrderId

  9. getOrderByProductIdForDateRange

  10. getInvoiceByInvoiceId

  11. getPaymentByInvoiceId

  12. getShipmentDetailsByShipmentId

  13. getShipmentByWarehouseId

  14. getProductInventoryByWarehouseId

  15. getInvoiceByCustomerIdForDateRange

  16. getProductsByCustomerIdForDateRange

Entwicklung des Schemadesigns

Importieren Sie über NoSQL-Workbench für DynamoDB die Datei AnOnlineShop_1.json, um ein neues Datenmodell namens AnOnlineShop und eine neue Tabelle namens OnlineShop zu erstellen. Beachten Sie, dass wir für den Partitionsschlüssel und den Sortierschlüssel die generischen Namen PK und SK verwenden. Diese Methode wird verwendet, um verschiedene Arten von Entitäten in derselben Tabelle zu speichern.

Schritt 1: Zugriffsmuster 1 (getCustomerByCustomerId) angehen

Importieren Sie die Datei AnOnlineShop_2.json, um das Zugriffsmuster 1 (getCustomerByCustomerId) anzugehen. Manche Entitäten haben keine Beziehungen zu anderen Entitäten, daher verwenden wir für sie den gleichen Wert von PK und SK. Beachten Sie in den Beispieldaten, dass die Schlüssel das Präfix c# verwenden, um die customerId von anderen Entitäten zu unterscheiden, die später hinzugefügt werden. Diese Vorgehensweise wird auch für andere Entitäten genutzt.

Um dieses Zugriffsmuster anzugehen, kann ein GetItem-Vorgang mit PK=customerId und SK=customerId verwendet werden.

Schritt 2: Zugriffsmuster 2 (getProductByProductId) angehen

Importieren Sie die Datei AnOnlineShop_3.json, um das Zugriffsmuster 2 (getProductByProductId) für die Entität product anzugehen. Den Produktentitäten wird das Präfix p# vorangestellt und dasselbe Sortierschlüsselattribut wurde zum Speichern der customerID und der productID verwendet. Die generische Benennung und vertikale Partitionierung ermöglichen es uns, solche Elementauflistungen zu erstellen, um ein effektives Einzeltabellendesign zu erhalten.

Um dieses Zugriffsmuster anzugehen, kann ein GetItem-Vorgang mit PK=productId und SK=productId verwendet werden.

Schritt 3: Zugriffsmuster 3 (getWarehouseByWarehouseId) angehen

Importieren Sie die Datei AnOnlineShop_4.json, um das Zugriffsmuster 3 (getWarehouseByWarehouseId) für die Entität warehouse anzugehen. Derzeit werden die Entitäten customer, product und warehouse zur selben Tabelle hinzugefügt. Sie unterscheiden sich durch Präfixe und das Attribut EntityType. Ein Typ-Attribut (oder eine Präfixbenennung) verbessert die Lesbarkeit des Modells. Würden wir einfach alphanumerische IDs für verschiedene Entitäten im selben Attribut speichern, wäre die Lesbarkeit beeinträchtigt. Ohne diese Identifikatoren wäre es schwierig, eine Entität von der anderen zu unterscheiden.

Um dieses Zugriffsmuster anzugehen, kann ein GetItem-Vorgang mit PK=warehouseId und SK=warehouseId verwendet werden.

Basistabelle:

DynamoDB-Tabellendesign mit Präfixen und „EntityType“ zum Abrufen von Lagerdaten anhand ihrer ID.

Schritt 4: Zugriffsmuster 4 (getProductInventoryByProductId) angehen

Importieren Sie die Datei AnOnlineShop_5.json, um das Zugriffsmuster 4 (getProductInventoryByProductId) anzugehen. Die Entität warehouseItem wird verwendet, um die Anzahl der Produkte in jedem Warenlager zu verfolgen. Dieses Element wird normalerweise aktualisiert, wenn ein Produkt einem Warenlager hinzugefügt oder entnommen wird. Wie aus dem Diagramm der Entitätsbeziehungen hervorgeht, besteht zwischenproduct und warehouse eine n:m-Beziehung. Hier wird die 1:n-Beziehung von product zu warehouse als warehouseItem modelliert. Später wird auch die 1:n-Beziehung von warehouse zu product modelliert.

Das Zugriffsmuster 4 kann mit der Abfrage von PK=ProductId und SK begins_with “w#“ angegangen werden.

Weitere Informationen zu begins_with() und weitere Ausdrücke, die auf Sortierschlüssel angewendet werden können, finden Sie unter Schlüsselbedingungsausdrücke.

Basistabelle:

Tabellendesign zur Abfrage von „ProductID“ und „warehouseId“ zur Nachverfolgung des Produktbestands in einem bestimmten Lager.

Schritt 5: Zugriffsmuster 5 (getOrderDetailsByOrderId) und 6 (getProductByOrderId) angehen

Fügen Sie der Tabelle weitere Elemente des Typs customer, product und warehouse hinzu, indem Sie die Datei AnOnlineShop_6.json importieren. Importieren Sie dann die Datei AnOnlineShop_7.json, um eine Elementauflistung für order zu erstellen, die die Zugriffsmuster 5 (getOrderDetailsByOrderId) und 6 (getProductByOrderId) angehen kann. Sie sehen die 1:n-Beziehung zwischen order und product als OrderItem-Entitäten modelliert.

Um das Zugriffsmuster 5 (getOrderDetailsByOrderId) anzugehen, fragen Sie die Tabelle mit PK=orderId ab. Dadurch erhalten Sie alle Informationen zur Bestellung, einschließlich der customerIdund der bestellten Produkte.

Basistabelle:

Tabellendesign für Abfragen mithilfe von „orderId“ zum Abrufen von Informationen zu allen bestellten Produkten.

Um das Zugriffsmuster 6 (getProductByOrderId) anzugehen, müssen wir nur Produkte in einer order lesen. Fragen Sie dazu die Tabelle mit PK=orderId und SK begins_with “p#” ab.

Basistabelle:

Tabellendesign für Abfragen mithilfe von „orderId“ und productId zum Abrufen von Produkten in einer Bestellung.

Schritt 6: Zugriffsmuster 7 (getInvoiceByOrderId) angehen

Importieren Sie die Datei AnOnlineShop_8.json, um eine Entität des Typs invoice zur Elementauflistung order hinzuzufügen und Zugriffsmuster 7 (getInvoiceByOrderId) anzugehen. Um dieses Zugriffsmuster anzugehen, können Sie einen Abfragevorgang mit PK=orderId und SK begins_with “i#” verwenden.

Basistabelle:

Tabellendesign mit Rechnungsentität in der Bestellartikelsammlung, um eine Rechnung nach „orderId“ abzurufen.

Schritt 7: Zugriffsmuster 8 (getShipmentByOrderId) angehen

Importieren Sie die Datei AnOnlineShop_9.json, um Entitäten des Typs shipment zur Elementauflistung order hinzuzufügen und Zugriffsmuster 8 (getShipmentByOrderId) anzugehen. Wir erweitern dasselbe vertikal partitionierte Modell, indem wir dem Einzeltabellendesign weitere Typen von Entitäten hinzufügen. Beachten Sie, dass die Elementauflistung order die verschiedenen Beziehungen enthält, die eine Entität des Typs order zu den Entitäten des Typs shipment, orderItem und invoice hat.

Um Lieferungen nach orderId abzurufen, können Sie einen Abfragevorgang mit PK=orderIdund SK begins_with “sh#” durchführen.

Basistabelle:

Tabellendesign mit einer zur Bestellartikelsammlung hinzugefügten Versandentität, um Lieferungen anhand der Bestellnummer abzurufen.

Schritt 8: Zugriffsmuster 9 (getOrderByProductIdForDateRange) angehen

Wir haben im vorherigen Schritt die Elementauflistung order erstellt. Dieses Zugriffsmuster hat neue Suchdimensionen (ProductID und Date), weshalb Sie die gesamte Tabelle scannen und relevante Datensätze herausfiltern müssen, um die anvisierten Elemente abzurufen. Um dieses Zugriffsmuster anzugehen, müssen wir einen globalen sekundären Index (GSI) erstellen. Importieren Sie die Datei AnOnlineShop_10.json, um mithilfe des GSI eine neue Elementauflistung zu erstellen, die das Abrufen der orderItem-Daten von mehreren order-Elementauflistungen ermöglicht. Die Daten verfügen jetzt über GSI1-PK und GSI1-SK, den zukünftigen Partitionsschlüssel und Sortierschlüssel von GSI1.

DynamoDB fügt automatisch Elemente, die die Schlüsselattribute eines GSI enthalten, aus der Tabelle in den GSI ein. Zusätzliche manuelle Einfügungen in den GSI sind nicht notwendig.

Um das Zugriffsmuster 9 anzugehen, führen Sie eine Abfrage an GSI1 mit GSI1-PK=productId und GSI1SK between (date1, date2) durch.

Basistabelle:

Tabellendesign mit einem GSI zum Abrufen von Bestelldaten aus mehreren Bestellartikelsammlungen.

GSI1:

GSI-Design mit „ProductID“ und „Date“ als Partitions- und Sortierschlüssel, um Bestellungen nach Produkt-ID und Datum abzurufen.

Schritt 9: Zugriffsmuster 10 (getInvoiceByInvoiceId) und 11 (getPaymentByInvoiceId) angehen

Importieren Sie die Datei AnOnlineShop_11.json, um die Zugriffsmuster 10 (getInvoiceByInvoiceId) und 11 (getPaymentByInvoiceId) anzugehen, die beide zur invoice gehören. Obwohl es sich um zwei unterschiedliche Zugriffsmuster handelt, werden sie mit derselben Schlüsselbedingung realisiert. Payments sind als Attribut mit dem Datentyp „Karte“ auf der Entität invoice definiert.

Anmerkung

GSI1-PK und GSI1-SK sind überladen und speichern Informationen über verschiedene Entitäten, sodass mehrere Zugriffsmuster vom selben GSI aus abgedeckt werden können. Weitere Informationen zur GSI-Überladung finden Sie unter Überladen globaler sekundärer Indizes in DynamoDB.

Um die Zugriffsmuster 10 und 11 anzugehen, fragen Sie GSI1 mit GSI1-PK=invoiceId und GSI1-SK=invoiceId ab.

GSI1:

GSI-Design mit „invoiceId“ als Partitions- und Sortierschlüssel, um Rechnungen und Zahlungen anhand der Rechnungs-ID abzurufen.

Schritt 10: Zugriffsmuster 12 (getShipmentDetailsByShipmentId) und 13 (getShipmentByWarehouseId) angehen

Importieren Sie die Datei AnOnlineShop_12.json, um die Zugriffsmuster 12 (getShipmentDetailsByShipmentId) und 13 (getShipmentByWarehouseId) anzugehen.

Beachten Sie, dass shipmentItem-Entitäten zur Elementauflistung order in der Basistabelle hinzugefügt werden, damit alle Details zu einer Bestellung in einem einzigen Abfragevorgang abgerufen werden können.

Basistabelle:

Tabellendesign mit einer „shipmentItem“-Entität in der Bestellartikelsammlung, um alle Bestelldetails abzurufen.

Der Partitions- und der Sortierschlüssel von GSI1 wurden bereits verwendet, um eine 1:n-Beziehung zwischen shipment und shipmentItem zu modellieren. Um das Zugriffsmuster 12 (getShipmentDetailsByShipmentId) anzugehen, fragen Sie GSI1 mit GSI1-PK=shipmentId und GSI1-SK=shipmentId ab.

GSI1:

GSI1-Design mit „shipmentId“ als Partitions- und Sortierschlüssel zum Abrufen von Versanddetails nach Sendungsnummer.

Wir müssen einen weiteren GSI (GSI2) erstellen, um die neue 1:n-Beziehung zwischen warehouse und shipment für Zugriffsmuster 13 (getShipmentByWarehouseId) zu modellieren. Um dieses Zugriffsmuster anzugehen, fragen Sie GSI2 mit GSI2-PK=warehouseId und GSI2-SK begins_with “sh#” ab.

GSI2:

GSI2-Design mit „warehouseId“ und „shipmentId“ als Partitions- und Sortierschlüssel, um Lieferungen nach Lager abzurufen.

Schritt 11: Zugriffsmuster 14 (getProductInventoryByWarehouseId), 15 (getInvoiceByCustomerIdForDateRange) und 16 (getProductsByCustomerIdForDateRange) angehen

Importieren Sie die Datei AnOnlineShop_13.json, um Daten hinzuzufügen, die sich auf die nächste Gruppe von Zugriffsmustern beziehen. Um das Zugriffsmuster 14 (getProductInventoryByWarehouseId) anzugehen, fragen Sie GSI2 mit GSI2-PK=warehouseId und GSI2-SK begins_with “p#” ab.

GSI2:

GSI2-Design mit „warehouseId“ und „productId“ als Partitions- und Sortierschlüssel für Zugriffsmuster 14.

Um das Zugriffsmuster 15 (getInvoiceByCustomerIdForDateRange) anzugehen, fragen Sie GSI2 mit GSI2-PK=customerId und GSI2-SK between (i#date1, i#date2) ab.

GSI2:

GSI2-Design mit „customerId“ und Rechnungsdatumsbereich als Partitions- und Sortierschlüssel für das Zugriffsmuster 15.

Um das Zugriffsmuster 16 (getProductsByCustomerIdForDateRange) anzugehen, fragen Sie GSI2 mit GSI2-PK=customerId und GSI2-SK between (p#date1, p#date2) ab.

GSI2:

GSI2-Design mit „customerId“ und Produktdatumsbereich als Partitions- und Sortierschlüssel für das Zugriffsmuster 16.
Anmerkung

In NoSQL-Workbench stehen Facets für die verschiedenen Datenzugriffsmuster einer Anwendung für DynamoDB. Facets bieten Ihnen die Möglichkeit, eine Teilmenge der Daten in einer Tabelle anzuzeigen, ohne Datensätze sehen zu müssen, die den Einschränkungen des Facets nicht entsprechen. Facets gelten als visuelles Datenmodellierungswerkzeug und existieren nicht als brauchbares Konstrukt in DynamoDB, da sie eine reine Hilfe zur Modellierung von Zugriffsmustern darstellen.

Importieren Sie die Datei AnOnlineShop_facets.json, um die Facets für diesen Anwendungsfall zu sehen.

Alle Zugriffsmuster und wie das Schemadesign sie behandelt, sind in der folgenden Tabelle zusammengefasst:

Zugriffsmuster Basistabelle/GSI/LSI Operation Partitionsschlüsselwert Sortierschlüsselwert
getCustomerByCustomerId Basistabelle GetItem PK=customerId SK=customerId
getProductByProductId Basistabelle GetItem PK=productId SK=productId
getWarehouseByWarehouseId Basistabelle GetItem PK=warehouseId SK=warehouseId
getProductInventoryByProductId Basistabelle Query PK=productId SK begins_with "w#"
getOrderDetailsByOrderId Basistabelle Query PK=orderId
getProductByOrderId Basistabelle Query PK=orderId SK begins_with "p#"
getInvoiceByOrderId Basistabelle Query PK=orderId SK begins_with "i#"
getShipmentByOrderId Basistabelle Query PK=orderId SK begins_with "sh#"
getOrderByProductIdForDateRange GSI1 Abfrage PK=productId SK zwischen Datum1 und Datum2
getInvoiceByInvoiceId GSI1 Abfrage PK=invoiceId SK=invoiceId
getPaymentByInvoiceId GSI1 Abfrage PK=invoiceId SK=invoiceId
getShipmentDetailsByShipmentId GSI1 Abfrage PK=shipmentId SK=shipmentId
getShipmentByWarehouseId GSI2 Abfrage PK=warehouseId SK begins_with "sh#"
getProductInventoryByWarehouseId GSI2 Abfrage PK=warehouseId SK begins_with "p#"
getInvoiceByCustomerIdForDateRange GSI2 Abfrage PK=customerId SKU zwischen i#date1 und i#date2
getProductsByCustomerIdForDateRange GSI2 Abfrage PK=customerId SK zwischen p#date1 und p#date2

Endgültiges Schema des Online-Shops

Dies sind die endgültigen Schemadesigns. Informationen zum Herunterladen dieses Schemadesigns als JSON-Datei finden Sie unter DynamoDB Designmuster auf GitHub.

Basistabelle

Endgültiges Schema der Basistabelle für einen Online-Shop mit Attributen wie „EntityName“ und „Name“.

GSI1

Endgültiges GSI1-Schema für die Basistabelle eines Online-Shops mit Attributen wie „EntityType“.

GSI2

Endgültiges GSI2-Schema für die Basistabelle eines Online-Shops mit Attributen wie „EntityType“.

Verwendung von NoSQL Workbench mit diesem Schemadesign

Sie können dieses endgültige Schema in NoSQL Workbench importieren, um Ihr neues Projekt weiter zu untersuchen und zu bearbeiten. NoSQL Workbench ist ein visuelles Tool, das Features zur Datenmodellierung, Datenvisualisierung und Abfrageentwicklung für DynamoDB bereitstellt. Gehen Sie folgendermaßen vor, um zu beginnen:

  1. Laden Sie NoSQL Workbench herunter. Weitere Informationen finden Sie unter Herunterladen von NoSQL Workbench for DynamoDB.

  2. Laden Sie die oben aufgeführte JSON-Schemadatei herunter, die bereits das NoSQL-Workbench-Modellformat aufweist.

  3. Importieren Sie die JSON-Schemadatei in NoSQL Workbench. Weitere Informationen finden Sie unter Importieren eines vorhandenen Datenmodells.

  4. Nach dem Import in NOSQL Workbench können Sie das Datenmodell bearbeiten. Weitere Informationen finden Sie unter Bearbeiten eines vorhandenen Datenmodells.

  5. Verwenden Sie das Feature Data Visualizer von NoSQL Workbench, um Ihr Datenmodell zu visualisieren, Beispieldaten hinzuzufügen oder Beispieldaten aus einer CSV-Datei zu importieren.