L'attributo Tipo in DynamoDB
In SQL, la tabella di una riga è il tuo tipo — una riga in documents è un documento. A
La tabella singola DynamoDB mescola ogni entità sotto uno schema, quindi un elemento porta n
risposta integrata a "cos'è questo?".
L'attributo Type restituisce la risposta: una semplice stringa su ogni elemento nominando l'entità che rappresenta.
Qual è l'attributo Type in DynamoDB?
L'attributo Type è una semplice stringa che stampi su ogni elemento, come EntityType: "Document", che nomina l'entità rappresentata dall'elemento. Poiché una tabella singola unisce molte entità in uno schema, gli elementi non hanno un tipo incorporato. Il Tipo lo ripristina, quindi il tuo codice identifica le righe, filtra un GSI su un'entità e sopravvive alle migrazioni.
- Imprime un tipo su ogni scrittura. Un attributo —
EntityType: "Document"— su ogni articolo, senza eccezioni. Costa pochi byte e ti fa risparmiare in seguito. - Identifica le entità in una partizione mista. Un
Queryrestituisce spazi di lavoro, documenti e commenti insieme; il Tipo dice al tuo codice quale è quale senza analizzare i prefissi chiave. - Alimenta il filtraggio a entità singola su a. Proiettare il Type in un indice e puoi restringere un indice sovraccaricato esattamente a un tipo di entità.
- È la via di fuga per le migrazioni. Quando esporti per rimodellare o spostare un'entità nella propria tabella, il Tipo è la colonna su cui dividi.
Perché una tabella mista perde il tipo
Progettazione a tabella singola memorizza ogni entità in una
tabella dietro chiavi generiche come PK e SK. Questo è il punto: uno
Query restituisce un genitore e i suoi figli insieme. Ma significa che una partizione lo è
eterogeneo.
Prendi un'app SaaS per la collaborazione di documenti. Una partizione dell'area di lavoro contiene l'area di lavoro record, i suoi documenti e i commenti su tali documenti:
| PK | SK | attributes |
|---|---|---|
| WS#acme | META | name, plan, seats |
| WS#acme | DOC#a1#META | title, owner, wordCount |
| WS#acme | DOC#a1#CMT#0007 | author, body, createdAt |
| WS#acme | DOC#a1#CMT#0008 | author, body, createdAt |
Query PK = "WS#acme" restituisce tutti e quattro gli elementi in un'unica lettura fatturata. Ora il tuo
il codice ha un elenco di elementi grezzi e nessun modo affidabile per dire quale sia un documento e
che è un commento — a parte la corrispondenza delle stringhe con SK, che è fragile
momento in cui il formato della chiave cambia.
Timbra il tipo su ogni articolo
La correzione è un attributo su ogni scrittura, nominando l'entità:
| PK | SK | EntityType | title |
|---|---|---|---|
| WS#acme | META | Workspace | — |
| WS#acme | DOC#a1#META | Document | Q3 Roadmap |
| WS#acme | DOC#a1#CMT#0007 | Comment | — |
La diramazione su item.EntityType === "Document" è un controllo di uguaglianza stabile.
L'analisi di SK.startsWith("DOC#") && SK.includes("#CMT#") è un'ipotesi che non funziona
quando giri la chiave. Il Tipo disaccoppia la logica di lettura dalla codifica della chiave:
questa è la vera vittoria.
Una lettura restituisce tre tipi di entità; l'attributo Type instrada ciascun elemento al gestore destro senza toccare i tasti.
Filtra un GSI fino a un'entità
Il Tipo guadagna il tuo posto negli indici. Supponiamo che tu aggiunga un GSI premuto
GSI1PK = WS#acme, GSI1SK = aggiornatoAt per elencare "tutto ciò che è cambiato di recente in
questo spazio di lavoro, prima il più recente". Un indice sovraccarico spazia nei documenti e
commenti, ma l'interfaccia utente di un feed potrebbe richiedere solo documenti.
Due modi per restringerlo, e la differenza è il denaro:
| Avvicinamento | Quanto costa | Quando utilizzare |
|---|---|---|
FilterExpression sul tipo | Legge tutti gli elementi corrispondenti, li fattura tutti, elimina le corrispondenze non corrispondenti dopo la lettura | Nel risultato sono rare le entità miste; spedizione veloce |
Indice sparso (GSI1PK scritto solo sull'entità target) | Solo l'entità che desideri arriva nell'indice | Un'entità domina; vuoi zero rifiuti |
Su richiesta in us-east-1, un GSI Query che restituisce 100 elementi misti a 2 KB
ciascuno fattura circa 100 RCU eventualmente coerenti — e un FilterExpression su
"EntityType" misura comunque ogni riga prima di eliminare i commenti. Un indice scarno quello
non indicizza mai i commenti fattura solo le righe del documento. Modella entrambe le forme nel
calcolatore dei prezzi.
Un FilterExpression viene eseguito dopo che gli elementi sono stati letti e dopo che la capacità è stata modificata
consumato - AWS è esplicito che il filtraggio non riduce il costo di lettura
(Guida per sviluppatori DynamoDB: FilterExpression).
Filtrare per Tipo è onesto, non gratuito: paghi per i commenti che butti via.
Per restringere il feed ai documenti, la query comporta una condizione sul Tipo
attributo. Assembla FilterExpression, nomi e valori con il file
DynamoDB generatore di espressioni — emette il
#t = :doc segnaposto in modo da non intascare una parola riservata.
KeyConditionExpression GSI1PK = :ws
FilterExpression #t = :doc
ExpressionAttributeNames { "#t": "EntityType" }
ExpressionAttributeValues { ":ws": "WS#acme", ":doc": "Document" }
Desideri che l'indice contenga solo documenti e salti completamente il filtro? Scrivi
GSI1PK solo sugli elementi del documento — a .
Gli elementi senza la chiave GSI non si replicano mai nell'indice, quindi la lettura tocca
soli documenti. L'attributo Type è ciò che dice al tuo scrittore quali elementi
qualificarsi.
Mantieni il valore stabile e singolare
Scegli il valore una volta e trattalo come un'enumerazione. Documento, mai a volte Doc
e talvolta document: un valore alla deriva è peggio di nessun valore, perché your
i controlli di uguaglianza passano su un involucro e ignorano silenziosamente l'altro.
Un tipo per articolo. Se un oggetto sembra composto da due entità, di solito si tratta di un modello odore: dovrebbero essere due elementi, ciascuno nella propria raccolta o intervallo di chiavi di ordinamento, non una fila che indossa due cappelli.
Il vantaggio della migrazione
Il motivo per timbrare il Tipo prima che ne abbia bisogno: rimodellamento. Il consigliato il percorso di rimodellazione è esportare, trasformare, reimportare e esportare in blocco i documenti AWS S3 esattamente per questo tipo di rimodellamento offline (Esportazione DynamoDB in S3).
Quando arriva quel giorno, il Tipo è la colonna "GROUP BY". Vuoi sollevare commenti nella propria tabella o rinormalizzare l'esportazione in file per entità per un file magazzino di analisi? Hai diviso il dump su "EntityType". Senza di esso, sei tornato per decodificare le chiavi su milioni di righe.
Passaggi successivi
Un attributo Type è un'assicurazione economica. Usalo per identificare le entità in una lettura mista, filtrare un GSI sovraccarico e diviso in modo netto quando rimodelli. Stampalo su ogni scrittura fin dal primo giorno: adattarlo a una tabella live significa riempirlo completamente.
Lettura correlata: progettazione a tabella singola per
modello di partizione mista che serve, GSI vs LSI per
scegliendo la forma dell'indice dietro un indice sparso e
Query vs Scan per sapere perché un FilterExpression non viene mai salvato
hai letto il costo.
Costruisci il filtro sul Tipo con il DynamoDB generatore di espressioni e prova DynoTable per sfogliare una vera tabella di entità miste e vedere il Tipo colonna allineata su ogni elemento.