Intermedio7 min di lettura

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 Query restituisce 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:

PKSKattributes
WS#acmeMETAname, plan, seats
WS#acmeDOC#a1#METAtitle, owner, wordCount
WS#acmeDOC#a1#CMT#0007author, body, createdAt
WS#acmeDOC#a1#CMT#0008author, 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à:

PKSKEntityTypetitle
WS#acmeMETAWorkspace
WS#acmeDOC#a1#METADocumentQ3 Roadmap
WS#acmeDOC#a1#CMT#0007Comment

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.

Query PK = 'WS#acme'Partizione mistaTipo entità: 'Area di lavoro'Tipo entità: 'Documento'Tipo entità: 'Commento'Percorso per tipo

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:

AvvicinamentoQuanto costaQuando utilizzare
FilterExpression sul tipoLegge tutti gli elementi corrispondenti, li fattura tutti, elimina le corrispondenze non corrispondenti dopo la letturaNel risultato sono rare le entità miste; spedizione veloce
Indice sparso (GSI1PK scritto solo sull'entità target)Solo l'entità che desideri arriva nell'indiceUn'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.

Aggiornato