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
| 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É |
| 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 |
| 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 |
| 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 |
| 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
| customer_id (PK) | name | numéro_téléphone | 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 |
| account_rep_id (GSI-PK) | identifiant_client (GSI-SK) | name | |
|---|---|---|---|
| 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
| 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 |
| 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 |
| é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 |
| 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 |
| 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.
| 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") |