Principiante8 min di lettura

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 Query di restituire un intervallo (>=, between, begins_with) invece di un articolo, senza Scan.
  • 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 sempliceChiave composita
AttributesSolo partition keypartition key + tasto di ordinamento
UnicitàValore partition keyLa coppia di valori
Più elementi per partizioneNo
Query una gammaNo (solo GetItem)Sì (begins_with, between, >)
Vestibilità naturaleRicerca per IDSerie 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:

deviceIdreadingTstempChumidity
DEV#a1b22026-06-23T08:00:00Z21.448
DEV#a1b22026-06-23T08:05:00Z21.747
DEV#a1b22026-06-23T08:10:00Z22.146
DEV#c9d82026-06-23T08:00:00Z19.855

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:

Partizione: DEV#a1b2readingTs 08:00readingTs 08:05readingTs 08:10Query deviceId = DEV#a1b2

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 modelloItemsDati toccatiUnità di lettura EC
Un Query, readingTs tra inizio e fine1020KB3
10 × GetItem su chiave composita completa1020KB5
Solo partizione Query, filtra l'umidità nell'app1020KB3
Tabella Scan, filtro deviceId + finestra temporaletuttotavola interaa 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:00Z ti consente di combinare tipi di entità in un'unica partizione e affettarli con begins_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.

Aggiornato