Exemple de modélisation des données relationnelles dans DynamoDB - 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.

Exemple de modélisation des données relationnelles dans DynamoDB

Cet exemple décrit comment modéliser des données relationnelles dans Amazon DynamoDB. La conception de la table DynamoDB correspond au schéma de saisie d'ordre relationnel illustré dans. Modélisation relationnelle Cette conception utilise plusieurs tables spécialisées plutôt qu'une seule liste de contiguïté, fournissant des limites opérationnelles claires tout en tirant parti de la stratégie GSIs pour répondre efficacement à tous les modèles d'accès.

L'approche de conception utilise des principes axés sur les agrégats, regroupant les données en fonction des modèles d'accès plutôt que des limites d'entités rigides. Les principales décisions de conception incluent l'utilisation de tables distinctes pour les entités présentant une faible corrélation d'accès, l'intégration des données associées lorsqu'elles sont toujours consultées ensemble et l'utilisation de collections d'articles pour identifier les relations.

Les tables suivantes et les index qui les accompagnent prennent en charge le schéma de saisie des ordres relationnels :

Design de table pour employés

La table Employee stocke les informations sur les employés sous la forme d'une seule entité par élément, optimisée pour les recherches directes avec les employés et prenant en charge plusieurs modèles de requêtes grâce à la stratégie GSIs. Ce tableau illustre le principe de conception de tables distinctes pour les entités présentant des caractéristiques opérationnelles indépendantes et une faible corrélation d'accès entre entités.

La table utilise une clé de partition simple (employee_id) sans clé de tri, car chaque employé est une entité distincte. Quatre GSIs permettent d'effectuer des requêtes efficaces à l'aide de différents attributs :

  • EmployeeByName GSI - Utilise la projection INCLUDE avec tous les attributs des employés pour permettre la récupération complète des informations sur les employés par nom, en gérant les doublons potentiels avec employee_id comme clé de tri

  • EmployeeByWarehouse GSI - Utilise la projection INCLUDE avec uniquement les attributs essentiels (name, job_title, hire_date) pour minimiser les coûts de stockage tout en prenant en charge les requêtes basées sur l'entrepôt

  • EmployeeByJobTitle GSI - Permet les requêtes basées sur les rôles avec la projection INCLUDE pour le reporting et l'analyse organisationnelle

  • EmployeeByHireDate GSI - Utilise une valeur de clé de partition statique « EMPLOYEE » avec hire_date comme clé de tri pour permettre des requêtes de plage de dates efficaces pour les recrutements récents. Étant donné que additions/updates les employés ont généralement moins de 1 000 unités WCU, une seule partition peut gérer la charge d'écriture sans problèmes de partition chaude

Table des employés - Structure de la table de base
employee_id (PK) name numéro_téléphone identifiant_entrepôt job_title date d'embauche type_entité
emp_001 John Smith [« +1-555-0101 »] wh_sea Responsable 15/03/2024 EMPLOYÉ
emp_002 Jane Doe [« +1-555-0102 », « +1-555-0103 »] wh_sea Associé 10-01-2025 EMPLOYÉ
emp_003 Bob Wilson [« +1-555-0104"] wh_pdx Associé 20/06/2025 EMPLOYÉ
emp_004 Alice Brown [« +1-555-0105 »] wh_pdx Superviseur 05/11/2023 EMPLOYÉ
emp_005 Charlie Davis [« +1-555-0106"] wh_sea Associé 01/12/2025 EMPLOYÉ
EmployeeByName GSI - Prise en charge des requêtes relatives aux noms des employés
nom (GSI-PK) identifiant d'employé (GSI-SK) numéro_téléphone identifiant_entrepôt job_title date d'embauche
Alice Brown emp_004 [« +1-555-0105 »] wh_pdx Superviseur 05/11/2023
Bob Wilson emp_003 [« +1-555-0104"] wh_pdx Associé 20/06/2025
Charlie Davis emp_005 [« +1-555-0106"] wh_sea Associé 01/12/2025
Jane Doe emp_002 [« +1-555-0102 », « +1-555-0103 »] wh_sea Associé 10-01-2025
John Smith emp_001 [« +1-555-0101 »] wh_sea Responsable 15/03/2024
EmployeeByWarehouse GSI - Prise en charge des requêtes relatives aux entrepôts
identifiant d'entrepôt (GSI-PK) identifiant d'employé (GSI-SK) name job_title date d'embauche
wh_pdx emp_003 Bob Wilson Associé 20/06/2025
wh_pdx emp_004 Alice Brown Superviseur 05/11/2023
wh_sea emp_001 John Smith Responsable 15/03/2024
wh_sea emp_002 Jane Doe Associé 10-01-2025
wh_sea emp_005 Charlie Davis Associé 01/12/2025
EmployeeByJobTitle GSI - Prise en charge des requêtes relatives aux titres de poste
title du poste (GSI-PK) identifiant d'employé (GSI-SK) name identifiant_entrepôt date d'embauche
Associé emp_002 Jane Doe wh_sea 10-01-2025
Associé emp_003 Bob Wilson wh_pdx 20/06/2025
Associé emp_005 Charlie Davis wh_sea 01/12/2025
Responsable emp_001 John Smith wh_sea 15/03/2024
Superviseur emp_004 Alice Brown wh_pdx 05/11/2023
EmployeeByHireDate GSI - Prise en charge des demandes d'embauche récentes
type_entité (GSI-PK) hire_date (GSI-SK) employee_id name identifiant_entrepôt
EMPLOYÉ 05/11/2023 emp_004 Alice Brown wh_pdx
EMPLOYÉ 15/03/2024 emp_001 John Smith wh_sea
EMPLOYÉ 10-01-2025 emp_002 Jane Doe wh_sea
EMPLOYÉ 20/06/2025 emp_003 Bob Wilson wh_pdx
EMPLOYÉ 01/12/2025 emp_005 Charlie Davis wh_sea

Conception de la table client

La table Customer conserve les informations sur les clients grâce à la dénormalisation stratégique de account_rep_id afin de permettre des requêtes efficaces aux représentants du compte. Ce choix de conception permet de substituer une légère charge de stockage aux performances des requêtes, éliminant ainsi le besoin de joindre les données du client et du représentant du compte.

Le tableau prend en charge plusieurs numéros de téléphone par client à l'aide d'un attribut de liste, ce qui démontre la flexibilité du schéma de DynamoDB. Le GSI unique permet des flux de travail représentatifs des comptes :

  • CustomerByAccountRep GSI - Utilise la projection INCLUDE avec des attributs de nom et d'e-mail pour faciliter la gestion des clients par le représentant commercial sans avoir à récupérer l'intégralité des dossiers clients

Table client - Structure de la table de base
customer_id (PK) name numéro_téléphone e-mail account_rep_id
cust_001 Acme Corporation [« +1-555-1001"] contact@acme.com rep_001
cust_002 TechStart Inc [« +1-555-1002", « +1-555-1003"] info@techstart.com rep_001
cust_003 Négociants mondiaux [« +1-555-1004"] sales@globaltraders.com rep_002
cust_004 BuildRight SARL [« +1-555-1005"] orders@buildright.com rep_002
cust_005 FastShip Co [« +1-555-1006 »] support@fastship.com rep_003
CustomerByAccountRep GSI - Assistance aux demandes des représentants commerciaux
account_rep_id (GSI-PK) identifiant_client (GSI-SK) name e-mail
rep_001 cust_001 Acme Corporation contact@acme.com
rep_001 cust_002 TechStart Inc info@techstart.com
rep_002 cust_003 Négociants mondiaux sales@globaltraders.com
rep_002 cust_004 BuildRight SARL orders@buildright.com
rep_003 cust_005 FastShip Co support@fastship.com

Conception de la table de commande

Le tableau des commandes utilise le partitionnement vertical avec des éléments distincts pour les en-têtes de commande et les articles de commande. Cette conception permet des requêtes efficaces basées sur les produits tout en conservant tous les composants de la commande dans la même partition pour un accès efficace. Chaque commande est composée de plusieurs articles :

  • En-tête de commande - Contient les métadonnées de commande avec PK=ORDER_ID, SK=ORDER_ID

  • Articles de commande - Articles individuels avec PK=ORDER_ID, SK=product_ID, permettant de poser des questions directes sur les produits

Note

Cette approche de partitionnement vertical allie la simplicité des éléments de commande intégrés à une flexibilité accrue des requêtes. Chaque article de commande devient un article DynamoDB distinct, ce qui permet d'effectuer des requêtes efficaces basées sur les produits tout en conservant toutes les données de commande dans la même partition pour une extraction efficace en une seule demande.

Le tableau inclut une dénormalisation stratégique de account_rep_id (reproduit à partir de la table Customer) afin de permettre aux représentants du compte de poser des requêtes directes sans avoir à consulter les clients. Pour les scénarios d'écriture à haut débit, les commandes OPEN incluent le statut et les attributs de partition pour permettre le partitionnement des écritures sur plusieurs partitions.

Quatre GSIs prennent en charge différents modèles de requêtes avec des projections optimisées :

  • OrderByCustomerDate GSI - Utilise la projection INCLUDE avec le résumé des commandes et les détails des articles pour étayer l'historique des commandes des clients grâce au filtrage par plage de dates

  • OpenOrdersByDate GSI (Sparse, Sharded) : utilise une clé de partition à attributs multiples (status + shard) avec 5 partitions pour distribuer 5 000 WPS (écritures par seconde) entre les partitions (1 000 WPS chacune, correspondant à la limite de 1 000 WCU par partition de DynamoDB). Indexe uniquement les commandes OUVERTES (20 % du total), ce qui peut contribuer à réduire les coûts de stockage de GSI. Nécessite des requêtes parallèles sur les 5 partitions avec fusion des résultats côté client

  • OrderByAccountRep GSI - Utilise la projection INCLUDE avec les attributs récapitulatifs des commandes pour prendre en charge les flux de travail des représentants des comptes sans les détails complets des commandes

  • ProductInOrders GSI - Créé à partir d' OrderItem enregistrements (PK=ORDER_ID, SK=product_ID), ce GSI permet de rechercher toutes les commandes contenant un produit spécifique. Utilise la projection INCLUDE avec le contexte de commande (customer_id, order_date, quantity) pour l'analyse de la demande de produits

Tableau des commandes - Structure de la table de base (partitionnement vertical)
PK SK customer_id date_commande status account_rep_id quantity prix partition
ord_001 ord_001 cust_001 15/11/2025 CLOSED rep_001
ord_001 prod_100 5 25,00
ord_002 ord_002 cust_001 20-12-2025 OPEN rep_001 0
ord_002 prod_101 10 15,00
ord_003 ord_003 cust_002 05/01/2021 OPEN rep_001 2
ord_003 prod_100 3 25,00
OrderByCustomerDate GSI - Prise en charge des demandes de commande des clients
identifiant_client (GSI-PK) date_commande (GSI-SK) ID de commande status total_amount articles de commande partition
cust_001 15/11/2025 ord_001 CLOSED 225,00 [{product_id : « prod_100", quantité : 5}]
cust_001 20-12-2025 ord_002 OPEN 150,00 [{product_id : « prod_101", quantité : 10}] 0
cust_002 05/01/2021 ord_003 OPEN 175,00 [{product_id : « prod_100", quantité : 3}] 2
cust_003 10/10/2025 ord_004 CLOSED 250,00 [{product_id : « prod_101", quantité : 5}]
cust_004 03/01/2026/ ord_005 OPEN 200,00 [{product_id : « prod_100", quantité : 20}] 1
OpenOrdersByDate GSI (Sparse, Sharded) : prise en charge des requêtes d'ordre ouvert à haut débit
état (GSI-PK-1) fragment (GSI-PK-2) order_date (SK) ID de commande customer_id account_rep_id articles de commande total_amount
OPEN 0 20-12-2025 ord_002 cust_001 rep_001 [{product_id : « prod_101", quantité : 10}] 150,00
OPEN 1 03/01/2026/ ord_005 cust_004 rep_002 [{product_id : « prod_100", quantité : 20}] 200,00
OPEN 2 05/01/2021 ord_003 cust_002 rep_001 [{product_id : « prod_100", quantité : 3}] 175,00
OrderByAccountRep GSI - Prise en charge des demandes des représentants des comptes
account_rep_id (GSI-PK) date_commande (GSI-SK) ID de commande customer_id status total_amount
rep_001 15/11/2025 ord_001 cust_001 CLOSED 225,00
rep_001 20-12-2025 ord_002 cust_001 OPEN 150,00
rep_001 05/01/2021 ord_003 cust_002 OPEN 175,00
rep_002 10/10/2025 ord_004 cust_003 CLOSED 250,00
rep_002 03/01/2026/ ord_005 cust_004 OPEN 200,00
ProductInOrders GSI - Prise en charge des demandes de commande de produits
identifiant du produit (GSI-PK) ID de commande (GSI-SK) customer_id date_commande quantity
prod_100 ord_001 cust_001 15/11/2025 5
prod_100 ord_003 cust_002 05/01/2021 3
prod_101 ord_002 cust_001 20-12-2025 10

Conception de la table des produits

La table Product utilise le modèle de collecte d'articles pour stocker à la fois les métadonnées du produit et les données d'inventaire dans la même partition. Cette conception tire parti de la relation d'identification entre les produits et le stock : l'inventaire ne peut exister sans un produit parent. L'utilisation de PK=Product_ID avec SK=Product_ID pour les métadonnées du produit et SK=Warehouse_ID pour les articles en stock élimine le besoin d'une table d'inventaire et d'un GSI séparés, réduisant ainsi les coûts d'environ 50 %.

Ce modèle permet des requêtes efficaces à la fois pour l'inventaire individuel de l'entrepôt (GetItem avec clé composite) et pour l'ensemble de l'inventaire de l'entrepôt pour un produit (requête sur la clé de partition). L'attribut total_inventory de l'élément de métadonnées du produit fournit une agrégation dénormalisée pour des recherches rapides de l'inventaire total.

Tableau des produits - Structure de la table de base (modèle de collection d'articles)
product_id (PK) warehouse_id (SK) product_name category prix_unitaire quantité_inventaire inventaire_total
prod_100 prod_100 Widget A Matériel 25,00 500
prod_100 wh_sea 200
prod_100 wh_pdx 150
prod_100 wh_atl 150
prod_101 prod_101 Gadget B Électronique 50,00 300
prod_101 wh_sea 100
prod_101 wh_pdx 200

Chaque table est conçue avec des index secondaires globaux spécifiques (GSIs) pour prendre en charge efficacement les modèles d'accès requis. La conception utilise des principes axés sur les agrégats avec une dénormalisation stratégique et une indexation éparse pour optimiser à la fois les performances et les coûts.

Les principales optimisations de conception incluent :

  • GSI clairsemé : indexe OpenOrdersByDate uniquement les commandes OUVERTES (20 % du total), ce qui peut contribuer à réduire les coûts de stockage du GSI

  • Modèle de collecte d'articles - La table des produits stocke l'inventaire en utilisant PK=product_ID, SK=Warehouse_ID pour éliminer une table d'inventaire séparée

  • Ordre et OrderItems agrégation - Intégré en un seul article grâce à une corrélation d'accès de 100 %

  • Dénormalisation stratégique : account_rep_id est dupliqué dans la table des commandes pour des requêtes efficaces

Enfin, vous pouvez réexaminer les modèles d’accès définis précédemment. Le tableau suivant montre comment chaque modèle d'accès est pris en charge efficacement à l'aide de la conception multi-tables avec Strategic GSIs. Chaque modèle utilise des recherches de touches directes ou des requêtes GSI uniques, ce qui permet d'éviter des analyses coûteuses et de fournir des performances constantes à toutes les échelles.

Nº de série Modèles d’accès Conditions de requête

1

Rechercher les détails des employés par ID d’employé

Tableau des employés : GetItem (employee_id="emp_001")

2

Interroger les détails des employés par nom d’employé

EmployeeByName GSI : Requête (name="John Smith »)

3

Trouver le (s) numéro (s) de téléphone d'un employé

Tableau des employés : GetItem (employee_id="emp_001")

4

Trouver le (s) numéro (s) de téléphone d'un client

Table des clients : GetItem (customer_id="cust_001")

5

Obtenez des commandes pour les clients dans un intervalle de dates

OrderByCustomerDate GSI : requête (customer_id="cust_001", order_date COMPRISE ENTRE « 2025-01-01" ET « 2025-12-31")

6

Afficher toutes les commandes ouvertes dans un intervalle de dates

OpenOrdersByDate GSI : Interrogez 5 partitions en parallèle avec un PK à attributs multiples (status="open » + shard=0-4), SK=ORDER_DATE ENTRE « 2025-01-01 » ET « 2025-12-31 », résultats de fusion

7

Voir tous les employés embauchés récemment

EmployeeByHireDate GSI : Requête (Entity_Type="Employé », hire_date >= « 2025-01-01")

8

Trouvez tous les employés de Warehouse

EmployeeByWarehouse GSI : Requête (warehouse_id="wh_sea »)

9

Obtenez tous les articles en commande pour le produit

ProductInOrders GSI : Requête (product_id="prod_100")

10

Obtenez des stocks de produits dans tous les entrepôts

Tableau des produits : requête (product_id="prod_100")

11

Attirez des clients par le biais d'un représentant commercial

CustomerByAccountRep GSI : Requête (account_rep_id="rep_001")

12

Recevez les commandes par le représentant du compte

OrderByAccountRep GSI : Requête (account_rep_id="rep_001")

13

Trouvez des employés avec le titre du poste

EmployeeByJobTitle GSI : Requête (job_title="Manager »)

14

Obtenez l'inventaire par produit et par entrepôt

Tableau des produits : GetItem (product_id="prod_100", warehouse_id="wh_sea »)

15

Obtenez l'inventaire total des produits

Tableau des produits : GetItem (product_id="prod_100", warehouse_id="prod_100")