Chiave primaria composita DynamoDB: spiegazione della partizione + chiave di ordinamento
Una chiave primaria composita è composta da due attributi: una chiave di partizione e a chiave di ordinamento. La chiave di partizione decide dove risiede un elemento; la chiave di ordinamento ordina gli elementi all'interno di quella partizione.
Venendo da SQL, pensala meno come una colonna id unica e più come
GROUP BY partition, ORDER BY sort inserito nel tavolo stesso.
Cos'è una chiave primaria composita DynamoDB?
Una chiave primaria composita DynamoDB combina due attributi: una chiave di partizione e a
chiave di ordinamento. La chiave di partizione decide in quale partizione fisica risiede un elemento;
la chiave di ordinamento ordina gli elementi all'interno di quella partizione. Insieme formano l'articolo
identità univoca e lasciare che un singolo Query restituisca un intervallo ordinato anziché uno
elemento.
- Due parti, due lavori. La chiave di partizione instrada l'elemento a un indirizzo fisico partizione; la chiave di ordinamento ordina ogni elemento che condivide quella chiave di partizione.
- L'unicità è la coppia. Due elementi possono condividere il valore di una chiave di partizione purché poiché le loro chiavi di ordinamento differiscono: è così che una partizione contiene molte righe.
- La chiave di ordinamento è il punto. È ciò che consente a
Querydi restituire un intervallo (>=,between,begins_with) invece di un articolo, senzaScan. - Le chiavi devono essere scalari. Le chiavi di partizione e ordinamento possono essere solo stringhe, numeri, o binario: nessuna mappa, nessun elenco (documenti AWS).
Chiave semplice e chiave composita
Una chiave primaria semplice è semplicemente una chiave di partizione. Identifica in modo univoco un
elemento e lo rileggi con GetItem. Questo è tutto: nessuna lettura dell'intervallo, no
"dammi la N più recente".
Una chiave composita aggiunge la chiave di ordinamento e quella singola aggiunta è ciò che crea DynamoDB sembra un database anziché una mappa hash.
| Chiave semplice | Chiave composita | |
|---|---|---|
| Attributes | Solo partition key | partition key + tasto di ordinamento |
| Unicità | Valore partition key | La coppia di valori |
| Più elementi per partizione | No | Sì |
Query una gamma | No (solo GetItem) | Sì (begins_with, between, >) |
| Vestibilità naturale | Ricerca per ID | Serie temporali, uno-a-molti, storia |
Modella una tabella delle letture dei sensori
Supponiamo che tu raccolga campioni di temperatura da una flotta di sensori sul campo. L'accesso il modello è "ottieni le letture per un dispositivo, prima il più recente, entro un tempo". finestra". Questa è una chiave composita da manuale.
Utilizza l'ID del dispositivo come chiave di partizione e il timestamp di lettura come chiave di ordinamento:
| deviceId | readingTs | tempC | humidity |
|---|---|---|---|
| DEV#a1b2 | 2026-06-23T08:00:00Z | 21.4 | 48 |
| DEV#a1b2 | 2026-06-23T08:05:00Z | 21.7 | 47 |
| DEV#a1b2 | 2026-06-23T08:10:00Z | 22.1 | 46 |
| DEV#c9d8 | 2026-06-23T08:00:00Z | 19.8 | 55 |
Tutte e tre le letture DEV#a1b2 arrivano nella stessa partizione, archiviate fisicamente
insieme e ordinati per readingTs.
AWS chiama la chiave di partizione attributo hash e la chiave di ordinamento intervallo attributo: la chiave di ordinamento è un intervallo all'interno del quale è possibile eseguire la scansione (Documenti AWS).
Gli elementi vengono compressi in un sotto ciascuna partizione chiave:
Un Query contro la chiave di partizione legge ogni lettura per quel dispositivo,
già in ordine di timestamp: nessun ordinamento sul client, nessun secondo viaggio di andata e ritorno.
Quanto costa quella finestra
Dieci letture da 2 KB ciascuna nella partizione ammontano a 20 KB misurati. Colpi DynamoDB
legge per blocco da 4 KB, quindi un Query eventualmente coerente su quella finestra costa
3 unità di richiesta di lettura (20 KB → cinque blocchi da 4 KB × 0,5 RCU ciascuno). A
la lettura fortemente coerente sulla stessa finestra costa 5 unità (un RCU per blocco).
Recupera le stesse dieci righe con dieci chiamate GetItem separate e il blocco minimo
la regola si applica per articolo → 5 unità coerenza eventuale, 10 fortemente
coerente, prima di contare i viaggi di andata e ritorno extra.
| Leggi il modello | Items | Dati toccati | Unità di lettura EC |
|---|---|---|---|
Un Query, readingTs tra inizio e fine | 10 | 20KB | 3 |
10 × GetItem su chiave composita completa | 10 | 20KB | 5 |
Solo partizione Query, filtra l'umidità nell'app | 10 | 20KB | 3 |
Tabella Scan, filtro deviceId + finestra temporale | tutto | tavola intera | a misura di tavolo |
Supera ReturnConsumedCapacity: TOTAL durante la prototipazione; il
calcolatore dei prezzi trasforma il conteggio delle unità in
un elemento pubblicitario mensile una volta che conosci le richieste al secondo.
Query la gamma, non scansionarla
Poiché readingTs è una stringa ISO-8601, viene ordinata lessicograficamente allo stesso modo
modo in cui viene ordinato cronologicamente. Quindi una lettura in una finestra temporale è un intervallo di condizioni chiave,
non un filtro:
Query
deviceId = "DEV#a1b2"
readingTs BETWEEN "2026-06-23T08:00:00Z" AND "2026-06-23T08:10:00Z"
Questo è un KeyConditionExpression: restringe la lettura prima di DynamoDB
restituisce i dati, quindi paghi solo per gli articoli in vetrina. Un FilterExpression
viene eseguito dopo la lettura e ti fattura tutto ciò che ha scansionato; quello è
la pistola Scan in miniatura.
L'espressione stessa, con segnaposto e valori digitati, è complicata da scrivere
a mano. Costruiscilo visivamente con il
DynamoDB Expression Builder e copiare il file
esatto KeyConditionExpression nella tua chiamata SDK.
Progetta la chiave di ordinamento appositamente
La chiave di ordinamento è l'unica leva per le letture dell'intervallo, quindi modellalo in base alle tue domande.
- Utilizza un timestamp ordinabile. Stringhe ISO-8601 o numeri di epoca ordinare correttamente; le date localizzate grezze no.
- Prefisso per uno-a-molti. Una chiave di ordinamento simile
READING#2026-06-23T08:00:00Zti consente di combinare tipi di entità in un'unica partizione e affettarli conbegins_with. Questa è la cucitura design a tabella singola. - Inserisci la dimensione ad alta cardinalità nella chiave di partizione. L'ID del sensore ha
migliaia di valori, quindi si diffonde in modo uniforme. Una partizione a bassa cardinalità
chiave (ad esempio,
region) crea un .
Una chiave di partizione con solo cinquanta valori distinti su 10.000 scritture al secondo il flusso concentra ~200 WCU per partizione logica prima che DynamoDB si divida — bene su scala prototipo, doloroso su scala di produzione. Preferisco identificatori che crescere con la tua flotta (ID dispositivo, ID tenant, ID sessione) su raggruppamenti grossolani a meno che non si collochi deliberatamente un set di dati delimitato.
Quando una chiave composita ti morde
Le chiavi composite sono un impegno. Scegli una chiave di partizione, spedisci, quindi scoprire un modello di accesso che necessita di un raggruppamento diverso: "all rilevamenti superiori a 30°C su tutta la flotta".
La tabella base non può rispondere a questa domanda; la chiave di partizione è fissa. Le tue opzioni sono a indice secondario globale con una chiave diversa, oppure ristrutturazione.
Enumerare le tue letture prima di confermare lo schema delle chiavi. Modifica di una chiave primaria
significa una migrazione della tabella, non un ALTER TABLE.
In DynoTable, apri il browser delle tabelle ed esamina una tabella a chiave composita affiancata lato con i suoi GSI: l'ordinamento sulla chiave di ordinamento è visibile riga per riga, che rende evidenti i formati di timestamp sfalsati prima che raggiungano la produzione.
Passaggi successivi
Le chiavi composite rappresentano la base delle raccolte di elementi, uno a molti relazioni e progetti di indici più utili: leggi design a tabella singola e GSI vs LSI accanto per vedere dove conducono.
Disegna il tuo KeyConditionExpression nel file
DynamoDB Expression Builder, emette il file full
impaginato Query nel costruttore di query, quindi
prova DynoTable per sfogliare le tue partizioni reali e guardarne l'ordinamento
ordina la fila contro i tuoi tavoli.