Utilisation de DynamoDB comme magasin de données pour une boutique en ligne - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de DynamoDB comme magasin de données pour une boutique en ligne

Ce cas d'utilisation décrit l'utilisation de DynamoD comme magasin de données pour une boutique en ligne (ou boutique virtuelle).

Cas d’utilisation

Une boutique en ligne permet aux utilisateurs de parcourir différents produits et de les acheter par la suite. Sur la base de la facture générée, le client peut payer à l'aide d'un code de réduction ou d'une carte-cadeau, puis régler le montant restant par carte de crédit. Les produits achetés seront collectés dans l'un des nombreux entrepôts et seront expédiés à l'adresse indiquée. Les modèles d'accès types d’une boutique en ligne incluent :

  • Obtenir un client pour un certain montant customerId

  • Obtenir un produit pour un produit donné productId

  • Obtenir un entrepôt pour une donnée warehouseId

  • Obtenez un inventaire des produits pour tous les entrepôts par un productId

  • Obtenir une commande pour une donnée orderId

  • Obtenez tous les produits pour un prix donné orderId

  • Obtenir une facture pour une donnée orderId

  • Obtenez tous les envois pour un montant donné orderId

  • Obtenez toutes les commandes pour une période donnée productId pour une plage de dates donnée

  • Obtenir une facture pour une donnée invoiceId

  • Recevez tous les paiements pour un montant donné invoiceId

  • Obtenir les détails de l'expédition pour un envoi donné shipmentId

  • Obtenez tous les envois pour un montant donné warehouseId

  • Obtenir l'inventaire de tous les produits pour un produit donné warehouseId

  • Obtenez toutes les factures pour une période donnée customerId pour une plage de dates donnée

  • Obtenez tous les produits commandés avant un certain customerId délai pour une période donnée

Diagramme des relations entre entités

Il s'agit du diagramme entité-relation (ERD) que nous utiliserons pour modéliser DynamoDB en tant que magasin de données pour une boutique en ligne.

ERDpour le modèle de données d'une boutique en ligne avec des entités telles que le produit, la commande, le paiement et le client.

Modèles d'accès

Voici les modèles d'accès que nous allons prendre en compte lors de l’utilisation de DynamoDB comme magasin de données pour une boutique en ligne.

  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

Évolution de la conception du schéma

En utilisantPas de SQL Workbench pour DynamoDB, import AnOnlineShop_1.json pour créer un nouveau modèle de données appelé AnOnlineShop et une nouvelle table appelée. OnlineShop Notez que nous utilisons les noms génériques PK et SK pour la clé de partition et la clé de tri. Cette méthode permet de stocker différents types d'entités dans la même table.

Étape 1 : Traitement du modèle d'accès 1 (getCustomerByCustomerId)

Importez AnOnlineShop_2.json pour gérer le modèle d'accès 1 ()getCustomerByCustomerId. Étant donné que certaines entités n'ont aucune relation avec d'autres entités, nous utiliserons la même valeur de PK et SK pour ces entités. Dans les exemples de données, notez que les clés utilisent le préfixe c# afin de distinguer customerId des autres entités qui seront ajoutées ultérieurement. Cette méthode est également répétée pour d'autres entités.

Pour traiter ce modèle d'accès, il est possible d’utiliser l’opération GetItem avec PK=customerId et SK=customerId.

Étape 2 : Traitement du modèle d'accès 2 (getProductByProductId)

Importez AnOnlineShop_3.json pour adresser le modèle d'accès 2 (getProductByProductId) pour l'productentité. Les entités de produit utilisent le préfixe p# et le même attribut de clé de tri a été utilisé pour stocker customerID et productID. Un nom générique et le partitionnement vertical nous permettent de créer ces ensembles d’éléments pour une conception de table unique efficace.

Pour traiter ce modèle d'accès, il est possible d’utiliser l’opération GetItem avec PK=productId et SK=productId.

Étape 3 : Traitement du modèle d'accès 3 (getWarehouseByWarehouseId)

Importez AnOnlineShop_4.json pour adresser le modèle d'accès 3 (getWarehouseByWarehouseId) pour l'warehouseentité. Les entités customer, product et warehouse ont actuellement été ajoutées à la même table. Ils se distinguent par l’utilisation de préfixes et de l’attribut EntityType. Un attribut de type (ou l’utilisation d’un préfixe) améliore la lisibilité du modèle. La lisibilité serait affectée si nous stockions simplement des caractères alphanumériques IDs pour différentes entités dans le même attribut. Il serait difficile de distinguer une entité d’une autre en l'absence de ces identifiants.

Pour traiter ce modèle d'accès, il est possible d’utiliser l’opération GetItem avec PK=warehouseId et SK=warehouseId.

Table de base :

Conception de tables DynamoDB avec préfixes EntityType et permettant d'obtenir les données d'entrepôt par leur identifiant.

Étape 4 : Traitement du modèle d'accès 4 (getProductInventoryByProductId)

Importez AnOnlineShop_5.json pour adresser le modèle d'accès 4 ()getProductInventoryByProductId. warehouseItemL'entité est utilisée pour suivre le nombre de produits dans chaque entrepôt. Cet élément est habituellement mis à jour lorsqu'un produit est ajouté ou retiré d'un entrepôt. Comme on le voit dans leERD, il existe une many-to-many relation entre product etwarehouse. Ici, la one-to-many relation de product à warehouse est modélisée commewarehouseItem. Plus tard, la one-to-many relation de warehouse à product sera également modélisée.

Le modèle d'accès 4 peut être traité à l'aide d'une requête sur PK=ProductId et SK begins_with “w#“.

Pour plus d'informations sur begins_with() et d'autres expressions pouvant être appliquées aux clés de tri, consultez Expressions de condition de clé.

Table de base :

Conception de table pour interroger ProductID warehouseId et pour suivre l'inventaire des produits dans un entrepôt donné.

Étape 5 : Traitement des modèles d'accès 5 (getOrderDetailsByOrderId) et 6 (getProductByOrderId)

Ajoutez quelques warehouse éléments supplémentaires customer à la table en important AnOnlineShop_6.json. product Ensuite, importez AnOnlineShop_7.json pour créer une collection d'objets order capable de répondre aux modèles d'accès 5 (getOrderDetailsByOrderId) et 6 (getProductByOrderId). Vous pouvez voir la one-to-many relation entre les entités order et les product modéliser en tant qu' orderItem entités.

Pour traiter le modèle d'accès 5 (getOrderDetailsByOrderId), interrogez la table avec PK=orderId. Cette requête fournira toutes les informations relatives à la commande, y compris le customerId et les produits commandés.

Table de base :

Conception de table à utiliser orderId pour effectuer des requêtes pour obtenir des informations sur tous les produits commandés.

Pour traiter le modèle d'accès 6 (getProductByOrderId), nous devons lire les produits uniquement dans order. Pour ce faire, interrogez la table avec PK=orderId et SK begins_with “p#”.

Table de base :

Conception de table pour interroger l'utilisation orderId et productId l'obtention de produits dans une commande.

Étape 6 : Traitement du modèle d'accès 7 (getInvoiceByOrderId)

Importez AnOnlineShop_8.json pour ajouter une invoice entité à la collection d'articles de commande afin de gérer le modèle d'accès 7 ()getInvoiceByOrderId. Pour traiter ce modèle d'accès, il est possible d’utiliser une opération query avec PK=orderId et SK begins_with “i#”.

Table de base :

Conception du tableau avec entité de facturation dans la collection des articles de commande pour obtenir une factureorderId.

Étape 7 : Traitement du modèle d'accès 8 (getShipmentByOrderId)

Importez AnOnlineShop_9.json pour ajouter shipment des entités à la collection d'articles de commande afin de répondre au modèle d'accès 8 ()getShipmentByOrderId. Nous développons le même modèle partitionné verticalement en ajoutant d'autres types d'entités dans la conception de table unique. Vous pouvez remarquer que l’ensemble d’éléments order contient les différentes relations d’une entité order avec les entités shipment, orderItem et invoice.

Pour obtenir les expéditions par orderId, vous pouvez effectuer une opération query avec PK=orderId et SK begins_with “sh#”.

Table de base :

Conception du tableau avec une entité d'expédition ajoutée à la collection des articles de commande pour obtenir les envois par numéro de commande.

Étape 8 : Traitement du modèle d'accès 9 (getOrderByProductIdForDateRange)

Nous avons créé un ensemble d’éléments order à l'étape précédente. Ce modèle d'accès comporte de nouvelles dimensions de recherche (ProductID et Date) qui vous obligent à analyser l'ensemble de la table et à filtrer les enregistrements pertinents pour extraire les éléments ciblés. Afin de remédier à ce modèle d'accès, nous devons créer un index secondaire global (GSI). Importez AnOnlineShop_10.json pour créer une nouvelle collection d'articles à l'aide de GSI laquelle il est possible de récupérer les orderItem données de plusieurs collections d'articles de commande. Les données comportent désormais GSI1-PK et GSI1-SK, qui seront la clé de partition et la clé de tri de GSI1, respectivement.

DynamoDB renseigne automatiquement les éléments contenant les attributs clés de GSI a depuis le tableau vers le. GSI Il n'est pas nécessaire de faire manuellement des insertions supplémentaires dans leGSI.

Pour traiter le modèle d'accès 9, exécutez une requête sur GSI1 avec GSI1-PK=productId et GSI1SK between (date1, date2).

Table de base :

Conception de table avec un GSI pour obtenir les données de commande de plusieurs collections d'articles commandés.

GSI1:

GSIconception avec ProductID et Date comme partition et clés de tri pour obtenir les commandes par ID de produit et par date.

Étape 9 : Traitement des modèles d'accès 10 (getInvoiceByInvoiceId) et 11 (getPaymentByInvoiceId)

Importez AnOnlineShop_11.json pour traiter les modèles d'accès 10 (getInvoiceByInvoiceId) et 11 (getPaymentByInvoiceId), qui sont tous deux liés à. invoice Même s'il s'agit de deux modèles d'accès différents, ils sont réalisés en utilisant la même condition de clé. Payments est défini sous la forme d'un attribut avec le type de données de carte sur l’entité invoice.

Note

GSI1-PKet GSI1-SK est surchargé pour stocker des informations sur différentes entités afin que plusieurs modèles d'accès puissent être servis à partir d'une même GSI entité. Pour plus d'informations sur GSI la surcharge, consultezSurcharge des index secondaires globaux dans DynamoDB.

Pour traiter le modèle d'accès 10 et 11, interrogez GSI1 avec GSI1-PK=invoiceId et GSI1-SK=invoiceId.

GSI1:

GSIconception avec à la fois invoiceId comme partition et clé de tri pour obtenir la facture et le paiement par numéro de facture.

Étape 10 : Traitement des modèles d'accès 12 (getShipmentDetailsByShipmentId) et 13 (getShipmentByWarehouseId)

Importez AnOnlineShop_12.json pour traiter les modèles d'accès 12 (getShipmentDetailsByShipmentId) et 13 (getShipmentByWarehouseId).

Vous pouvez remarquer que les entités shipmentItem sont ajoutées à l’ensemble d’éléments order sur la table de base afin de pouvoir récupérer tous les détails d'une commande en une seule opération query.

Table de base :

Conception de table avec shipmentItem entité dans la collection des articles de commande pour obtenir tous les détails de la commande.

Les clés de GSI1 partition et de tri ont déjà été utilisées pour modéliser une one-to-many relation entre shipment etshipmentItem. Pour traiter le modèle d'accès 12 (getShipmentDetailsByShipmentId), interrogez GSI1 avec GSI1-PK=shipmentId et GSI1-SK=shipmentId.

GSI1:

GSI1conception avec une shipmentId partition et une clé de tri pour obtenir les détails de l'expédition par numéro d'expédition.

Nous devrons créer un autre GSI (GSI2) pour modéliser la nouvelle one-to-many relation entre warehouse et shipment pour le modèle d'accès 13 (getShipmentByWarehouseId). Pour traiter ce modèle d'accès, interrogez GSI2 avec GSI2-PK=warehouseId et GSI2-SK begins_with “sh#”.

GSI2:

GSI2concevoir avec warehouseId et shipmentId comme clé de partition et de tri pour acheminer les envois par entrepôt.

Étape 11 : Traitement des modèles d'accès 14 (getProductInventoryByWarehouseId), 15 (getInvoiceByCustomerIdForDateRange) et 16 (getProductsByCustomerIdForDateRange)

Importez AnOnlineShop_13.json pour ajouter des données relatives au prochain ensemble de modèles d'accès. Pour traiter le modèle d'accès 14 (getProductInventoryByWarehouseId), interrogez GSI2 avec GSI2-PK=warehouseId et GSI2-SK begins_with “p#”.

GSI2:

GSI2concevoir avec warehouseId et productId en tant que partition et clés de tri pour adresser le modèle d'accès 14.

Pour traiter le modèle d'accès 15 (getInvoiceByCustomerIdForDateRange), interrogez GSI2 avec GSI2-PK=customerId et GSI2-SK between (i#date1, i#date2).

GSI2:

GSI2conception avec une customerId plage de dates de facturation comme partition et clés de tri pour adresser le modèle d'accès 15.

Pour traiter le modèle d'accès 16 (getProductsByCustomerIdForDateRange), interrogez GSI2 avec GSI2-PK=customerId et GSI2-SK between (p#date1, p#date2).

GSI2:

GSI2conception avec customerId et plage de dates du produit sous forme de partition et de tri des clés pour répondre au modèle d'accès 16
Note

Dans No SQL Workbench, les facettes représentent les différents modèles d'accès aux données d'une application pour DynamoDB. Les facettes vous permettent d'afficher un sous-ensemble de données dans une table, sans avoir à voir les enregistrements qui ne répondent pas aux contraintes de la facette. Les facettes sont considérées comme un outil de modélisation de données visuelles et n'existent pas en tant que construction utilisable dans DynamoDB, car elles sont purement une aide à la modélisation des modèles d'accès.

Importez AnOnlineShop_facets.json pour voir les facettes de ce cas d'utilisation.

Tous les modèles d'accès et la façon dont ils sont traités par la conception du schéma sont résumés dans le tableau ci-dessous :

Modèle d'accès Table de base//GSILSI Opération Valeur de la clé de partition Valeur de clé de tri
getCustomerByCustomerId Table de base GetItem PK = customerId SEK = customerId
getProductByProductId Table de base GetItem PK = productId SEK = productId
getWarehouseByWarehouseId Table de base GetItem PK = warehouseId SEK = warehouseId
getProductInventoryByProductId Table de base Requête PK = productId SK begins_with "w#"
getOrderDetailsByOrderId Table de base Requête PK = orderId
getProductByOrderId Table de base Requête PK = orderId SK begins_with "p#"
getInvoiceByOrderId Table de base Requête PK = orderId SK begins_with "i#"
getShipmentByOrderId Table de base Requête PK = orderId SK begins_with "sh#"
getOrderByProductIdForDateRange GSI1 Requête PK = productId SK between date1 and date2
getInvoiceByInvoiceId GSI1 Requête PK = invoiceId SEK = invoiceId
getPaymentByInvoiceId GSI1 Requête PK = invoiceId SEK = invoiceId
getShipmentDetailsByShipmentId GSI1 Requête PK = shipmentId SEK = shipmentId
getShipmentByWarehouseId GSI2 Requête PK = warehouseId SK begins_with "sh#"
getProductInventoryByWarehouseId GSI2 Requête PK = warehouseId SK begins_with "p#"
getInvoiceByCustomerIdForDateRange GSI2 Requête PK = customerId SK between i#date1 and i#date2
getProductsByCustomerIdForDateRange GSI2 Requête PK = customerId SK between p#date1 and p#date2

Schéma final de la boutique en ligne

Voici les conceptions du schéma final. Pour télécharger cette conception de schéma sous forme de JSON fichier, consultez la section Modèles de conception DynamoDB sur. GitHub

Table de base

Schéma final de la table de base pour une boutique en ligne avec des attributs tels que EntityName et le nom.

GSI1

GSI1Schéma final de la table de base d'une boutique en ligne avec des attributs, tels que EntityType.

GSI2

GSI2Schéma final de la table de base d'une boutique en ligne avec des attributs, tels que EntityType.

Utilisation de No SQL Workbench avec cette conception de schéma

Vous pouvez importer ce schéma final dans No SQL Workbench, un outil visuel qui fournit des fonctionnalités de modélisation des données, de visualisation des données et de développement de requêtes pour DynamoDB, afin d'explorer et de modifier davantage votre nouveau projet. Pour commencer, procédez comme suit :

  1. Téléchargez No SQL Workbench. Pour de plus amples informations, veuillez consulter Télécharger No SQL Workbench pour DynamoDB.

  2. Téléchargez le fichier de JSON schéma indiqué ci-dessus, qui est déjà au format du modèle No SQL Workbench.

  3. Importez le fichier de JSON schéma dans No SQL Workbench. Pour de plus amples informations, veuillez consulter Importation d'un modèle de données existant.

  4. Une fois que vous avez importé dans NOSQL Workbench, vous pouvez modifier le modèle de données. Pour de plus amples informations, veuillez consulter Modification d'un modèle de données existant.

  5. Pour visualiser votre modèle de données, ajouter des exemples de données ou importer des exemples de données à partir d'un CSV fichier, utilisez la fonction de visualisation de données de No SQL Workbench.