Ordinamento DynamoDB su un attributo che cambia
Modelli una chiave di ordinamento attorno a un attributo in modo da poter eseguire query sugli elementi nel suo ordine, quindi il file modifiche degli attributi. Lo stato di un ticket, lo stato di un ordine, la priorità di un'attività. DynamoDB regola: non è possibile aggiornare un attributo chiave sul posto. Una chiave primaria è immutabile per la vita dell'oggetto. Modifica un valore che fa parte della chiave e non stai modificando un file item: lo stai spostando, cosa che DynamoDB te lo fa fare esplicitamente.
Puoi cambiare una chiave di ordinamento DynamoDB?
No. Una chiave di ordinamento fa parte della chiave primaria e gli attributi della chiave DynamoDB sono immutabili — UpdateItem non può modificare una partizione o un valore della chiave di ordinamento e non esiste alcuna operazione di "spostamento elemento". Per modificarlo, elimina il vecchio elemento e inseriscine uno nuovo, oppure mantieni invece il valore volatile su una chiave di ordinamento GSI.
- Gli attributi chiave sono immutabili. Non è possibile
UpdateItemuna partizione o una chiave di ordinamento valore — DynamoDB non ha alcuna operazione di "spostamento oggetto". - Per modificare un valore chiave, elimini il vecchio elemento e ne inserisci uno nuovo — idealmente in a transazione quindi è atomico.
- Meglio: mantieni il valore volatile fuori dalla chiave della tabella base e inseriscilo in a GSI invece la chiave di ordinamento — Le chiavi GSI possono cambiare, perché in aggiornamento l'elemento base ripropaga semplicemente la voce dell'indice.
- Scegli chiavi di ordinamento che non cambiano (timestamp, ID immutabili) ogni volta che accedi il modello lo consente.
Il problema: uno stato in base al quale vuoi ordinare, che continua a cambiare
Supponiamo che tu gestisca un desk di supporto e desideri elencare i ticket di una squadra ordinati per stato, quindi tu inserisci lo stato nella chiave di ordinamento:
PK: TEAM#7 SK: STATUS#open#TICKET#8842Ora il ticket passa a "in sospeso". Ti piacerebbe semplicemente UpdateItem la chiave di ordinamento
STATUS#pending#TICKET#8842 — ma DynamoDB rifiuta qualsiasi scrittura che modifichi una chiave
attributo. La chiave è l'indirizzo dell'articolo; non è possibile modificare l'indirizzo sul posto. Il
lo stato in base al quale hai scelto di ordinare è esattamente ciò che non sta fermo.
Opzione 1: elimina e ricrea (atomicamente)
Se il valore deve risiedere nella chiave della tabella base, modificarlo significa rimuovere il vecchio elemento e scrivendo quello nuovo:
1. DeleteItem PK=TEAM#7 SK=STATUS#open#TICKET#8842
2. PutItem PK=TEAM#7 SK=STATUS#pending#TICKET#8842 (same attributes)Fallo all'interno di un TransactWriteItems in modo che il comando delete e
il put o entrambi riescono o entrambi falliscono, altrimenti uno scontro tra di loro perde il
biglietto o lo duplica. Funziona, ma ogni cambiamento di stato ora è di due scritture più a
transazione; va bene per cambi occasionali, costoso per quelli caldi.
Opzione 2: mantieni il valore modificabile fuori dalla chiave base (preferibile)
Rendi la chiave della tabella base qualcosa di immutabile (l'ID del ticket) e inserisci il valore volatile e ordinabile su una chiave di ordinamento GSI.
Base: PK: TICKET#8842 status: "open" teamId: TEAM#7
GSI: GSI1PK: TEAM#7 GSI1SK: STATUS#open#TICKET#8842Ora la modifica dello stato è un semplice UpdateItem nell'attributo status dell'articolo base —
che DynamoDB consente, perché status non è una chiave della tabella base. DynamoDB allora
ripropaga automaticamente la voce GSI nella sua nuova posizione ordinata. Una chiamata API,
con atomicità gestita per te: nessuna transazione, nessuna danza di eliminazione (sotto il cofano DynamoDB
elimina comunque la vecchia voce di indice e scrive quella nuova, quindi una modifica indicizzata costa ~ 3
scrivere unità contro i ~4 di un delete-and-put transazionale).
Il GSI è eventualmente coerente e costa spazio di archiviazione/scrittura extra, ma per un valore che cambia spesso, è un po' più economico (~ 3 vs 4 unità di scrittura) e molto più semplice dell'eliminazione e ricreazione ad ogni modifica.
Progettare le chiavi in DynoTable
Costruisci e visualizza in anteprima le condizioni chiave sia per la lettura di base che per la lettura GSI nel file DynamoDB generatore di espressioni.
In DynoTable, scegli quindi quale indice viene eseguito da una query e guardi il volatile ordinamento dei valori su GSI mentre l'elemento base mantiene la tua chiave immutabile: entrambi si leggono fianco a fianco lato sui dati reali.

Insidie + passaggi successivi
- Non provare mai a
UpdateItemun attributo chiave — viene rifiutato; i valori chiave sono fissi per la vita dell'oggetto. - Se devi spostarlo, elimina+inserisci una transazione - mai come due incustoditi scrive.
- Preferisci chiavi di base immutabili + a GSI per qualsiasi attributo in base al quale ordini e muti.
- Non dimenticare GSI eventuale coerenza — la voce riordinata appare dopo un breve ritardo di propagazione.
- Correlati: strategie di ordinamento chiave, GSI vs LSI, transazioni.
Vuoi vedere come viene ordinato un attributo mutabile su GSI rispetto alla tabella di base? Scarica DynoTable ed esplora direttamente i tuoi indici.
Costo di scrittura: elimina e inserisci rispetto all'aggiornamento GSI
Confronto approssimativo WCU per un elemento del ticket da 1 KB in us-east-1 on-demand (effettivo
la fatturazione segue le regole di arrotondamento AWS):
| Modello | API chiama | Impatto tipico WCU |
|---|---|---|
| Eliminazione transazionale + inserimento chiave di base | TransactWriteItems (2 op) | ~2× dimensioni dell'articolo per operazione nei prezzi delle transazioni |
Aggiorna l'attributo status; GSI si ripropaga | Un UpdateItem | Scrittura base + scrittura GSI (~2 WCU per elemento da 1 KB + attribuzioni previste) |
Il percorso GSI evita l'orchestrazione a livello di applicazione ed elimina la finestra dove un arresto anomalo tra delete e put perde la riga. Fai scambi eventuale coerenza sull'indice letto per scritture più semplici.
Modella le dimensioni del tuo articolo e la frequenza di aggiornamento nel calcolatore dei prezzi quando lo stato cambia si attiva molte volte al minuto.
Sparse GSI per elenchi ordinati per stato
Se solo i ticket aperti necessitano di una coda ordinata per stato, utilizzare a
indice sparso: scrivi GSI1PK = TEAM#7 e
GSI1SK = STATUS#open#... solo mentre status = open. Quando il biglietto si chiude,
rimuovi o ometti gli attributi chiave GSI durante l'aggiornamento: l'elemento viene eliminato dal file
indice senza una chiave di ordinamento di base cancella e inserisci.
Ciò mantiene l'indice piccolo ed evita di indicizzare i ticket chiusi che non elenchi mai.
Chiavi di base immutabili da preferire
| Campo volatile | tabella base SK | Base migliore SK | Il campo volatile continua a vivere |
|---|---|---|---|
| Stato dell'ordine | STATO#spedito#ORD#99 | ORD#99 | GSI ordina o attribuisce |
| Priorità del compito | P#1#TASK#12 | TASK#12 | GSI ordina |
| Nome visualizzato dell'utente | NOME#alice#UTENTE#5 | UTENTE#5 | Attributo non chiave |
Timestamp e ID immutabili (CREATED#2026-06-27T10:00:00Z, TICKET#8842)
creare chiavi di ordinamento di base stabili quando è necessario un ordine cronologico sulla tabella di base
stesso.
Progetta il GSI prima della codifica
Mappare i modelli di accesso nel file
strumento di progettazione a tabella singola - inserisci "list
apri i ticket per squadra, ordine prioritario" e controlla il suggerimento GSI1PK /
Modelli GSI1SK. Quindi crea la condizione chiave nel file
costruttore di espressioni ed emette un file impaginato
eseguire una query con il costruttore di query per l'integrazione
test.
Leggi le tue scritture dopo il cambio di stato
Dopo UpdateItem, una lettura fortemente coerente sulla tabella base mostra il
nuovo "stato" immediatamente. Una query su GSI potrebbe ritardare brevemente. L'interfaccia utente lo scorre
il reindirizzamento a una coda ordinata GSI dovrebbe tollerare righe obsolete o recuperare dal
tabella base per ID quando la precisione è importante.


