Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🍃 Amazon DynamoDB (NoSQL Key-Value & Document Store)

Guide IDEO-Lab : Modélisation de tables, partitionnement, capacité (RCU/WCU), indexes (LSI/GSI), Streams, Backups & Global Tables.

1.1

Concept : NoSQL Key-Value / Document

DynamoDB est un datastore managé, clé-valeur et document, conçu pour les charges massives à faible latence.

NoSQL Key-Value
1.2

Concept : Table, Item, Attribut

Une table contient des items (lignes), chaque item étant un document JSON flexible (attributs libres).

Table Item
1.3

Concept : Primary Key (PK/SK)

Partition key seule ou couple (PK, Sort Key) pour organiser les items par partition et par ordre.

Partition Key Sort Key
2.1

Capacité : RCU/WCU

CapacitĂ© de lecture (RCU) et d’écriture (WCU), provisionnĂ©e ou Ă  la demande.

RCU WCU
2.2

Modes : On-Demand vs Provisioned

Choix entre facturation Ă  la requĂȘte ou capacitĂ© fixe avec autoscaling.

On-Demand Provisioned
2.3

Throttling & Hot Partitions

Quand une partition reçoit trop de trafic, les requĂȘtes sont throttlĂ©es (HTTP 400/ProvisionedThroughputExceeded).

Throttling Hot Partition
3.1

Index : Local Secondary Index (LSI)

Index sur la mĂȘme partition key, avec une seconde sort key pour un autre ordre de tri.

LSI Same PK
3.2

Index : Global Secondary Index (GSI)

Index avec sa propre clĂ© de partition/sort, permettant d’autres patterns de requĂȘtes.

GSI Alternate PK
3.3

Single-Table Design

Regrouper plusieurs “entitĂ©s” dans une seule table, optimisĂ©e pour les patterns de requĂȘte.

Single Table Access Patterns
4.1

DynamoDB Streams & Lambda

Flux de changements (insert/update/delete) pour dĂ©clencher des Lambdas et alimenter d’autres systĂšmes.

Streams Lambda
4.2

Backups & Point-in-Time Recovery

Backups complets Ă  la demande et restauration Ă  la seconde prĂšs.

Backup PITR
5.1

Global Tables (Multi-Région)

Réplication active/active entre régions pour applications globales à faible latence.

Multi-Region Active-Active
15. SynthĂšse : Checklist & Bonnes Pratiques
Les 5 Piliers de la réussite DynamoDB

Si vous ne respectez pas ces rÚgles, votre projet coûtera cher ou sera lent.

1. Access Pattern First

Ne crĂ©ez jamais une table sans savoir quelles requĂȘtes elle va servir.
"Dites-moi vos questions, je vous dirai votre schéma."

2. Cardinalité de la PK

La Partition Key doit avoir le plus de valeurs uniques possible (Millions d'IDs > 3 Status). C'est la clé de la scalabilité infinie.

3. Évitez les Scans

Un Scan est un échec de modélisation (sauf pour l'export/migration). Utilisez toujours GetItem ou Query.

4. Pré-calculer (Pre-Join)

DynamoDB ne fait pas de calcul complexe Ă  la lecture. Stockez la donnĂ©e telle qu'elle doit ĂȘtre lue (Single Table Design).

5. Instrumenter le Throttling

L'application cliente DOIT gérer les "Retries" et l'"Exponential Backoff".

Checklist avant mise en Production
CatégoriePoint de contrÎleRecommandation
DesignPK & SKLa PK distribue-t-elle bien la charge ? La SK permet-elle les requĂȘtes de plage ?
Index (GSI)Avez-vous limité les projections (KEYS_ONLY/INCLUDE) pour réduire les coûts ?
Item SizeLes items sont-ils < 400KB ? Les gros blobs sont-ils dans S3 ?
OpsCapacity ModeProvisioned + AutoScaling pour la Prod stable. On-Demand pour les pics imprévisibles.
BackupPITR activé sur la Prod ? Plan de backup AWS Backup configuré ?
TTLLe TTL est-il activé pour nettoyer les données obsolÚtes (Logs, Sessions) ?
SécuritéIAMLes rÎles sont-ils restreints (pas de dynamodb:*) ? Chiffrement KMS activé ?
Architecture : DynamoDB au centre de tout

DynamoDB est souvent le "Hub" de stockage des architectures Serverless.

Patterns d'Intégration
  • API Gateway + Lambda : Le backend standard. Lambda lit/Ă©crit via le SDK.
  • DynamoDB Streams + Lambda : Architecture Ă©vĂ©nementielle (CDC). DĂ©clenche un traitement Ă  chaque insert.
  • DynamoDB + OpenSearch : Pour la recherche textuelle floue (via Streams).
  • S3 + Athena : Pour l'analytique (via Export Table).
Quand sortir de DynamoDB ?

Si vous commencez Ă  tordre le modĂšle pour faire :

  • Des agrĂ©gations complexes (SUM, AVG sur 1M lignes).
  • Des recherches "LIKE %text%".
  • Des graphes de relations profonds.

STOP ! Utilisez Redshift, OpenSearch ou Neptune.

L'outil indispensable : NoSQL Workbench

Ne modélisez pas sur un tableau blanc ou Excel. Utilisez l'outil officiel AWS (Gratuit, Mac/Win/Linux).

Fonctionnalités
  • Data Modeler : Dessiner les tables, GSI et attributs.
  • Visualizer : Voir comment les donnĂ©es s'organisent (Item Collections).
  • Capacity Calculator : Estimer le coĂ»t WCU/RCU.
  • Code Generator : GĂ©nĂšre le code Python/Node/Java pour crĂ©er la table.
Autres Outils
  • Dynobase : Client GUI tiers (Payant mais trĂšs puissant pour les devs).
  • PartiQL : Langage SQL-like dans la console AWS pour tester des requĂȘtes rapides (attention, ça reste du NoSQL dessous !).
Résumé des Anti-Patterns (Ce qu'il ne faut pas faire)
ErreurConséquenceCorrection
Utiliser ScanLenteur extrĂȘme, CoĂ»t explosif.CrĂ©er un GSI adaptĂ©.
1 Table par EntitĂ©Multiples requĂȘtes rĂ©seaux (N+1).Single Table Design (Pre-join).
Hot Keys (Date/Status)Throttling sur 1 partition.Ajouter de l'entropie (Sharding) ou changer de clé.
GSI sur-projectionCoût de stockage x2 ou x3.Utiliser KEYS_ONLY ou INCLUDE.
14. Comparatif : Choisir la bonne Database
Le Choc des Mondes : Relationnel vs NoSQL

La question n'est pas "Lequel est le meilleur ?", mais "Avez-vous besoin de JOINs ou de Scale ?"

CritĂšreRDS / Aurora (SQL)DynamoDB (NoSQL)
ModÚleRelationnel normalisé. Jointures complexes (JOIN). Intégrité référentielle (FK).Clé-Valeur dénormalisé. Pas de JOIN. Données pré-assemblées (Item Collections).
ScalingVertical. On augmente la taille de l'instance (CPU/RAM).
Limite : Max 128TB (Aurora) et limite de connexions TCP.
Horizontal. On ajoute des partitions.
Limite : Aucune (Infinie). Performance constante Ă  100 TB.
ConnexionsStateful (TCP). Nécessite un Proxy pour les Lambdas (sinon "Too many connections").Stateless (HTTPS). Idéal pour le Serverless (Lambda peut ouvrir 10k connexions sans souci).
RequĂȘtesAd-hoc. SELECT * WHERE age > 20 AND city = 'Paris' (Flexible).Par ClĂ©. GetItem(PK) ou Query(PK+SK). Tout autre filtre est un Scan (Lent).
Verdict : Utilisez RDS si votre modÚle de données est complexe, relationnel et évolutif (ERP, CMS). Utilisez DynamoDB pour les gros volumes, les apps temps réel et le Serverless.
La Guerre du JSON : DynamoDB vs DocumentDB

Les deux stockent du JSON. Mais la philosophie est radicalement différente.

DynamoDB (Propriétaire AWS)
  • Vrai Serverless : 0 instance Ă  gĂ©rer. Scale Ă  0.
  • Rigueur : Vous oblige Ă  penser vos "Access Patterns" avant de coder.
  • Index : LimitĂ© Ă  20 GSI. CoĂ»t Ă  l'Ă©criture.
  • API : PropriĂ©taire AWS (PutItem, GetItem).
DocumentDB (Mongo Compatible)
  • Cluster Based : Vous payez des instances (min ~50$/mois) mĂȘme Ă  vide (sauf vInstance).
  • FlexibilitĂ© : Vous pouvez indexer n'importe quel champ JSON Ă  la volĂ©e. RequĂȘtes d'agrĂ©gation puissantes.
  • API : Compatible MongoDB (Migration facile).
Matrice de Décision

Migration Lift & Shift d'un MongoDB existant ? -> DocumentDB.
Nouveau projet Cloud-Native optimisé ? -> DynamoDB.

Vitesse vs Durabilité : Le Cache et la Base

DynamoDB est rapide (ms), mais Redis est ultra-rapide (”s). Sont-ils concurrents ?

FeatureElastiCache (Redis/Memcached)DynamoDB (+ DAX)
LatenceMicrosecondes. (In-Memory).Millisecondes. (SSD).
(Microsecondes avec DAX).
DurabilitéVolatile (RAM). Persistence optionnelle mais pas garantie à 100% sur crash.Durable (3-AZ). Donnée stockée sur disque. Safe.
ModÚle de CoûtProvisioned (Instances de Cache).On-Demand ou Provisioned.
Quand utiliser Redis ?

Leaderboards temps réel, Compteurs transitoires, Pub/Sub, Session Store (si perte tolérée). Données que l'on peut recalculer.

Quand utiliser DynamoDB (ou DAX) ?

Paniers d'achat, Profils utilisateurs, Historique de commandes. Données qui doivent survivre à un redémarrage.

⛔ Quand NE PAS utiliser DynamoDB

DynamoDB n'est pas un marteau pour tous les clous. Voici les cas oĂč vous allez souffrir.

BesoinPourquoi DynamoDB échoue ?Alternative AWS
Analytique / BI
(GROUP BY, AVG, SUM)
Nécessite de scanner toute la table. Lent et coûteux. Pas de moteur d'agrégation natif.Redshift (Data Warehouse)
Athena (Sur S3)
Recherche Full-Text
("Contient 'chat'")
DynamoDB ne supporte que begins_with. Pas de recherche floue ou de tokenisation.OpenSearch (Elasticsearch)
CloudSearch
Gros Blobs
(Images, PDF > 400KB)
Limite dure de 400KB par item. Coût de stockage élevé (0.25$/GB vs 0.023$/GB pour S3).S3 (Stockez le lien dans Dynamo)
Graphes Complexes
(Réseaux sociaux, Fraude)
Parcourir des relations N Ă  N profondes demande trop de requĂȘtes successives.Neptune (Graph DB)
Données trÚs froides
(Archivage 7 ans)
Le stockage DynamoDB est performant mais cher pour de l'archive morte.S3 Glacier (Via Export S3 ou TTL)
13. Tarification & Stratégies FinOps
OĂč part votre argent ?

DynamoDB a plusieurs compteurs qui tournent en parallĂšle.

ComposanteMode On-DemandMode ProvisionedImpact
Lecture/ÉcriturePayĂ© au Million de requĂȘtes (RRU/WRU).
Cher à l'unité.
Payé à l'heure par capacité (RCU/WCU).
Pas cher si bien utilisé.
Majeur (70%)
Stockage0.25$ / GB / mois.0.25$ / GB / mois.Moyen (20%)
Backup (PITR)~0.20$ / GB / mois.~0.20$ / GB / mois.Faible (sauf Huge Data).
StreamsGratuit (RCU) pour 2 consumers.Gratuit (RCU) pour 2 consumers.Nul.
Global TablesReplicated WRU (xN Régions).Replicated WCU (xN Régions).Critique (Multiplicateur)
Réduire la facture sans réduire la perf
1. Reserved Capacity (Le -50% facile)

Si vous ĂȘtes en mode Provisioned et que votre trafic a un "plancher" stable (baseline), achetez de la capacitĂ© rĂ©servĂ©e.
Gain : 50% à 77% de réduction sur les WCU/RCU.

2. TTL (Le Nettoyeur)

Ne payez pas pour stocker des vieux logs ou des sessions expirées.
Activez le TTL sur un attribut expire_at. La suppression est gratuite (ne consomme pas de WCU).

3. Compresser les Items
Item A (JSON pur) : 2.5 KB -> Coût : 3 WCU Item B (Gzippé) : 0.8 KB -> Coût : 1 WCU

DynamoDB facture par bloc de 1 KB.
Utilisez des noms d'attributs courts ("d" vs "description") ou compressez les gros textes en binaire cÎté client.

Quel mode choisir selon votre Business ?
Scénario A : SaaS B2B (Stable)

Profil : Trafic constant de 9h Ă  18h. Peu de trafic la nuit. Pas de pics soudains.

  • Choix : Provisioned + Autoscaling.
  • Pourquoi : L'autoscaling a le temps de suivre la courbe douce du matin et du soir. Le coĂ»t unitaire est le plus bas.
  • Bonus : Acheter des rĂ©servations pour couvrir le trafic de base.
ScĂ©nario B : App ÉvĂ©nementielle (Bursty)

Profil : Rien pendant 1 semaine, puis 1 Million de users en 10 minutes (Vote TV, Flash Sale).

  • Choix : On-Demand.
  • Pourquoi : L'autoscaling est trop lent (met 10-30 min Ă  scaler). On-Demand absorbe le pic instantanĂ©ment.
  • Calcul : Payer 1.25$ le million de requĂȘtes pendant 10 min est moins cher que de provisionner 50k WCU pendant 1h.
Scénario C : App Mobile (Cycle Jour/Nuit)

Profil : Trafic sinusoïdal trÚs marqué.

  • Choix : Provisioned + Autoscaling Agressif.
  • RĂ©glage : Mettre la cible (Target Utilization) Ă  80% pour scaler vite, et rĂ©duire le scale-in cooldown pour redescendre vite la nuit.
Les piÚges à éviter
  • Les Scans : Un dĂ©veloppeur fait un Scan complet de la table toutes les 5 minutes pour compter les users.
    -> Facture explosive car il lit TOUTE la table Ă  chaque fois.
    -> Solution : Utiliser DynamoDB Streams + Lambda pour incrémenter un compteur.
  • GSI Inutiles : Vous ajoutez un index "au cas oĂč".
    -> Vous payez le stockage ET les Ă©critures (WCU) pour cet index, mĂȘme si personne ne le lit.
  • RĂ©seau NAT Gateway : Vos Lambdas dans un VPC privĂ© accĂšdent Ă  DynamoDB via la NAT Gateway.
    -> Vous payez le traitement des données NAT (0.045$/GB).
    -> Solution : Utiliser un VPC Gateway Endpoint (Gratuit).
9. Durabilité & Disaster Recovery (DR)
Pourquoi DynamoDB est "increvable" ?

Avant mĂȘme de parler de backups, comprenez comment la donnĂ©e est stockĂ©e.

Réplication Synchrone Multi-AZ
  • Chaque Ă©criture (PutItem) est rĂ©pliquĂ©e de maniĂšre synchrone sur des disques SSD situĂ©s dans 3 Zones de DisponibilitĂ© (AZ) physiquement distinctes.
  • DynamoDB confirme l'Ă©criture (HTTP 200) seulement quand la donnĂ©e est sĂ©curisĂ©e sur au moins 2 zones.
  • RĂ©sultat : Si un Datacenter brĂ»le, vous ne perdez aucune donnĂ©e et la base continue de rĂ©pondre (High Availability).
SLA & Durabilité
Durabilité99.999999999% (11 nines).
Disponibilité99.99% (Standard) ou 99.999% (Global Tables).
Snapshots Complets : À la demande & AWS Backup

Utile pour l'archivage long terme, la conformité légale ou avant une mise en prod risquée.

Option A : DynamoDB Native Backup
  • Vitesse : InstantanĂ© (ZĂ©ro impact sur la prod).
  • Gestion : Au niveau de la table.
  • RĂ©tention : Manuelle (on supprime quand on veut).
Option B : AWS Backup (Enterprise)
  • CentralisĂ© : GĂšre DynamoDB, RDS, EBS, S3 au mĂȘme endroit.
  • Lifecycle : Passage automatique en Cold Storage (Archive) pour rĂ©duire les coĂ»ts aprĂšs X jours.
  • Vault Lock : Protection WORM contre les Ransomwares (Interdiction de supprimer les backups, mĂȘme pour l'admin root).
PITR (Point-in-Time Recovery) : Le "Ctrl+Z" ultime

ProtÚge contre les erreurs humaines ("Oups, j'ai supprimé la table" ou "Mon script a corrompu les données").

FonctionnalitéDétail Technique
PrincipeEnregistre chaque modification en continu (Log stream).
GranularitéRestauration à la seconde prÚs.
FenĂȘtreLes 35 derniers jours (glissant). Au-delĂ , c'est perdu (sauf si snapshot).
CoĂ»tPayant au GB/mois. (Doit ĂȘtre activĂ© explicitement).
Conseil : Activez PITR systématiquement sur toutes les tables de Production. C'est votre seule assurance vie contre une corruption logique.
⚠ Architecture : Le PiĂšge de la Restauration

Il est IMPOSSIBLE de restaurer une table "sur place".

Toute restauration (PITR ou Snapshot) crée obligatoirement une NOUVELLE TABLE avec un nouveau nom (ou un nouvel ARN).

Table Actuelle : "Users" (Corrompue) Restoration -> Crée "Users_Restored_2024"
Impact sur le RTO (Recovery Time Objective)

Votre procédure de DR doit prévoir le basculement de l'application :

  1. Lancer le Restore (Temps : ~20min Ă  plusieurs heures selon la taille).
  2. Option 1 (DNS/Config) : Changer la variable d'env DYNAMODB_TABLE_NAME dans les Lambdas/EC2 pour pointer vers la nouvelle table.
  3. Option 2 (Route53) : Si vous utilisez Global Tables, faire un failover vers une autre région saine.

Note : La nouvelle table n'a PAS les alarmes, les tags, ni les politiques IAM de l'ancienne. Utilisez l'IaC (Terraform/CDK) pour réappliquer la config.

Export to S3 : Analytics sans Impact

Comment faire des GROUP BY ou des analyses BI sur vos données NoSQL ?

La Méthode "Export Table"
  • ZĂ©ro RCU : L'export utilise une copie interne. Votre prod ne ralentit pas d'une milliseconde.
  • Formats : DynamoDB JSON ou ION (binaire).
  • Destination : S3 (Data Lake).
Intégration Athena / Glue

Une fois les données dans S3 :
1. Crawler Glue catalogue les données.
2. Athena permet de faire du SQL standard dessus.
Idéal pour les rapports mensuels ou l'audit.

8. Sécurité : IAM, Chiffrement & Isolation
IAM : L'Authentification & Autorisation

DynamoDB n'a pas de "login/password". Tout accÚs se fait via des IAM Roles (pour les services) ou IAM Users (pour les humains, à éviter).

Principe de Moindre PrivilĂšge

Ne donnez jamais AmazonDynamoDBFullAccess. Soyez chirurgical.

ActionDescriptionRisque
dynamodb:PutItemÉcrire/Ecraser un item.Peut Ă©craser des donnĂ©es critiques.
dynamodb:GetItemLire un item par sa clé.Faible (si ciblé).
dynamodb:ScanLire TOUTE la table.ÉlevĂ©. Fuite de donnĂ©es massive + CoĂ»t $$$.
dynamodb:DeleteTableSupprimer la table.Critique. À rĂ©server aux admins.
Resource ARN

Restreignez toujours l'accÚs à des tables spécifiques (et leurs index).

"Resource": [ "arn:aws:dynamodb:us-east-1:123:table/Users", "arn:aws:dynamodb:us-east-1:123:table/Users/index/*" ]
Fine-Grained Access Control (FGAC) : La "Row-Level Security"

Comment autoriser un utilisateur mobile à accéder uniquement à ses propres données dans une table partagée ?
Réponse : Les Conditions IAM.

1. LeadingKeys (Sécurité Ligne)

Restreint l'accĂšs aux items dont la Partition Key correspond Ă  une variable (ex: ID de l'utilisateur Cognito).

2. Attributes (Sécurité Colonne)

Interdit la lecture de certains attributs (ex: voir le profil mais pas le salary).

Exemple de Policy (SaaS Multi-Tenant)
                            {
                            "Effect": "Allow",
                            "Action": [ "dynamodb:GetItem", "dynamodb:Query" ],
                            "Resource": "arn:aws:dynamodb:region:id:table/AppTable",
                            "Condition": {
                            "ForAllValues:StringEquals": {
                            "dynamodb:LeadingKeys": ["${www.amazon.com:user_id}"],
                            "dynamodb:Attributes": ["Name", "Email", "Orders"]
                            }
                            }
                            }

Traduction : "L'utilisateur ne peut lire que les lignes oĂč PK = Son ID, et ne peut voir que les colonnes Nom, Email et Commandes."

Chiffrement au Repos (Encryption at Rest)

Toutes les tables DynamoDB sont chiffrées. Vous ne pouvez pas le désactiver. Mais vous pouvez choisir la clé.

Type de Clé (KMS)CoûtContrÎleUsage
AWS Owned Key
(Par défaut)
GratuitAucun. AWS gĂšre la rotation.Projets standards, Dev, Tests.
AWS Managed Key
(aws/dynamodb)
Gratuit*Visible dans IAM. Rotation auto tous les ans.Besoin de voir la clé dans les logs CloudTrail.
Customer Managed Key (CMK)Payant
1$/mois + appels API.
Total. Vous gérez la rotation, les droits d'accÚs, la suppression.Obligatoire pour :
- Cross-Account Access.
- Données sensibles (PCI-DSS, Santé).
In-Transit : Le chiffrement en transit (TLS) est obligatoire et automatique. Vous ne pouvez pas accéder à DynamoDB en HTTP clair.
Stratégies d'Isolation : "Blast Radius"

Comment empĂȘcher qu'un script de test supprime la base de prod ?

Niveau 1 : Naming (Faible)

Tables Prod_Users et Dev_Users dans le mĂȘme compte.
Risque : Erreur humaine élevée (oubli du préfixe dans le code). Quotas partagés (le load test en Dev throttle la Prod).

Niveau 2 : Multi-Account (Fort)

Un compte AWS Production et un compte Staging.
Avantage : Isolation totale (Sécurité et Quotas). Impossible de supprimer la prod par accident avec des credentials de dev.

VPC Endpoints (Réseau)

Par défaut, DynamoDB est accessible via Internet public (sécurisé par IAM).
Pour une sécurité maximale, utilisez un VPC Gateway Endpoint.

// VPC Endpoint Policy : N'autoriser que le trafic venant de MON VPC { "Effect": "Deny", "Principal": "*", "Action": "dynamodb:*", "Resource": "*", "Condition": { "StringNotEquals": { "aws:SourceVpc": "vpc-12345678" } } }
Chiffrement CÎté Client (Banking/Santé)

MĂȘme avec KMS (Server-Side), les admins AWS ou les admins de votre compte *pourraient* thĂ©oriquement voir les donnĂ©es s'ils ont les droits.
Pour une confidentialité absolue (Zero Trust), chiffrez la donnée avant de l'envoyer.

DynamoDB Encryption Client

Une librairie AWS open-source.

  • Fonctionnement : Chiffre les valeurs des attributs (ex: le numĂ©ro de carte bleue) mais laisse la ClĂ© Primaire en clair (pour permettre le routing).
  • Transparence : Le SDK dĂ©chiffre automatiquement Ă  la lecture si l'app a la clĂ©.
  • SĂ©curitĂ© : La donnĂ©e stockĂ©e sur DynamoDB est un blob binaire illisible pour quiconque n'a pas la clĂ© privĂ©e.
7. Intégrité des Données : ACID & Concurrence
Strongly vs Eventually Consistent : Le compromis

DynamoDB réplique vos données sur 3 Zones de Disponibilité (AZ). La vitesse de la lumiÚre n'étant pas infinie, il y a un délai de propagation.

ModeComportementImpact (Coût & Perf)
Eventually Consistent
(Par Défaut)
Vous lisez sur 1 seule copie (au hasard).
Risque : Si une écriture a eu lieu il y a 100ms, vous pourriez recevoir l'ancienne valeur (Stale Data).
Rapide Latence la plus faible.
0.5 RCU par 4KB (Moitié prix !).
Strongly Consistent
(Optionnel)
DynamoDB force un quorum de lecture. Il garantit que vous recevez la derniÚre écriture validée (ACK).Latence + élevée (Réseau inter-AZ).
1 RCU par 4KB (Plein tarif).
Astuce : Utilisez toujours Eventual sauf si la logique mĂ©tier l'interdit formellement (ex: vĂ©rifier un stock avant paiement, empĂȘcher une double rĂ©servation). Pour un feed social, Eventual suffit.
Transactions ACID (Multi-Item / Multi-Table)

Depuis 2018, DynamoDB n'est plus "juste" NoSQL. Il supporte des transactions complexes "Tout ou Rien".

Cas d'usage : Virement Bancaire

Je dois dĂ©biter Alice (-100€) ET crĂ©diter Bob (+100€).
Si l'un échoue, l'autre ne doit pas se faire.

TransactWriteItems([ { Update: { Key: { ID: "Alice" }, UpdateExpression: "SET Solde = Solde - 100", ConditionExpression: "Solde >= 100" // Check Solde } }, { Update: { Key: { ID: "Bob" }, UpdateExpression: "SET Solde = Solde + 100" } } ])
Le Prix de la Sécurité

Les transactions utilisent un protocole de validation en 2 phases (2PC).

Coût : x2
1 Écriture Transactionnelle = 2 WCUs.
1 Lecture Transactionnelle = 2 RCUs.

Le ProblĂšme du "Lost Update"

Alice lit un document (v1). Bob lit le mĂȘme document (v1). Alice sauvegarde (v2). Bob sauvegarde (v2).
Résultat : Les modifications d'Alice sont écrasées par Bob.

Solution : Optimistic Locking avec numéro de version
  1. Ajouter un attribut version (nombre) Ă  chaque item.
  2. À chaque lecture, rĂ©cupĂ©rer la version actuelle.
  3. À chaque Ă©criture, envoyer la version lue et demander d'incrĂ©menter.
// Bob essaie de sauvegarder UpdateItem({ Key: { ID: "Doc1" }, UpdateExpression: "SET content = :data, version = version + :inc", ConditionExpression: "version = :v_lue", // LA PROTECTION ExpressionAttributeValues: { ":data": "Nouveau contenu de Bob", ":inc": 1, ":v_lue": 1 // Bob a lu la v1 } }) // Si Alice est passée avant, la version en base est déjà 2. // La condition échoue -> ConditionalCheckFailedException.
Condition Expressions : La logique au niveau stockage

Ne faites pas "Read-Then-Write" dans votre code (lent et risqué). Envoyez la condition à DynamoDB.

PatternSyntaxeUsage
CrĂ©ation Uniqueattribute_not_exists(PK)EmpĂȘche PutItem d'Ă©craser un item existant. Utile pour "CrĂ©er un compte" (Email unique).
Stock suffisantStock >= :qtyVérifie qu'il y a assez de produits avant de décrémenter.
AppartenanceOwnerID = :meSécurité : Vérifie que je suis bien le propriétaire de l'item avant de le modifier/supprimer.
Validationcontains(Roles, :role)Vérifie si une chaßne existe dans un Set ou une Liste.

Note : Si la condition échoue, vous ne payez que 1 WCU (coût de vérification), pas le coût de l'écriture complÚte.

Idempotence : Gérer les pannes réseaux

Si vous envoyez une requĂȘte TransactWrite et que vous avez un timeout rĂ©seau (pas de rĂ©ponse), l'Ă©criture a-t-elle rĂ©ussi ? Vous ne savez pas.

Si vous réessayez (Retry), vous risquez de débiter le client deux fois !

ClientRequestToken

DynamoDB supporte un token d'idempotence pour les transactions.

  • GĂ©nĂ©rez un UUID unique pour chaque transaction mĂ©tier.
  • Passez-le dans ClientRequestToken.
  • Si vous relancez la mĂȘme requĂȘte avec le mĂȘme token (dans les 10 min), DynamoDB renvoie le rĂ©sultat de la 1Ăšre rĂ©ussite sans rĂ©-exĂ©cuter (et sans re-facturer).
TransactWriteItems({ ClientRequestToken: "transaction-uuid-1234", TransactItems: [ ... ] })
4. Modélisation : Access Patterns & Single-Table
L'Inversion de ContrĂŽle : Design from Queries

En SQL, on crĂ©e les tables (Data First) et on Ă©crit les requĂȘtes aprĂšs. En DynamoDB, c'est l'inverse. Si vous ne connaissez pas vos requĂȘtes, vous ne pouvez pas crĂ©er la table.

Le Workflow de Design
  1. Lister les Entités : User, Order, Product.
  2. Lister les Access Patterns : "Je veux voir les commandes d'un user", "Je veux voir le détail d'une commande".
  3. Définir les Clés : Choisir PK et SK pour satisfaire ces demandes.
  4. Créer la Table : Seulement à la fin.
La "Rule of Thumb"

"Si votre application a besoin de faire 2 requĂȘtes DynamoDB pour afficher une seule vue (Page Web), votre modĂšle est probablement sub-optimal."
Objectif : 1 Vue = 1 RequĂȘte (Pre-Joining).

Structure Single-Table : Noms Génériques

Pour stocker des Users et des Produits dans la mĂȘme table, il faut abstraire les noms de colonnes.

AttributTypeDescription & RĂŽle
PKStringPartition Key. Contient l'ID principal (ex: `USER#123`, `ORDER#456`).
SKStringSort Key. Définit le type de donnée ou le tri (ex: `METADATA`, `ITEM#001`).
TypeString(Optionnel) Permet de filtrer cÎté application ou pour l'export Analytics (ex: "User", "Order").
GSI1PKStringClé de partition pour le 1er Index Global (Overloading).
GSI1SKStringClé de tri pour le 1er Index Global.
Astuce : Utilisez toujours un séparateur (#) dans vos clés pour faciliter le parsing cÎté client (ex: split('#')[1]).
Pattern : Relation 1-N (PĂšre-Fils)

Le cas classique E-Commerce : Un Client a des Commandes, qui ont des Paiements.

Table : Données stockées
PKSKDataAccess Pattern
USER#101PROFILE{ Name: "Alice" }Get Profile
USER#101ORDER#2023-01-01{ Total: 50€ }Get Order A
USER#101ORDER#2023-02-15{ Total: 120€ }Get Order B
USER#101PAYMENT#2023-02-15{ Status: "OK" }Get Payment B
RequĂȘtes Magiques
  • Tout rĂ©cupĂ©rer (User + Orders + Payments) : Query(PK="USER#101").
  • Juste les commandes : Query(PK="USER#101", SK BEGINS_WITH("ORDER#")).
  • Commandes de 2023 : Query(PK="USER#101", SK BEGINS_WITH("ORDER#2023")).
Pattern : Séries Temporelles (Logs, Feed)

Objectif : Afficher les 10 derniers événements d'un capteur IoT ou d'un réseau social.

Structure
  • PK : DEVICE#123 ou USER_FEED#456.
  • SK : Timestamp ISO8601 (ex: 2023-10-27T10:00:00Z).
La RequĂȘte "Derniers Items"
Params = { TableName: "MyTable", KeyConditionExpression: "PK = :pk", ScanIndexForward: false, // INVERSE L'ORDRE (DESC) Limit: 10 }
Le PiĂšge du Hot Partition

Si vous utilisez juste la date (ex: 2023-10-27) en PK pour grouper tous les logs du monde, vous créez une Hot Partition.
Gardez une PK distribuée (ex: AppID ou ShardID).

Pattern : Adjacency List (Many-to-Many)

Exemple : Des Étudiants s'inscrivent à des Cours.

Table Principale (Vue Étudiant)

Je veux voir les cours d'Alice.

PK: STUDENT#Alice SK: COURSE#Maths Data: { Note: 15/20 } PK: STUDENT#Alice SK: COURSE#Physique Data: { Note: 12/20 }
GSI Inversé (Vue Prof)

Je veux voir les inscrits en Maths.

GSI_PK: COURSE#Maths (Vient du SK) GSI_SK: STUDENT#Alice (Vient du PK) Data: { Note: 15/20 }

Technique : On copie la SK dans le GSI-PK et la PK dans le GSI-SK. Cela permet d'interroger la relation dans les deux sens.

3. Architecture Interne : Partitions & Hachage
Le Secret : "Divide & Conquer"

DynamoDB ne stocke pas vos données sur un seul serveur. Il découpe votre table en milliers de morceaux appelés Partitions. Chaque partition est répliquée sur 3 AZ (Zones de Disponibilité).

Les Limites Dures d'une Partition

Peu importe la taille de votre table, une partition individuelle ne peut pas dépasser ces limites physiques :

Stockage10 GB
Écriture (WCU)1 000 / sec
Lecture (RCU)3 000 / sec
Partition Split (Division)

Si vous dépassez 10GB de données dans une partition, DynamoDB la coupe automatiquement en deux nouvelles partitions (5GB chacune).
C'est ainsi que DynamoDB scale à l'infini : plus de données = plus de partitions = plus de débit total.

La "Hash Key" : Le GPS de la donnée

Comment DynamoDB sait-il sur quelle partition (parmi 10 000) se trouve votre item ? GrĂące Ă  la fonction de hachage.

Input: PK = "User#123" Processing: Hash("User#123") -> "7f8a9..." (Valeur Hexadécimale) Output: La valeur "7f8a9..." tombe dans la plage (Range) gérée par la Partition 4.
Bonne PK (Haute Cardinalité)

UserID, DeviceID, UUID.
Le hachage disperse ces valeurs aléatoirement sur toutes les partitions disponibles.
Résultat : Parallélisme maximal.

Mauvaise PK (Faible Cardinalité)

Status (Pending/Done), Gender, Date (2024-01-01).
MĂȘme aprĂšs hachage, tous les items "Pending" vont au mĂȘme endroit.
Résultat : Embouteillage sur une seule partition.

Hot Partition : L'Ennemi de la Performance

Une "Hot Partition" est une partition physique qui reçoit plus de trafic qu'elle ne peut en supporter (1000 WCU), alors que les autres partitions sont vides.

Causes Fréquentes
TypeExempleConséquence
Hot KeyTous les utilisateurs likent le mĂȘme post populaire (PK="Post#123").Throttling immĂ©diat sur cette clĂ©.
Time SeriesPK = Date du jour. Tout le trafic s'écrit sur la partition "Aujourd'hui".On n'utilise qu'une fraction de la capacité totale provisionnée.
SymptĂŽme : Vous avez provisionnĂ© 10 000 WCU, vous n'en consommez que 500, mais vous avez quand mĂȘme des erreurs ProvisionedThroughputExceeded. C'est le signe d'une Hot Partition.
Adaptive Capacity : La réponse d'AWS

Depuis 2019, DynamoDB tente de corriger automatiquement les partitions chaudes.

Fonctionnement Automatique
  1. DynamoDB détecte un déséquilibre (Partition A chauffe).
  2. Il alloue plus de capacité à la Partition A (en prenant sur les autres).
  3. Si cela ne suffit pas, il Isole l'item chaud (Split) pour qu'il ait sa propre partition dédiée.
Limites

Adaptive Capacity prend 5 à 30 minutes pour réagir.
Il ne peut JAMAIS dépasser la limite physique de 1000 WCU / 3000 RCU pour un seul item.
Conclusion : Un bon design de clé reste obligatoire.

Technique Expert : Write Sharding

Comment gérer un compteur de votes pour l'élection présidentielle (1 Million writes/sec) sur une seule clé ?

Algorithme de Write Sharding
// Au lieu d'écrire sur PK = "CANDIDATE_A" (Max 1000 WCU) // On ajoute un suffixe aléatoire de 1 à N. const shards = 100; // Multiplie la capacité par 100 const suffix = Math.floor(Math.random() * shards) + 1; const partitionedPK = `CANDIDATE_A_${suffix}`; db.putItem({ PK: partitionedPK, Vote: 1 });

Lecture (Scatter-Gather) : Pour avoir le total, l'application doit lire les 100 partitions (BatchGetItem ou Query parallĂšle) et faire la somme.
Coût : Complexité applicative en lecture, mais performance d'écriture infinie.

2.2 Capacity Modes : On-Demand vs Provisioned
Le Choix CornĂ©lien : FlexibilitĂ© ou Économie ?

Vous pouvez changer de mode une fois toutes les 24 heures. Il est donc crucial de comprendre les différences.

CaractĂ©ristiqueOn-Demand (À la demande)Provisioned (ProvisionnĂ©)
FacturationPar million de requĂȘtes (RRU / WRU).
Prix Premium (~7x plus cher)
Par capacité horaire (RCU / WCU).
Prix Bas (Surtout avec Réservation)
ScalingInstantané. GÚre les pics de 0 à 40 000 req/s sans configuration.Réactif (Lent). L'autoscaling met quelques minutes à réagir à un pic.
ThrottlingQuasi impossible (sauf Hot Partition ou limite de compte atteinte).Possible si le pic est plus rapide que l'autoscaling ("Flash Crowd").
Idéal pour...Startups, Dev, Trafic imprévisible, Batchs irréguliers.Trafic stable, E-commerce constant, Production optimisée.
Mode On-Demand : La tranquillité d'esprit

Aucune configuration de capacité. DynamoDB gÚre tout. Idéal pour les charges de travail "Spiky" (en dents de scie).

Comment ça marche ?
  • DynamoDB alloue instantanĂ©ment les ressources dĂšs qu'une requĂȘte arrive.
  • Warm-up : Une nouvelle table On-Demand peut encaisser 4000 WCU et 12000 RCU immĂ©diatement.
  • Adaptation : Si vous dĂ©passez le pic prĂ©cĂ©dent, DynamoDB double la capacitĂ© disponible en ~30 minutes pour le prochain pic.
Unités de Facturation
  • RRU (Read Request Unit) : 1 lecture forte (4KB).
  • WRU (Write Request Unit) : 1 Ă©criture (1KB).
  • Exemple : Écrire 1 million d'items coĂ»te ~1.25$ (us-east-1).
Use Case : Tables de Dev/Test. En On-Demand, si vous ne faites aucune requĂȘte le weekend, vous payez 0$ (hors stockage). En Provisioned, vous payez 24/7 mĂȘme Ă  vide.
Mode Provisioned : L'optimisation FinOps

Vous définissez un nombre de WCU/RCU min et max. L'Auto Scaling ajuste la capacité entre les deux.

Le PiĂšge de l'Autoscaling (Lag)
Scenario : Pic TV (Pub de 20h) Trafic : 100 -> 10 000 req/sec en 5 secondes. 1. 20:00:00 : Pic de trafic. 2. 20:00:01 : CapacitĂ© dĂ©passĂ©e -> THROTTLING (Erreurs 400). 3. 20:01:00 : CloudWatch dĂ©clenche l'alarme "High CPU". 4. 20:03:00 : DynamoDB provisionne les nouvelles partitions. 5. 20:03:30 : Le Throttling s'arrĂȘte. Conclusion : Vous avez perdu 3 minutes de trafic.

Solution : Pour les événements prévisibles (Black Friday), utilisez le Scheduled Scaling pour augmenter la capacité avant le pic.

Le Cycle de Vie d'une Table

La bonne stratégie n'est pas statique, elle évolue avec votre produit.

Phase ProjetMode RecommandéRaison
1. DéveloppementOn-DemandTrafic nul ou sporadique. On ne veut pas payer la nuit/weekend.
2. Lancement (Go Live)On-DemandOn ne connaßt pas encore le comportement des utilisateurs. On évite le throttling à tout prix.
3. CroisiÚre (Run)ProvisionedAprÚs 1 ou 2 mois, on analyse les métriques CloudWatch. Le trafic est stable/prévisible. On active l'Autoscaling.
4. OptimisationReserved Cap.On achÚte de la capacité réservée sur 1 an pour la "baseline" du trafic.
Maths : Quand basculer ?

Provisioned est moins cher, MAIS si votre autoscaling est mal réglé (sur-provisionning), vous payez pour du vide.

Le seuil de rentabilité

Le mode Provisioned est environ 5 à 7 fois moins cher à l'unité que le On-Demand.

Cependant, si votre table Provisioned a un taux d'utilisation moyen (Utilization Ratio) de moins de 15% (trÚs peu utilisée la nuit, pics énormes le jour), alors On-Demand reste moins cher.

Exemple Chiffré (US East)
  • On-Demand : 1 Million Ă©critures = 1.25$
  • Provisioned : 1 WCU (suffit pour ~2.6M Ă©critures/mois Ă  100% load) = 0.47$ / mois.

Si vous arrivez à garder votre WCU chargé à >20%, le Provisioned gagne toujours.

1.3 Concept : La Mécanique de la Clé Primaire (PK/SK)
Le Choix Fondateur : Simple ou Composite ?

À la crĂ©ation de la table, vous devez choisir la structure de votre clĂ© primaire. Ce choix est immuable.

Clé Simple (Partition Key Only)VSClé Composite (PK + Sort Key)
Structure : 1 attribut (ex: SessionId).Structure : 2 attributs (ex: UserId + Timestamp).
UnicitĂ© : La PK doit ĂȘtre unique dans toute la table.UnicitĂ© : La combinaison (PK + SK) doit ĂȘtre unique. La PK peut ĂȘtre dupliquĂ©e.
ModÚle : Key-Value Store pur (comme Redis/Memcached).ModÚle : Relations 1-N, Séries Temporelles, Hierarchies.
AccÚs : Uniquement GetItem (accÚs direct).AccÚs : GetItem (précis) OU Query (plage).
La Partition Key (PK) : L'Adresse Physique

Pourquoi l'appelle-t-on aussi "Hash Key" ?
Parce que DynamoDB passe la valeur de la PK dans une fonction de hachage interne.

Le Flux Interne

PK="User#123"
âŹ‡ïž Hash Function (MD5-like)
Result="7a9d..."
âŹ‡ïž Map to Storage Node
Partition #4 (SSD)

Conséquences Architecturales
  • Distribution : Si vos PK sont sĂ©quentielles (1, 2, 3), le hachage les disperse bien.
  • ÉgalitĂ© stricte : Vous ne pouvez JAMAIS faire de requĂȘte "Commence par" ou "SupĂ©rieur Ă " sur une PK. C'est toujours PK = valeur.
  • Performance : L'accĂšs est O(1). DynamoDB sait exactement sur quel serveur aller sans chercher.
La Sort Key (SK) : L'Ordre Logique

Si la PK dĂ©termine "Sur quelle Ă©tagĂšre" est le livre, la SK dĂ©termine "À quelle place" sur l'Ă©tagĂšre.

Stockage Trié (B-Tree)

Sur le disque, les items partageant la mĂȘme PK sont stockĂ©s physiquement contigus, triĂ©s par ordre binaire de la SK.
C'est pour cela que lire une plage de dates est ultra-rapide.

Opérateurs Puissants

Contrairement à la PK, la SK supporte les opérateurs riches :

  • BEGINS_WITH("2023-")
  • BETWEEN 100 AND 200
  • >, <, >=
Item Collections : Le "Cluster" de données

L'ensemble des items ayant la mĂȘme PK forme une Item Collection.

Exemple E-Commerce (Table Unique)
PK (Partition)SK (Sort)DataCommentaire
CUSTOMER#101
(Collection)
METADATA{ "Nom": "Alice" }Le profil du client
ORDER#2023-01-05{ "Total": 50€ }Commande Janvier
ORDER#2023-02-14{ "Total": 120€ }Commande FĂ©vrier
ORDER#2023-03-01{ "Total": 10€ }Commande Mars
Pattern "Query" : Je peux rĂ©cupĂ©rer le profil ET toutes les commandes en 1 seule requĂȘte :
Query(PK="CUSTOMER#101").
Je peux récupérer juste les commandes de 2023 :
Query(PK="CUSTOMER#101", SK BEGINS_WITH("ORDER#2023")).
Quelle API utiliser ?

Comprendre la différence est vital pour la performance et le coût.

APIConditionRésultatCoût (RCU)
GetItemDoit fournir la PK ET la SK exacte.1 seul item (ou rien).Taille de l'item (arrondi 4KB).
QueryDoit fournir la PK exacte. Peut fournir une condition sur la SK.Une liste d'items (jusqu'à 1MB de données).Somme des tailles des items retournés (TrÚs efficace).
ScanAucune clé requise.Toute la table (page par page).Taille totale de la table. $$$
2. ModÚle de Données : Structure & Types
Structure Logique : Schemaless & JSON

DynamoDB organise les données de maniÚre hiérarchique simple, mais avec une flexibilité totale au niveau de l'Item.

Table

Collection d'items.
Contrairement à SQL, une table est Schemaless : vous ne définissez que la Clé Primaire lors de la création. Le reste est libre.

Item

Enregistrement individuel (Ligne).
C'est un Document JSON. Chaque item peut avoir des attributs différents des autres (ex: un item a "Email", l'autre a "Telephone").

Attribut

ÉlĂ©ment de donnĂ©e (Colonne).
Peut ĂȘtre simple (String, Number) ou complexe (List, Map imbriquĂ©e).

// Exemple de deux items dans la MÊME table Item 1: { "PK": "User#1", "Nom": "Alice", "Role": "Admin" } Item 2: { "PK": "User#2", "Nom": "Bob", "Adresse": { "Ville": "Paris" } } // Structure diffĂ©rente !
Le CƓur du Design : La ClĂ© Primaire

Il n'y a que deux façons de définir une clé primaire. Ce choix dicte comment vous pourrez accéder à vos données.

1. Partition Key (Simple)

Composée d'un seul attribut (PK).
Contrainte : La PK doit ĂȘtre unique dans toute la table.
Usage : Key-Value Store (ex: Session Cache, User Profile par ID).

GetItem(PK="Session#123") -> Rapide (O(1)) Query impossible sur des plages.
2. Partition Key + Sort Key (Composite)

Composée de deux attributs (PK + SK).
Contrainte : La combinaison (PK + SK) doit ĂȘtre unique.
Usage : Relations 1-N (ex: Un Client a plusieurs Commandes).

Query(PK="Client#1") -> Retourne toutes les commandes Query(PK="Client#1", SK > "2023-01-01") -> Commandes récentes
Types Scalaires & Complexes

DynamoDB supporte un jeu riche de types de données pour modéliser des documents complexes.

CatégorieTypeCodeDescription & Usage
ScalairesStringSUTF-8 binaire. (ex: "Bonjour").
NumberNStocké comme texte pour préserver la précision ("105.50"). Supporte entiers et flottants.
BinaryBDonnées binaires brutes (ex: Image compressée, hash chiffré).
BooleanBOOLTrue / False.
Sets (Ensembles)String SetSSListe de chaĂźnes uniques. L'ordre n'est pas garanti. (ex: Tags ["React", "AWS"]).
DocumentsMapMObjet JSON imbriqué. (ex: {"Rue": "Paix", "CP": 75000}).
ListLTableau ordonné hétérogÚne. (ex: ["Alice", 42, true]).
La Limite des 400 KB
Hard Limit

La taille totale d'un item (Noms des attributs + Valeurs) ne peut pas dépasser 400 KB.
Cela inclut les structures imbriquées (Listes, Maps).

Workarounds
  • Compression : Gzipper les gros textes avant stockage (Type Binary).
  • S3 Offloading : Stocker les gros contenus (PDF, Images, Textes longs) dans S3 et garder uniquement le lien (URL) dans DynamoDB.
  • DĂ©coupage : SĂ©parer un item en plusieurs lignes (Item Collection).
Autres Limites Importantes
  • Profondeur JSON : Max 32 niveaux d'imbrication (Maps dans Maps).
  • Taille ClĂ© Partition (PK) : Max 2048 octets.
  • Taille ClĂ© de Tri (SK) : Max 1024 octets.
3.3 Single-Table Design : L'Art de la Dénormalisation
Oubliez la Normalisation (3NF)

En SQL, on modélise les données pour économiser de l'espace (Normalisation). On crée des tables séparées (Users, Orders) et le moteur fait des JOINs au moment de la lecture (CPU intensif).

La Philosophie DynamoDB
  • Access Pattern First : On ne modĂ©lise pas les entitĂ©s, on modĂ©lise les questions qu'on posera Ă  la base.
  • Pre-Joining : Puisque DynamoDB ne fait pas de JOIN, on prĂ©-calcule les jointures en Ă©crivant les donnĂ©es liĂ©es cĂŽte Ă  cĂŽte sur le disque.
  • 1 Application = 1 Table : On rĂ©duit l'overhead de gestion (monitoring, alarmes, connexion).
Le Concept Clé

"Les donnĂ©es qui sont lues ensemble doivent ĂȘtre stockĂ©es ensemble."
-- Rick Houlihan (Inventeur du pattern)

Key Overloading : Des noms génériques

Dans une table unique, la colonne de clé primaire va contenir des IDs d'utilisateurs, de commandes, de produits... On ne peut pas l'appeler UserID.

Nom de ColonneTypePourquoi ce nom ?
PK (Partition Key)StringNom générique. Contiendra USER#123 ou ORDER#999.
SK (Sort Key)StringNom générique. Contiendra PROFILE ou ITEM#abc.
Data / PayloadAnyLes autres attributs (Nom, Prix, Date) gardent leurs noms sémantiques.
Astuce : Utilisez toujours des préfixes (ex: USER#, ORD#) pour éviter les collisions d'ID et permettre le tri.
Cas Pratique : E-Commerce (Client + Commandes)

Objectif : Stocker un client, ses commandes, et le détail des produits, tout en permettant des accÚs rapides.

Visualisation de la Table
PKSKAttributs (Data)Type d'entité
USER#123PROFILE{ "Nom": "Alice", "Email": "..." }Profil Utilisateur
USER#123ORDER#2023-01-01{ "Total": 50, "Status": "Shipped" }Commande A
USER#123ORDER#2023-02-15{ "Total": 120, "Status": "Pending" }Commande B
Item Collections : Le "JOIN" gratuit

Tous les items partageant la mĂȘme PK (ici USER#123) sont stockĂ©s physiquement ensemble sur le disque. C'est une Item Collection.

La RequĂȘte Magique
params = { TableName: "MySingleTable", KeyConditionExpression: "PK = :pk", ExpressionAttributeValues: { ":pk": "USER#123" } } // Résultat : 1 appel réseau retourne le Profil ET les Commandes.
Comparatif Performance
  • SQL :
    1. Chercher User (Index Scan)
    2. Chercher Orders (Index Scan)
    3. Merge (CPU)
    Lent si beaucoup de données.
  • DynamoDB Single-Table :
    1. Aller direct au Hash "USER#123".
    2. Lire séquentiellement.
    Vitesse constante (O(1)) mĂȘme avec 1 milliard de donnĂ©es.
Faut-il utiliser Single-Table partout ?

Non. C'est un pattern expert qui a des inconvénients majeurs.

Avantages
  • Vitesse : Une seule requĂȘte rĂ©seau pour rĂ©cupĂ©rer des donnĂ©es hiĂ©rarchiques.
  • CoĂ»t : Moins d'overhead (WCU/RCU) qu'en gĂ©rant 10 tables.
  • Ops : Une seule table Ă  monitorer, backuper, scaler.
Inconvénients
  • ComplexitĂ© : Courbe d'apprentissage brutale. Code plus difficile Ă  lire.
  • RigiditĂ© : TrĂšs difficile d'ajouter de nouveaux access patterns plus tard.
  • Analytics : Impossible Ă  analyser avec des outils BI standards sans export ETL prĂ©alable.

Verdict : Utilisez le Single-Table pour les applications Ă  trĂšs fort trafic (Hyper-Scale). Pour une petite app CRUD ou un MVP, le Multi-Table est souvent plus simple et suffisant.

3.2 Indexes : Global Secondary Index (GSI)
Comprendre le GSI : Une "Table Ombre"

Un GSI n'est pas un simple B-Tree comme dans MySQL. C'est littéralement une deuxiÚme table DynamoDB gérée par AWS, synchronisée automatiquement.

Différences Table vs GSI
  • ClĂ© Primaire : Totalement diffĂ©rente de la table. (ex: Table PK=`UserID`, GSI PK=`Email`).
  • Attributs : Ne contient qu'une copie partielle des donnĂ©es (Projection).
  • Consistance : Toujours Eventual. Il y a un lag (ms) entre l'Ă©criture table et l'apparition dans le GSI.
Workflow d'Écriture
  1. App fait PutItem sur la Table Principale.
  2. DynamoDB ack (200 OK).
  3. En arriÚre-plan, DynamoDB détecte la modif et la propage vers le GSI.
  4. Conséquence : On ne peut pas faire un "Strongly Consistent Read" sur un GSI.
Projections : Optimiser le Stockage et les WCU

Puisque le GSI est une copie, vous payez le stockage et l'écriture en double. L'attribut Projection définit ce que vous copiez.

Type de ProjectionCe qui est copiéImpact CoûtCas d'usage
KEYS_ONLYSeulement PK + SK (Table) et PK + SK (Index).MinimumVérifier l'existence d'un item ("Est-ce que cet email existe ?") ou récupérer juste l'ID.
INCLUDEKeys + Liste spécifique (ex: `Avatar`, `Nickname`).MoyenAfficher une liste légÚre (Search results) sans charger le profil complet.
ALLTout l'item entier.DoubleSimplifie le dev (pas besoin de refetcher la table), mais trĂšs cher si les items sont gros.
Astuce FinOps : Si vous devez filtrer sur un attribut (ex: `Status`), projetez-le dans l'index, mĂȘme s'il ne fait pas partie de la clĂ©. Cela Ă©vite de faire un `Fetch` vers la table principale.
Le PiĂšge Mortel : GSI Throttling
RÚgle Critique : Si un GSI sature (plus de WCU disponibles), DynamoDB BLOQUE les écritures sur la Table Principale.
Scénario Catastrophe
  1. Table Principale : Provisionnée à 1000 WCU.
  2. GSI "Email" : Provisionné à 5 WCU (oubli de config).
  3. Vous lancez un import massif de données.
  4. Le GSI sature instantanément.
  5. RĂ©sultat : Vos PutItem sur la Table Principale Ă©chouent avec ProvisionedThroughputExceeded, mĂȘme si la table est large.

Solution : Toujours configurer l'Autoscaling du GSI de la mĂȘme maniĂšre que la Table, ou utiliser le mode On-Demand partout.

Design Pattern : Inverted Index

Pattern classique pour gérer les relations Many-to-Many (ex: Auteurs <-> Livres).

Table Principale

PK = Auteur, SK = Livre

PK: AUTEUR#StephenKing SK: LIVRE#Ca Data: { Année: 1986 }

RequĂȘte : "Tous les livres de Stephen King".

GSI (Inversé)

PK = SK (Table), SK = PK (Table)

PK: LIVRE#Ca SK: AUTEUR#StephenKing Data: { Année: 1986 }

RequĂȘte : "Qui a Ă©crit le livre Ça ?".

Design Pattern : GSI Overloading

Au lieu de payer pour 5 indexes différents, on en crée un seul "Générique" et on y met des données différentes selon l'entité.

Item TypeGSI_PK (Contenu)GSI_SK (Contenu)Question répondue
CommandeSTATUS#EN_COURSDATE#2023-10-27Donne les commandes en cours triées par date.
EmployéDEP#MarketingSALAIRE#45000Donne les employés du Marketing triés par salaire.
ProduitCAT#TelephoneMARQUE#AppleDonne les téléphones de marque Apple.

Avantage : Vous ne payez qu'un seul GSI, mais il sert à toute l'application. C'est le cƓur du "Single Table Design".

2.3 Performance : Throttling & Hot Partitions
ProvisionedThroughputExceededException

C'est l'erreur que renvoie DynamoDB quand vous essayez d'aller plus vite que la musique. Votre requĂȘte est rejetĂ©e avec un code HTTP 400.

Les deux causes possibles
  • 1. Limite de Table atteinte : Vous avez provisionnĂ© 100 WCU, vous consommez 120 WCU. (Facile Ă  rĂ©gler : Autoscaling ou On-Demand).
  • 2. Limite de Partition atteinte : Vous tapez trop fort sur une seule Partition Key. (Difficile Ă  rĂ©gler : ProblĂšme de Design).
Les Limites Physiques d'une Partition

Peu importe la taille de votre table (mĂȘme avec 1 million de WCU), UNE partition physique ne peut jamais dĂ©passer :

  • 3 000 RCU / seconde (Lecture)
  • 1 000 WCU / seconde (Écriture)
Anatomie d'une "Hot Partition"

Cela arrive quand la distribution de vos clés n'est pas uniforme.

Distribution Uniforme (Idéal)

PK = UserID (UUID aléatoire).
Le trafic est réparti équitablement sur les 100 partitions de la table.
Chaque partition travaille Ă  10%. Tout va bien.

Distribution Asymétrique (Hot Key)

PK = Date (ex: "2023-10-27").
100% des écritures du jour vont sur la partition qui gÚre le hash de "2023-10-27".
Cette partition sature (Throttle), les 99 autres dorment.

Adaptive Capacity : Le "Pompier" d'AWS

Heureusement, DynamoDB est intelligent. Si une partition chauffe, le systÚme réagit automatiquement.

Mécanisme Automatique
  1. DynamoDB détecte qu'une partition est "Hot" (consomme plus que son quota proportionnel).
  2. Il augmente instantanément le débit de cette partition (en utilisant des crédits "Burst").
  3. Si ça dure, il peut Isoler la clé chaude (Split) pour lui dédier une partition entiÚre.
Attention : Adaptive Capacity ne peut pas dépasser la limite physique (1000 WCU).
Si vous Ă©crivez 2000 items/sec sur la clĂ© "Product#iPhone15", Adaptive Capacity ne pourra rien faire. Ça throttlera.
Solutions Architecturales
TechniquePrincipeCas d'usage
Write Sharding
(Éclatement)
Ajouter un suffixe aléatoire à la PK.
Vote#A devient Vote#A_1 ... Vote#A_10.
Compteurs massifs, Votes, Logs, Time Series.
DAX (Caching)Placer un cache en mĂ©moire devant la DB. DAX absorbe les lectures sur la clĂ© chaude.Lecture massive d'un mĂȘme item (ex: "Settings", "Top News").
Scatter-GatherLire les N partitions shardées en parallÚle et agréger le résultat dans l'app.Lecture d'un compteur shardé.
Exemple de code : Write Sharding
                    // Écriture (RĂ©partition sur 5 shards)
                    const shardId = Math.floor(Math.random() * 5) + 1;
                    const pk = `CANDIDATE_A_${shardId}`;
                    await dynamo.putItem({ PK: pk, Vote: 1 });

                    // Lecture (Aggrégation)
                    // Il faut faire 5 GetItem (ou 1 BatchGetItem) et sommer les résultats.
Comment réagir au Throttling ?

Ne relancez pas la requĂȘte immĂ©diatement ! Vous ne feriez qu'aggraver l'embouteillage.

Exponential Backoff

Algorithme standard (inclus dans les SDK AWS).

  • Tentative 1 : Échec (400).
  • Attendre 50ms... Tentative 2.
  • Attendre 100ms... Tentative 3.
  • Attendre 200ms... Tentative 4.
  • Abandon (Erreur finale).
Jitter (Aléatoire)

Si 1000 clients sont throttlĂ©s en mĂȘme temps et attendent tous exactement 100ms, ils vont retenter tous ensemble (Thundering Herd).
Solution : Ajouter du hasard. Wait(100ms + random(0, 20ms)).

1. Introduction : Comprendre Amazon DynamoDB
Qu'est-ce que DynamoDB ?

Oubliez vos serveurs MySQL. DynamoDB est une base de données Clé-Valeur & Document, Serverless, conçue pour la performance à l'échelle.

Les 3 Piliers
  • Performance : Latence Ă  1 chiffre (millisecondes) quelle que soit la taille de la base (1 Go ou 100 To).
  • Serverless : Pas de patching, pas de maintenance, pas de "disk full". AWS gĂšre le matĂ©riel.
  • ScalabilitĂ© : Peut gĂ©rer 10 comme 10 millions de requĂȘtes par seconde (RPS) automatiquement.
Architecture Physique (Invisible)

Sous le capot, vos données sont découpées en Partitions (SSD) et répliquées automatiquement sur 3 Zones de Disponibilité (AZ).
Si une AZ brûle, vos données sont toujours là. C'est inclus dans le prix.

Le Langage DynamoDB

Contrairement à SQL, la structure est flexible, mais la Clé Primaire est rigide.

  • Table : Collection d'Ă©lĂ©ments (Comme une Table SQL).
  • Item : Un enregistrement unique (Comme une Ligne SQL). Limite : 400KB max.
  • Attribute : Une donnĂ©e (Comme une Colonne). Peut ĂȘtre simple (String, Number) ou complexe (List, Map).
Clé Primaire (Crucial) :
1. Partition Key (PK) : Obligatoire. Sert à hacher la donnée vers une partition physique. (ex: UserID).
2. Sort Key (SK) : Optionnel. Sert à trier les données à l'intérieur d'une partition. (ex: DateCommande).
Exemple JSON (Schemaless)
                            {
                            "PK": "USER#123",          // Partition Key
                            "SK": "PROFILE",           // Sort Key
                            "Nom": "Alice",
                            "Email": "alice@aws.com",
                            "Roles": ["Admin", "Editor"], // Liste
                            "Address": {               // Map (JSON imbriqué)
                            "City": "Paris",
                            "Zip": "75001"
                            }
                            }
Le Choc Culturel : SQL vs NoSQL

N'essayez pas d'utiliser DynamoDB comme MySQL, vous allez échouer.

RDBMS (MySQL, Postgres)DynamoDB
Normalisé : On évite la duplication. On fait des JOINs.VSDénormalisé : On duplique la donnée pour la vitesse. PAS DE JOIN.
FlexibilitĂ© : On peut requĂȘter n'importe quelle colonne (`WHERE age > 18`).VSAccĂšs par ClĂ© : On doit connaĂźtre la PK (+SK) pour ĂȘtre efficace. Les filtres complexes sont lents (Scan).
Scale Vertical : Plus gros serveur CPU/RAM.VSScale Horizontal : Plus de partitions. Illimité.
Connexions : Persistantes (TCP/Pool).VSConnexions : Stateless (HTTP API). Idéal pour Lambda.
Consistance des Lectures & Transactions

Puisque la donnée est répliquée sur 3 zones, quand je lis, est-ce que je vois la derniÚre version ?

Les 2 Modes de Lecture
  • Eventual Consistency (Par dĂ©faut)
    Rapide & Moins cher (0.5 RCU). La donnée peut avoir quelques millisecondes de retard (le temps de réplication).
  • Strongly Consistent
    Plus cher (1 RCU). Garantit que vous lisez la toute derniĂšre Ă©criture. (À demander explicitement : `ConsistentRead: true`).
Transactions ACID

DynamoDB supporte les transactions ! (Oui, comme SQL).
API : TransactWriteItems / TransactGetItems.

  • Permet d'Ă©crire dans 2 tables en mĂȘme temps : "Tout rĂ©ussit ou rien ne se fait".
  • CoĂ»t : x2 par rapport Ă  une Ă©criture standard.
Quand l'utiliser (et quand FUIR)
Idéal Pour :
  • Serverless Apps : Backends Lambda, API Gateway.
  • High Scale : Jeux vidĂ©o (Leaderboards), Paniers e-commerce, Voting apps.
  • Key-Value simple : Stockage de session, Config, Feature Flags.
  • DonnĂ©es chaudes : DonnĂ©es rĂ©centes accĂ©dĂ©es trĂšs souvent.
À Éviter Si :
  • Analytique / BI : Faire des `GROUP BY`, `AVG` sur des annĂ©es de donnĂ©es -> Utilisez Redshift ou Athena.
  • Recherche complexe : "Trouver les utilisateurs qui s'appellent Bob OU qui habitent Paris" -> Utilisez OpenSearch.
  • Binary Blobs : Stocker des images/PDFs -> Utilisez S3 (stockez juste le lien dans DynamoDB).
2. Architecture : Partitions, Clés & Modélisation
Sous le capot : Partitions Physiques

DynamoDB est un systÚme distribué. Votre table n'est pas sur un seul disque, elle est découpée en milliers de morceaux appelés Partitions.

L'Algorithme de Placement
  1. DynamoDB prend votre Partition Key (PK).
  2. Il applique une fonction de hachage (MD5-like).
  3. Le résultat détermine sur quelle partition physique la donnée atterrit.
Limites d'une Partition (Hard Limits) :
‱ Stockage Max : 10 GB.
‱ Écriture Max : 1 000 WCU / sec.
‱ Lecture Max : 3 000 RCU / sec.
Partition Split (Division Cellulaire)

Que se passe-t-il si vous dépassez 10 GB ?
La partition se divise en deux (Split). Les données sont redistribuées. C'est automatique et invisible.

Note : C'est pour cela que DynamoDB est infiniment scalable. Plus vous avez de données, plus vous avez de partitions, plus vous avez de débit total.

Comprendre PK (Partition Key) et SK (Sort Key)

C'est la décision de design la plus importante.

CléRÎleAnalogie BibliothÚque
Partition Key (PK)
Obligatoire
DĂ©termine l'emplacement physique. Doit avoir une haute cardinalitĂ© (beaucoup de valeurs uniques).L'ÉtagĂšre.
Elle dit dans quelle armoire chercher.
Sort Key (SK)
Optionnel
Ordonne les donnĂ©es physiquement Ă  l'intĂ©rieur de la partition. Permet les requĂȘtes de plage (Range Queries).Le Classement.
Sur l'étagÚre, les livres sont triés par date ou par auteur.
Opérations possibles sur la SK

GrĂące Ă  la Sort Key, vous pouvez faire des requĂȘtes puissantes sans scanner toute la table :

BEGINS_WITH("2023-") -> RécupÚre toute l'année BETWEEN "A" AND "C" -> RécupÚre de A à C > 100 -> RécupÚre les scores supérieurs à 100
L'Ennemi Public n°1 : Hot Partitions

Si tout le monde lit/Ă©crit la mĂȘme PK en mĂȘme temps, vous crĂ©ez un embouteillage sur UNE SEULE partition physique.

Mauvais Design
  • PK = "Date" (ex: 2023-10-27) : Tout le trafic du jour tape la mĂȘme partition.
  • PK = "Status" (ex: EN_COURS) : Si 90% des commandes sont "EN_COURS", une partition souffre.
Bon Design
  • PK = "UserID" : Le trafic est rĂ©parti sur des milliers d'utilisateurs.
  • PK = "OrderID" (UUID) : RĂ©partition parfaite (alĂ©atoire).
Adaptive Capacity

AWS peut "booster" temporairement une partition chaude en lui allouant plus de débit (emprunté aux autres). Mais ce n'est pas magique : si vous dépassez la limite physique du disque, vous aurez des erreurs ThrottlingException.

Single Table Design (STD) : Le Graal

En SQL, on fait 1 Table = 1 Entité (User, Order, Product). En DynamoDB expert, on met TOUT dans une seule table.

Pourquoi ? (Pre-Joining)

DynamoDB ne fait pas de JOIN. Pour rĂ©cupĂ©rer un User ET ses Commandes en une seule requĂȘte (10ms), on les stocke cĂŽte Ă  cĂŽte.

Structure Générique
  • On nomme les colonnes PK et SK (pas UserID).
  • On utilise des prĂ©fixes : USER#123, ORDER#999.
Visualisation des Données
PKSKData
USER#123PROFILE{Nom: Alice, Email: ...}
USER#123ORDER#A1{Total: 50€, Date: ...}
USER#123ORDER#A2{Total: 120€, Date: ...}

RequĂȘte : Query(PK="USER#123")
Résultat : Je reçois le profil ET les commandes en 1 seul appel réseau.

Technique Avancée : Write Sharding

Comment gérer un compteur de votes pour "Candidat A" lors d'une émission TV (1 Million votes/sec) ?
Une seule PK "CANDIDAT_A" exploserait la limite de 1000 WCU.

La Solution : Ajouter du hasard
// Au lieu d'écrire sur PK="CANDIDAT_A" // On écrit sur PK="CANDIDAT_A_#" + Random(1, 100) PK="CANDIDAT_A_1" : 500 votes PK="CANDIDAT_A_2" : 600 votes ... PK="CANDIDAT_A_100" : 450 votes
  • Écriture : RĂ©partie sur 100 partitions. CapacitĂ© totale = 100 * 1000 WCU = 100 000 WCU.
  • Lecture : On doit lire les 100 items et faire la somme (Scatter-Gather).
3. Capacité : Provisioned vs On-Demand & FinOps
Les Maths de DynamoDB : Calculez vos unités

DynamoDB ne compte pas en requĂȘtes, mais en "blocs de donnĂ©es". Si vous ignorez ces formules, vous allez surprovisionner ou throttler.

WCU (Write Capacity Unit)

1 WCU = 1 Écriture jusqu'à 1 KB / sec.

  • Arrondi au KB supĂ©rieur.
  • Item de 100 octets -> 1 WCU.
  • Item de 1.5 KB -> 2 WCU.
  • Transaction (ACID) : CoĂ»t x2 (Item 1 KB -> 2 WCU).
RCU (Read Capacity Unit)

1 RCU = 1 Lecture Forte (Strong) jusqu'Ă  4 KB / sec.

  • Eventual Consistency : 2 lectures pour 1 RCU (MoitiĂ© prix).
  • Strong Consistency : 1 lecture pour 1 RCU.
  • Transaction : 2 RCU pour 4 KB (Double prix).
Exemple concret : Lire un item de 15 KB. - Blocs de 4 KB : 15 / 4 = 3.75 -> Arrondi Ă  4 blocs. - Mode Eventual : 4 blocs / 2 = 2 RCU. - Mode Strong : 4 blocs = 4 RCU. - Mode Transaction : 4 blocs * 2 = 8 RCU.
Provisioned vs On-Demand : Le Guide de Choix
ModeFonctionnementQuand l'utiliser ?
On-Demand
Serverless pur
- Pas de configuration.
- Payez Ă  la requĂȘte (RRU/WRU).
- Scale instantanément (de 0 à 40k req/sec).
- Prix : ~5x à 7x plus cher à l'unité que le Provisioned.
- Startups / Nouveaux projets (Trafic inconnu).
- Trafic "Spiky" imprévisible.
- Environnements de Dev/Test (0$ si pas utilisé).
Provisioned
Classique
- Vous définissez un débit (ex: 100 WCU).
- Autoscaling ajuste le débit (avec latence).
- Prix : TrĂšs bas, surtout avec les "Reserved Capacity" (-50%).
- Trafic stable et prévisible (ex: E-commerce constant).
- Production Ă  fort volume (FinOps).
RÚgle d'Or : Vous pouvez changer de mode une fois toutes les 24 heures. Commencez en On-Demand, observez 1 mois, puis passez en Provisioned si le trafic est stable pour réduire la facture.
Throttling & Burst Capacity
L'Erreur 400 : ProvisionedThroughputExceeded

Cela arrive quand vous dépassez vos WCU/RCU provisionnés.
ConsĂ©quence : La requĂȘte est rejetĂ©e.

Le Joker : Burst Capacity

DynamoDB stocke jusqu'à 300 secondes (5 min) de capacité inutilisée.
Si vous avez provisionné 100 WCU mais n'en utilisez que 10, vous accumulez des crédits.
Lors d'un pic soudain, DynamoDB utilise ces crédits pour absorber le choc avant de throttler.

Comment gérer le Throttling ?
  • SDK AWS : GĂšre automatiquement les "Retries" avec un Exponential Backoff (attend 50ms, puis 100ms, puis 200ms...).
  • Hot Partitions : Si une seule clĂ© (ex: PK="Election2024") reçoit tout le trafic, vous serez throttlĂ© Ă  1000 WCU/3000 RCU, mĂȘme si la table a 1 million de WCU. Le Burst ne sauve pas d'une Hot Partition.
La vérité sur l'Autoscaling

En mode Provisioned, l'Autoscaling n'est PAS instantané. C'est un piÚge classique.

  • Scale Out (MontĂ©e) : Prend quelques minutes pour rĂ©agir. Si votre trafic passe de 100 Ă  10 000 en 5 secondes (Pub TV), l'Autoscaling sera trop lent -> Throttling massif. Pour ces cas-lĂ , utilisez On-Demand.
  • Scale In (Descente) : AWS attend 15 Ă  60 minutes de calme avant de rĂ©duire la capacitĂ©. C'est pour Ă©viter l'oscillation (Yo-Yo effect).
  • Target Tracking : La configuration standard est "Cible 70%". DynamoDB essaiera de garder votre consommation Ă  70% de la limite provisionnĂ©e.
Calculatrice FinOps : Cas Réel

Scénario : Une app écrit 1 million d'items de 1KB par jour.

MétriquesMode On-DemandMode Provisioned (Optimisé)
Volume1 000 000 Écritures~11.5 Écritures / sec (Moyenne lissĂ©e)
Coût Unitaire (us-east-1)1.25$ / million d'écritures0.00065$ / WCU-heure
Calcul Mensuel30 jours * 1.25$ = 37.5$Besoin : ~20 WCU (marge sécu).
20 * 0.00065 * 24h * 30j = ~9.36$
VerdictCher, mais zéro gestion.4x moins cher, mais nécessite un trafic lissé.
4. Indexes : LSI, GSI & Design Patterns
Comprendre l'Index : Une "Copie" de la donnée

DynamoDB ne fait pas de magie. Quand vous créez un Index, AWS maintient une deuxiÚme table cachée synchronisée avec la premiÚre.
Cela a un impact majeur sur le coĂ»t (Stockage + Écriture).

Le concept de "Projection"

Combien de données copiez-vous dans l'index ?

  • KEYS_ONLY : Copie juste la PK et la SK. Le moins cher.
  • INCLUDE : Copie PK + SK + quelques colonnes spĂ©cifiques (ex: `Email`, `Status`). OptimisĂ©.
  • ALL : Copie tout l'item. Le plus cher (Double le coĂ»t de stockage).
Workflow d'Écriture
  1. Vous écrivez dans la Table Principale.
  2. DynamoDB propage la donnée vers les GSI (Global Secondary Indexes) de maniÚre asynchrone (millisecondes).
  3. Conséquence : Si vous écrivez 1 item et que vous avez 3 GSI (Projection ALL), vous payez 4 écritures (1 base + 3 indexes).
GSI (Global Secondary Index) : L'outil Ă  tout faire

Permet de requĂȘter la table selon un axe totalement diffĂ©rent (Nouvelle PK, Nouvelle SK).

CaractéristiqueDétail TechniqueImplication Ops
Partition KeyPeut ĂȘtre n'importe quel attribut (ex: `Email` au lieu de `UserID`).Permet de trouver un user par son email sans faire de Scan.
ConsistanceEventual Only.Si vous écrivez et relisez immédiatement via le GSI, la donnée peut manquer (lag ms).
CapacitéA ses propres RCU/WCU (si provisioned). Danger : Si le GSI throttle (manque de WCU), il bloque les écritures sur la Table Principale !
FlexibilitéCréation/Suppression à la volée.On peut ajouter un GSI en production sans downtime.
LSI (Local Secondary Index) : Pourquoi l'éviter ?

Le LSI est un "vieux" concept de DynamoDB. Il partage la mĂȘme PK que la table, mais change la SK.

Les Avantages (Rares)
  • Strong Consistency : Permet de lire l'index avec une consistance forte.
  • Pas de coĂ»t WCU supp : Consomme la capacitĂ© de la table principale.
Les Inconvénients (Majeurs)
  • Immuable : Doit ĂȘtre créé Ă  la naissance de la table. Impossible Ă  supprimer ou ajouter aprĂšs.
  • La limite des 10 GB : CRITIQUE. Si une PK possĂšde un LSI, la somme des donnĂ©es pour cette PK ne peut pas dĂ©passer 10 GB. Si vous dĂ©passez, la partition devient inaccessible en Ă©criture.

Verdict : En 2024, utilisez des GSI dans 99% des cas. N'utilisez LSI que si vous avez une exigence absolue de consistance forte sur l'index.

GSI Overloading : La magie du Single-Table

Au lieu de créer 10 index (GSI_Email, GSI_Status, GSI_Date...), on crée un seul GSI générique.
On nomme ses attributs GSI1PK et GSI1SK.

Selon le type d'entité (User, Commande), on remplit ces champs avec des valeurs différentes.

Exemple Concret
EntitéGSI1PK (Contenu)GSI1SK (Contenu)Usage Query
UserEMAIL#alice@aws.comPROFILETrouver user par email
OrderSTATUS#OPENDATE#2023-10-27Lister commandes ouvertes par date
ProductCAT#ElectronicsPRICE#999Lister produits par catégorie triés par prix

Résultat : 1 seul GSI payé couvre 3 access patterns différents. C'est l'essence du design DynamoDB avancé.

Pattern : Sparse Index (Index "A trous")

DynamoDB n'indexe un item QUE si l'item possÚde la clé de l'index. S'il ne l'a pas, l'item est ignoré par l'index.

Scenario : Une table "Logs" (1 Million d'items). - 990 000 logs sont "SUCCESS". - 10 000 logs sont "ERROR". Objectif : Trouver rapidement les erreurs. Solution : 1. Créer un GSI sur l'attribut "ErrorID". 2. Pour les items "SUCCESS", ne pas mettre l'attribut "ErrorID". 3. Pour les items "ERROR", remplir "ErrorID". Résultat : Le GSI ne contient que 10 000 items. Scanner le GSI est ultra-rapide et gratuit (ou presque).
5. Streams & CDC : L'Architecture ÉvĂ©nementielle
Le Concept : Change Data Capture (CDC)

Au lieu de faire des requĂȘtes pĂ©riodiques (Polling) pour voir ce qui a changĂ©, DynamoDB pousse chaque modification (INSERT, MODIFY, REMOVE) dans un tuyau.

Option A : DynamoDB Streams (Natif)
  • RĂ©tention : 24 heures (fixe).
  • CoĂ»t : Gratuit (les RCU du stream, pas le stockage).
  • Ordre : Garanti strictement par Partition Key.
  • Usage : Trigger Lambda simple, Global Tables.
Option B : Kinesis Data Streams (KDS)
  • RĂ©tention : Jusqu'Ă  1 an.
  • CoĂ»t : Payant (par Shard ou On-Demand).
  • Fan-Out : Plusieurs consommateurs peuvent lire le mĂȘme stream sans se ralentir.
  • Usage : Big Data, Analytics, Pipelines complexes.
View Type (Ce qu'on envoie)
TypeContenu du RecordCas d'usage
KEYS_ONLYJuste la PK et SK.Invalidation de cache légÚre.
NEW_IMAGETout l'item aprÚs modif.Réplication, Synchro.
OLD_IMAGETout l'item avant modif.Audit, Undo log.
NEW_AND_OLD_IMAGESLes deux versions.Calcul de Delta (Diff).
Connecter Lambda : Attention aux PiĂšges

Lambda ne "reçoit" pas les données. C'est le service Lambda (Daemon) qui "poll" le stream et invoque votre fonction.

Batching (Performance)

Ne traitez pas les records 1 par 1 ! Configurez un Batch Size (ex: 100 items) et une Batch Window (ex: 10s).
Gain : Moins d'invocations Lambda, facturation réduite.

La "Poison Pill" (Danger)

Si dans un batch de 100 items, le 99Úme fait planter votre code (Exception), Lambda rejoue tout le batch indéfiniment. Le stream est bloqué.

La Solution : Partial Batch Failure
// Dans la config du Trigger Lambda : 1. Activer "ReportBatchItemFailures" 2. Activer "BisectBatchOnFunctionError" (Diviser pour régner en cas d'erreur) 3. Configurer une DLQ (Dead Letter Queue) SQS aprÚs X tentatives. // Dans le code (Node.js) : return { batchItemFailures: [ { itemIdentifier: "record_id_qui_a_planté" } ] };
CQRS : DynamoDB + OpenSearch

ProblĂšme : DynamoDB est nul pour la recherche textuelle ("Trouver les produits contenant 'rouge'").
Solution : Utiliser les Streams pour synchroniser vers OpenSearch (Elastic).

  1. L'Application écrit dans DynamoDB (Source of Truth). C'est rapide et fiable.
  2. DynamoDB Stream capture l'écriture.
  3. Une Lambda transforme la donnée (JSON) et l'envoie à l'API OpenSearch.
  4. L'Application lit les recherches complexes sur OpenSearch.
Délai : C'est "Near Real-Time". Il y a un décalage de 1 à 5 secondes entre l'écriture et la disponibilité dans la recherche. C'est le compromis de l'Eventual Consistency.
Archivage & Analytique (S3)

Ne faites JAMAIS de Scan complet sur votre table de prod pour faire de la BI. Cela consomme toute la capacité.

Le Pipeline Moderne (Zero-Code)
  • Source : Activer "Kinesis Data Streams" sur la table DynamoDB.
  • Transport : Connecter Kinesis Firehose au stream.
  • Transformation : Firehose convertit le JSON en Parquet (via une petite Lambda ou Glue).
  • Destination : Bucket S3 (Data Lake).
  • Analyse : RequĂȘter S3 avec Amazon Athena (SQL).
Alternative : Export to S3 (PITR)

Vous pouvez exporter un snapshot complet de la table vers S3 au format JSON/ION sans consommer AUCUNE capacité de lecture (RCU). C'est géré par le backup interne AWS.

EventBridge Pipes : Le Filtrage Serverless

Une nouvelle fonctionnalité (2023) qui simplifie la connexion Stream -> Lambda.

Avant (Lambda Monolithe)

La Lambda se réveille pour CHAQUE modification.
if (record.status != 'COMPLETED') return;
Vous payez l'invocation pour rien.

Avec Pipes (Filtrage)

EventBridge filtre les événements avant d'appeler la Lambda.
Filtre : { "dynamodb": { "NewImage": { "status": { "S": ["COMPLETED"] } } } }
Résultat : Facture Lambda divisée par 10.

6. Disaster Recovery : Backups & PITR
Snapshots complets & Conformité

Il existe deux façons de faire des snapshots manuels/programmés. Ils n'impactent JAMAIS la performance de la table (0% CPU/RCU consommé).

1. DynamoDB On-Demand Backup
  • GranularitĂ© : GĂ©rĂ© au niveau de la table.
  • RĂ©tention : Manuelle (on supprime quand on veut).
  • Usage : Backup rapide avant une mise en prod risquĂ©e.
2. AWS Backup (Recommandé)
  • CentralisĂ© : Plan de backup global (Dynamo + RDS + EBS).
  • Lifecycle : Passage automatique en Cold Storage (Archive) pour rĂ©duire les coĂ»ts (Tiering).
  • Vault Lock : Protection WORM (Write Once Read Many) contre les Ransomwares (impossible de supprimer le backup mĂȘme pour l'admin).
PITR (Point-in-Time Recovery) : Le Filet de Sécurité

Imaginez un bouton "Undo" pour votre base de données. PITR enregistre chaque écriture en continu.

  • FenĂȘtre : Restauration Ă  la seconde prĂšs sur les 35 derniers jours.
  • CoĂ»t : Payant au GB/mois (plus cher que le snapshot standard).
  • Impact Perf : Nul.
Quand l'utiliser ?

"Un stagiaire a lancé un script qui a supprimé 50% des utilisateurs il y a 15 minutes."
-> Action : Restaurer la table à l'état de "Maintenant - 20 minutes".

⚠ Le Grand PiĂšge de la Restauration
Attention : Dans DynamoDB, on ne peut PAS restaurer une table "sur place" (In-Place Restore).
Toute restauration (Snapshot ou PITR) crée obligatoirement une NOUVELLE TABLE avec un nouveau nom.
La Procédure de Crise (RTO - Recovery Time Objective)
  1. Lancer le Restore vers MaTable_Restored (Prend du temps selon la taille, ~20min pour 100GB).
  2. Option A (Swap) : Changer la config de l'application pour pointer vers MaTable_Restored. (Rapide mais perte des données écrites *pendant* la panne).
  3. Option B (Merge) : Scanner MaTable_Restored et réinjecter les items manquants dans MaTable_Originale. (Lent et complexe).

La table restaurée n'a PAS les Auto-Scaling, IAM Policies, ou Alarmes de l'originale. Il faut tout reconfigurer (IaC indispensable).

Export to S3 : ETL sans serveur

Comment faire de l'analytique sur DynamoDB sans tuer la prod ? En exportant vers S3.

FonctionnalitéDétail
Zéro RCUL'export utilise la couche de réplication interne. Il ne consomme AUCUNE capacité de lecture sur votre table. La prod ne sent rien.
FormatsDynamoDB JSON (Verbeux) ou ION (Binaire Amazon).
Incremental ExportNouveau ! Exportez seulement les données modifiées entre T1 et T2 (Delta). Idéal pour alimenter un Data Lake quotidiennement.
UsageBrancher Athena ou Glue sur les fichiers S3 pour faire des requĂȘtes SQL complexes (`GROUP BY`, `JOIN`).
Import from S3 : Migration Massive

Vous migrez de MongoDB ou Cassandra vers DynamoDB ? N'écrivez pas un script Python qui fait des PutItem un par un.

La méthode "Import Table"
  • Prend un fichier CSV, JSON ou ION dans S3.
  • CrĂ©e une Nouvelle Table et la remplit Ă  vitesse maximale.
  • CoĂ»t : Beaucoup moins cher que d'utiliser des WCU (Write Capacity Units).
  • Vitesse : Importe des TĂ©boctets en quelques heures.
# Format CSV attendu pk,sk,nom,age USER#1,PROFILE,Alice,30 USER#2,PROFILE,Bob,25 ...
7. Global Tables : Architecture Multi-Région
Le Graal : Une Base Unique Mondiale

Global Tables permet de déployer une table identique dans plusieurs régions (ex: Paris, Tokyo, New York). C'est une architecture Multi-Master (Active-Active).

Comment ça marche ?
  • Vous Ă©crivez dans la rĂ©gion la plus proche (ex: Utilisateur Japonais -> Tokyo).
  • DynamoDB propage la donnĂ©e vers Paris et NY via le backbone AWS (en ~1 seconde).
  • Un utilisateur Français lit la donnĂ©e Ă  Paris (Latence locale < 10ms).
Avantages Clés
  • Performance Locale : Lecture/Écriture au plus prĂšs de l'utilisateur.
  • RĂ©silience Totale : Si la rĂ©gion us-east-1 disparaĂźt, l'application bascule sur eu-west-1 sans perte de donnĂ©es (ou presque).
  • Sans Serveur : Pas de gestion de "MaĂźtre/Esclave". Tout est gĂ©rĂ© par AWS.
Le PiĂšge : Concurrence & "Last Writer Wins"

Que se passe-t-il si Alice (à Paris) et Bob (à Tokyo) modifient le MÊME item à la MÊME seconde ?

ProblÚmeMécanisme AWSImpact Application
Conflit d'ÉcritureLast Writer Wins (LWW) : AWS regarde le timestamp de l'Ă©criture. La plus rĂ©cente Ă©crase l'autre.Perte de DonnĂ©e Silencieuse.
Si Alice modifie "Nom" et Bob modifie "Email", mais qu'ils envoient tout l'objet, l'un des deux changements est perdu.
Solution : Utiliser des "Update Expressions" (SET email = ...) plutĂŽt que "PutItem".
Latence de RéplicationLe temps que la donnée voyage (ex: 1s).Eventual Consistency : Si Bob écrit à Tokyo et appelle Alice à Paris 100ms plus tard, Alice ne verra pas encore la donnée.
Métrique à surveiller : ReplicationLatency dans CloudWatch.
Si elle dépasse 1000ms, vous avez un problÚme de réseau ou de capacité dans la région de destination.
Stratégies DR : RPO & RTO proches de zéro

Global Tables est l'outil ultime pour le Plan de Reprise d'Activité (PRA).

Mode Active-Active (Recommandé)

Le trafic est routé vers les 2 régions en temps normal (via Route53 Latency Routing).

  • Panne RĂ©gion A : Route53 dĂ©tecte l'Ă©chec (Health Check) et envoie tout le trafic vers RĂ©gion B.
  • RTO (Recovery Time) : < 1 min (temps DNS).
  • RPO (Data Loss) : ~1 sec (donnĂ©es en vol non rĂ©pliquĂ©es).
Mode Active-Passive (Hot Standby)

Tout le trafic va vers RĂ©gion A. La RĂ©gion B est prĂȘte mais ne reçoit rien.

  • Usage : Compliance lĂ©gale ou simplification des conflits (on n'Ă©crit qu'Ă  un endroit).
  • CoĂ»t : On paie quand mĂȘme le stockage et les WCU dans la rĂ©gion passive !
L'Addition SVP : Ça coĂ»te cher ?

Oui. Multiplier les régions multiplie les coûts d'écriture.
Le concept clé est le Replicated Write Capacity Unit (rWCU).

ActionCoût unitaireExemple (3 Régions)
Lecture1 RCU localement.Pas de surcoût. Je lis à Paris, je paie à Paris.
Écriture1 WCU local + 1 rWCU par rĂ©plique.J'Ă©cris 1 KB Ă  Paris.
AWS écrit : 1 à Paris + 1 à NY + 1 à Tokyo.
Total : 3 écritures payantes + Data Transfer Out.
StockageGB standard.Stockage multiplié par 3 (données dupliquées partout).

Attention : Une table Global Table coĂ»te environ N fois le prix d'une table simple (oĂč N = nombre de rĂ©gions), plus le coĂ»t du transfert inter-rĂ©gion.

Avant de cliquer sur "Add Region"
  • Streams activĂ©s : Global Tables V2 utilise DynamoDB Streams ("New and Old Images").
  • CapacitĂ© : Toutes les rĂ©gions doivent ĂȘtre en On-Demand ou avoir l'Autoscaling configurĂ© identiquement. Si la rĂ©gion B n'a pas assez de WCU, elle va bloquer la rĂ©gion A !
  • Idempotence : Votre application doit tolĂ©rer qu'une commande soit traitĂ©e deux fois (cas rare de conflit rĂ©seau).
# Terraform Snippet resource "aws_dynamodb_table" "global" { name = "AppTable" billing_mode = "PAY_PER_REQUEST" stream_enabled = true stream_view_type = "NEW_AND_OLD_IMAGES" replica { region_name = "us-east-1" } replica { region_name = "eu-west-1" } replica { region_name = "ap-northeast-1" } }
8. FinOps : Tarification & Réduction des Coûts
Déconstruire la facture DynamoDB

La facture n'est pas linéaire. Elle dépend de votre mode (On-Demand vs Provisioned) et de vos fonctionnalités activées.

Poste de dépenseImpact FacturePiÚge à éviter
Throughput (WCU/RCU)60% à 80%Utiliser le mode On-Demand sur un trafic stable et élevé (7x plus cher que le provisionné réservé).
Stockage (GB)10% à 20%Laisser des données vieilles de 5 ans dans la table "Standard" (0.25$/GB) au lieu de "IA" (0.10$/GB).
Global TablesMultiplicateurRÚgle du N+1 : Chaque écriture est facturée dans la région d'origine + dans chaque région de réplication (Replicated WCU).
Backup & PITRFaibleActiver PITR sur des tables de dev/test (inutile).
Reserved Capacity : L'arme absolue (-77%)

Comme pour les EC2 Reserved Instances, vous pouvez vous engager sur un volume de WCU/RCU pour 1 ou 3 ans.
Condition : Être en mode Provisioned.

L'économie réelle
  • Engagement 1 an : ~50% de rĂ©duction.
  • Engagement 3 ans : ~77% de rĂ©duction.
  • Paiement : All Upfront (Moins cher) ou No Upfront.
Stratégie Mixte (Le "Waterline")

Ne réservez pas pour votre pic !

  • Base stable (Waterline) : Couvrir avec de la Reserved Capacity (pas cher).
  • Pics variables : Laisser l'Auto-Scaling gĂ©rer le surplus en tarif standard.
Total Cost = (Reserved * LowPrice) + (Burst * StandardPrice)
TTL (Time To Live) : Le Nettoyeur Gratuit

Supprimer des items avec DeleteItem coûte des WCU (donc de l'argent). Le TTL permet de supprimer des items expirés GRATUITEMENT.

Comment ça marche ?
  1. Ajoutez un attribut expire_at (Timestamp Unix) dans vos items.
  2. Activez le TTL sur cet attribut dans la console.
  3. Un processus d'arriÚre-plan AWS scanne et supprime les items expirés (sous 48h).
  4. Coût WCU : 0.
Table Class Standard vs IA

Si vous stockez des logs ou historiques > 100 GB rarement accédés :
Activez la classe Standard-IA (Infrequent Access).
Gain : Stockage -60% moins cher.
Risque : Les lectures/Ă©critures sont plus chĂšres (+25%). À n'utiliser que si vous lisez rarement.

Coûts Réseau : Le Tueur Silencieux

Si vos Lambda/EC2 sont dans un VPC privé et accÚdent à DynamoDB via une NAT Gateway, vous payez des frais de traitement de données (0.045$/GB).

La Solution : Gateway VPC Endpoint
  • CoĂ»t : 100% Gratuit.
  • Performance : Le trafic reste dans le rĂ©seau privĂ© AWS (pas d'internet).
  • SĂ©curitĂ© : Permet de verrouiller l'accĂšs Ă  la table uniquement depuis votre VPC.
# Terraform resource "aws_vpc_endpoint" "dynamodb" { vpc_id = aws_vpc.main.id service_name = "com.amazonaws.us-east-1.dynamodb" vpc_endpoint_type = "Gateway" route_table_ids = [aws_route_table.private.id] }
Chasse au Gaspillage : Top 5 des erreurs
Erreur FinOpsPourquoi c'est cher ?Correction
Scan au lieu de QueryVous payez pour lire TOUTE la table, mĂȘme si vous filtrez 99% des rĂ©sultats aprĂšs.CrĂ©er un GSI adaptĂ© Ă  la recherche.
Noms d'attributs longsDans DynamoDB, {"customer_creation_date": ...} est stockĂ© Ă  chaque ligne. Ça gonfle le stockage et les WCU.Utiliser des noms courts (ex: "d" pour date) ou compresser le JSON avant Ă©criture.
GSIs inutilisésChaque écriture dans la table principale est répliquée dans le GSI (WCU x2).Supprimer les indexes qui ne servent pas aux patterns de lecture.
Dev en On-DemandLes développeurs lancent des scripts de load-test qui font 10k écritures/sec.Mettre les tables de Dev en Provisioned avec un cap (ex: max 5 WCU) pour bloquer les abus.
Attribute Projection : ALLLe GSI copie des attributs énormes dont vous n'avez pas besoin.Utiliser KEYS_ONLY ou INCLUDE dans la définition du GSI.
1.1 Concept Fondamental : Key-Value & Document
La Double Nature de DynamoDB

DynamoDB est un hybride puissant. Il combine la vitesse d'un stockage Clé-Valeur (comme Redis) avec la flexibilité d'une base Document (comme MongoDB).

Aspect Key-Value

Tout accÚs commence par une Clé Primaire (PK).
C'est ce qui garantit la performance (O(1)).
Exemple : "Donne-moi l'objet oĂč PK=User#123".

Aspect Document

La valeur stockée n'est pas juste une chaßne, mais un JSON complexe.
DynamoDB "comprend" ce JSON. Vous pouvez dire : "Mets Ă  jour seulement le champ 'adresse.ville' sans toucher au reste".

Les Types de Données Supportés

DynamoDB utilise un format JSON typé spécifique (Marshalled JSON).

CatégorieTypesDescription
ScalairesS (String)
N (Number)
B (Binary)
BOOL (Boolean), NULL
Données simples.
Note : Les nombres sont stockés comme Strings pour éviter la perte de précision.
Ensembles (Sets)SS (String Set)
NS (Number Set)
BS (Binary Set)
Liste de valeurs uniques. L'ordre n'est pas garanti.
Exemple : Tags d'un article ["Tech", "Cloud", "AWS"]. DynamoDB dédoublonne auto.
DocumentsL (List)
M (Map)
Structures imbriquées complexes.
List : Tableau ordonné ["a", 1, {b:2}].
Map : Objet JSON {"rue": "Paix", "cp": 75000}.
"Schemaless" ne veut pas dire "Anarchie"

Contrairement à SQL, vous ne définissez pas les colonnes à l'avance (sauf la Clé Primaire).

Item 1 (User): { PK: "101", Nom: "Alice", Age: 25 } Item 2 (User): { PK: "102", Nom: "Bob", IsAdmin: true }

Les deux items cohabitent dans la mĂȘme table. L'item 2 a un champ IsAdmin que l'item 1 n'a pas. C'est normal.

Avantage Dev :
Pas de migration de schéma (`ALTER TABLE`) quand vous ajoutez une fonctionnalité. Vous commencez juste à écrire le nouvel attribut.
Inconvénient :
C'est votre code (Application) qui doit gérer la validation. Si un champ manque, votre code ne doit pas crasher (Null Safety).
La Limite Fatidique : 400 KB

Un item DynamoDB (Nom de colonnes + Valeurs) ne peut pas dépasser 400 Kilo-octets. C'est une limite dure (Hard Limit).

Ce qu'on ne stocke PAS
  • Images, PDF, VidĂ©os (Blobs).
  • Historiques de logs infinis dans une seule Liste.
  • Articles de blog trĂšs longs (HTML brut).
Le Pattern "S3 Pointer"

Si la donnée est grosse (> 400KB), stockez-la dans S3. Dans DynamoDB, stockez uniquement l'URL (ou la clé S3) et les métadonnées.
Ex: `{ "PK": "Video#1", "Title": "Vacances", "S3Url": "s3://my-bucket/v1.mp4" }`

1.2 Structure : Table, Item & Primary Key Design
L'Anatomie d'une Base DynamoDB

Contrairement Ă  SQL oĂč l'on a des "Schemas" et des "Relations", DynamoDB est plat mais structurĂ©.

Table

Le conteneur racine.
RÚgle : Pas de jointures entre tables. En général, on essaie de mettre toutes les données dans UNE seule table (Single Table Design).

Item

Un enregistrement unique (max 400KB).
Identifié obligatoirement par sa Clé Primaire complÚte.
C'est l'unité de lecture/écriture atomique.

Attribute

Un champ de donnée (Nom, Age, Adresse).
DynamoDB est Schemaless : sauf pour la clé primaire, les attributs peuvent varier d'un item à l'autre.

Clé Primaire Simple (Partition Key Only)

Utilisée quand vous voulez accéder à un item unique via un ID unique (Key-Value Store classique).

  • Structure : 1 seul attribut (ex: UserID).
  • UnicitĂ© : Il ne peut y avoir qu'un seul item avec cet ID dans toute la table.
  • OpĂ©rations : GetItem (Lire 1), PutItem (Écrire 1). Impossible de faire des requĂȘtes de plage ("Donne moi tous les users qui...").
Table: Users ----------------------------- PK (Partition) | Nom | Age ----------------------------- user_123 | Alice| 25 user_456 | Bob | 30 ----------------------------- RequĂȘte possible : GetItem(PK="user_123") RequĂȘte impossible : "Tous les users de 25 ans" (sauf Scan couteux)
Clé Primaire Composite (Partition Key + Sort Key)

C'est ici que réside la puissance de DynamoDB. Elle permet de modéliser des relations 1-N (Un User a N Commandes).

ComposantRĂŽle PhysiqueExemple (E-commerce)
Partition Key (PK)Groupe les donnĂ©es ensemble sur le mĂȘme disque SSD.CUSTOMER#123
Sort Key (SK)Trie les données à l'intérieur de la partition.ORDER#2023-10-01
ORDER#2023-11-05
La Puissance du "Query"

Avec une SK, vous pouvez utiliser l'opérateur Query :

// Récupérer toutes les commandes du client 123 SELECT * FROM Table WHERE PK="CUSTOMER#123" // Récupérer les commandes d'Octobre 2023 SELECT * FROM Table WHERE PK="CUSTOMER#123" AND SK BEGINS_WITH("ORDER#2023-10")
Item Collections : Le concept de "Dossier"

Une Item Collection est l'ensemble de tous les items partageant la mĂȘme Partition Key, mais avec des Sort Keys diffĂ©rentes.

Visualisation

[ PK: TEAM#A ] <-- C'est le "Dossier" (Item Collection) ├── [ SK: METADATA ] -> { TeamName: "Lakers", City: "LA" } ├── [ SK: PLAYER#01 ] -> { Name: "LeBron", Position: "SF" } ├── [ SK: PLAYER#03 ] -> { Name: "Davis", Position: "C" } └── [ SK: GAME#2023 ] -> { Date: "2023-12-25", Score: "..." }

Avantage Performance : Vous pouvez rĂ©cupĂ©rer les infos de l'Ă©quipe, ses joueurs et ses matchs en UNE SEULE REQUÊTE rĂ©seau (Query sur PK=TEAM#A). C'est bien plus rapide qu'un JOIN SQL.
Les Commandements du Design
1. CardinalitĂ© ÉlevĂ©e pour la PK

Mauvais : PK = "Status" (seulement 3 valeurs : Pending, Done, Error). Crée des "Hot Partitions".
Bon : PK = "UserID" (Millions de valeurs). Répartit la charge.

2. Naming Générique

Ne nommez pas vos colonnes UserID et OrderID. Nommez-les PK et SK.
Cela permet de stocker des entitĂ©s diffĂ©rentes (Users, Produits) dans la mĂȘme table sans conflit de nommage.