Sovraccarico dei tasti in DynamoDB
Venendo da SQL, una colonna significa sempre una cosa: orders.created_at è sempre a
data, users.email è sempre un'e-mail. Sovraccarico chiave lo elimina. Tu
assegna alla partizione e ai nomi generici — pk, sk — e lascia che ogni elemento venga digitato
attribuire loro un significato diverso. Una tabella, tante entità, una forma.
Cos'è l'overload dei tasti in DynamoDB?
L'overload delle chiavi memorizza molti tipi di entità in una tabella con nomi di chiavi generici come pk/sk, codificando il tipo nel valore (USER#u_3001, INVOICE#2026-0014). Il nome dell'attributo rimane neutrale in modo che utenti, fatture ed eventi condividano una partizione; il valore trasporta il tipo e un prefisso della chiave di ordinamento consente a un Query di suddividere ciascuna entità tramite begins_with.
- Nomi di chiavi generici, valori digitati. Assegna un nome alle chiavi
pk/ske inserisci l'entità digitare il valore:pk = "TENANT#acme",sk = "USER#u_3001". Il nome è stupido; il valore porta il tipo. - È ciò che fa funzionare la progettazione a tabella singola. Senza sovraccarico, una tabella condivisa
è solo un cassetto della spazzatura. Con esso, ogni entità si trova in una partizione che puoi
Query. begins_withè il vantaggio. Un prefisso del tipo sulla chiave di ordinamento consente a unQueryestrai un'intera entità, o una sua parte, senzaScane senza filtro.- Il costo: leggibilità. Un dump grezzo di
pk/sknon ti dice nulla. Hai bisogno di un visualizzatore che decodifica i prefissi, altrimenti strizzerai gli occhi per vedere le stringhe.
Perché i nomi generici battono quelli reali
DynamoDB fornisce al massimo due attributi chiave per tabella e Query può indirizzare solo un
chiave di partizione singola. Pertanto, se assegni alla chiave il nome userId, solo gli elementi utente possono risiedere
quella tabella in modo pulito: tutto il resto deve simulare un userId o spostarsi sulla propria tabella.
Il sovraccarico lo evita. Un nome neutrale come pk non vincola alcuna entità,
quindi un utente, una fattura e un evento di controllo possono condividere tutti lo stesso attributo chiave e
lo stesso tavolo. Il valore, non il nome dell'attributo, indica qual è l'oggetto.
Questa è la mossa che trasforma il design a tabella singola. teoria in qualcosa che puoi effettivamente interrogare. La tabella condivisa è il contenitore; il sovraccarico è ciò che fa coesistere entità distinte al suo interno.
Un esempio multi-tenant
Supponiamo che tu gestisca un prodotto di fatturazione SaaS. Ogni inquilino ha membri, fatture e un controllo sentiero. Invece di tre tabelle, inseriscile tutte in una e sovraccarica le chiavi:
| pk | sk | attributes |
|---|---|---|
| TENANT#acme | META | name="Acme Inc", plan="team" |
| TENANT#acme | USER#u_3001 | email, role="admin" |
| TENANT#acme | USER#u_3002 | email, role="member" |
| TENANT#acme | INVOICE#2026-0014 | amount_cents, status="paid" |
| TENANT#acme | INVOICE#2026-0015 | amount_cents, status="open" |
| TENANT#acme | EVENT#2026-06-23T09:12Z | actor="u_3001", action="invite" |
Ogni riga condivide pk = "TENANT#acme", quindi formano un — tutti
co-locati, tutti raggiungibili in un'unica partizione letta.
Il prefisso sort-key sta facendo il vero lavoro. Raggruppa le entità e le ordina.
Query la raccolta sovraccarica
Poiché il tipo risiede nel prefisso della chiave di ordinamento, begins_with suddivide la partizione in base a
entità senza scansionare nulla:
Query pk = "TENANT#acme" -- the entire tenant, every type
Query pk = "TENANT#acme" AND begins_with(sk, "USER#") -- just members
Query pk = "TENANT#acme" AND begins_with(sk, "INVOICE#") -- just invoices
Paghi solo per gli articoli che corrispondono alla condizione, non per l'intera partizione: il
l'opposto di un Scan filtrato, dove si paga per leggere le righe
poi butti via. AWS la chiama condizione chiave; funziona prima sui tasti
tutti i dati lasciano la partizione.
Se costruisci manualmente la condizione begins_with, ottieni i tag di tipo corretti: un randagio
USERS# invece di USER# non restituisce nulla, in silenzio. Il
costruttore di espressioni genera il file
KeyConditionExpression e ExpressionAttributeValues mappano quindi i prefissi
corrisponde a ciò che hai effettivamente scritto.
Sovraccarica anche l'indice
Lo stesso trucco si applica a un . Assegna nomi di chiavi generici: gsi1pk, gsi1sk.
e lascia che ogni entità scriva tutto ciò di cui ha bisogno. Un indice quindi risponde ai modelli
il tavolo base non può.
| pk | sk | gsi1pk | gsi1sk |
|---|---|---|---|
| TENANT#acme | INVOICE#2026-0015 | STATUS#open | 2026-06-30 |
| TENANT#acme | INVOICE#2026-0014 | STATUS#paid | 2026-06-12 |
| TENANT#beta | INVOICE#2026-0099 | STATUS#open | 2026-06-25 |
Ora Query gsi1 WHERE gsi1pk = "STATUS#open" elenca tutte le fatture aperte in tutto
tenant, in ordine di data di scadenza: una visualizzazione tra partizioni con ambito tenant della tabella di base
le chiavi non potrebbero mai servire. Un'entità diversa può riutilizzare gsi1 con il proprio significato
(ad esempio gsi1pk = "ROLE#admin"), quindi un indice copre diverse letture. Ricorda solo a
GSI è coerenza eventuale — le sue scritture sono in ritardo rispetto alla tabella di base.
Fallo in DynoTable
Le chiavi grezze sovraccaricate sono ostili da leggere: INVOICE#2026-0015 e
EVENT#2026-06-23T09:12Z si confondono in un elenco piatto. Un visualizzatore che raggruppa per
partiziona e fa emergere i prefissi trasformando il cassetto della spazzatura in entità.

Insidie
- Scegli i delimitatori una volta e non cambiarli mai.
#è la convenzione. Miscelazione#e:tra entità interrompebegins_within modi di cui nulla ti avvisa. - Non sovraccaricare i valori che richiedono calcoli di intervallo. Una chiave di ordinamento di
INVOICE#2026-0015ordina lessicalmente, non numericamente: ID e utilizza ISO-8601 date in modo che l'ordine delle stringhe corrisponda all'ordine che intendi. - Riserva lo spazio dei nomi del prefisso. Due tipi di entità che iniziano entrambi con
USER(ad esempioUSER#eUSERGROUP#) entreranno in collisione sottobegins_with(sk, "USER"). Fare prefissi inequivocabili fin dal primo carattere. - Pianifica la lettura prima delle chiavi. Il sovraccarico serve i modelli di accesso che hai enumerato. Se non conosci ancora le tue letture, vedi design a tabella singola prima: i tasti sono a valle delle domande.
Mappa una partizione, quindi scarica DynoTable per sfogliare la tua
chiavi sovraccariche e guarda un Query tirare indietro un intero inquilino in una volta.
Costo Query su una partizione sovraccarica
Elenco di tutti i membri sotto TENANT#acme con
begins_with(sk, "USER#") legge solo le righe utente, non fatture o eventi,
perché la condizione chiave filtra prima che i dati lascino la partizione. Su un inquilino
con 200 utenti (2 KB ciascuno) e 5.000 eventi di controllo (1 KB ciascuno), che eseguono query
tocca ~400 KB (~100 RCU eventualmente coerenti). Un Scan su tutto il tavolo
per trovare gli utenti misurerebbe ogni articolo in ogni inquilino.
Incolla gli elementi rappresentativi sovraccarichi nel file calcolatore delle dimensioni dell'articolo, quindi elenco delle stime query nel calcolatore dei prezzi.
Progetta con lo strumento tabella singola
Immettere le entità (Tenant, Utente, Fattura, Evento) e i modelli di accesso ("elenco utenti
per inquilino", "fatture aperte tra inquilini") nel file
strumento di progettazione a tabella singola. Propone
Modelli pk/sk e chiavi GSI che corrispondono ai prefissi di sovraccarico che utilizzerai
in produzione, prima di impegnare CloudFormation.
Emette query dai pattern
Una volta corretti i prefissi, crea le condizioni chiave nel file
costruttore di espressioni ed esportare un file impaginato
programma dal costruttore di query. Errori di battitura del prefisso
(USER# vs USERS#) restituiscono set vuoti senza errori: espressioni generate
ridurre quella modalità di errore silenzioso.
Registro dei prefissi del tipo di entità
Mantieni una breve tabella interna a cui gli sviluppatori possono fare riferimento:
| Entità | Ordina prefisso | Esempio SK | Fetta Query |
|---|---|---|---|
| Meta inquilino | META | META | Ottieni un singolo articolo |
| Utente | USER# | USER#u_3001 | begins_with(sk, "USER#") |
| Fattura | INVOICE# | INVOICE#2026-0015 | begins_with(sk, "INVOICE#") |
| Evento | EVENT# | EVENT#2026-06-23T09:12Z | coda ordinata nel tempo con lettura discendente |
I nuovi tipi di entità devono scegliere prefissi che non entrino in conflitto con begins_with di
prefissi esistenti: USER# e USERGROUP# corrispondono entrambi a begins_with(sk, "UTENTE") a meno che non si allunghi o si delimiti con attenzione.


