O atributo Type em DynamoDB
Em SQL, a tabela de uma linha é seu tipo — uma linha em documentos é um documento. Um
DynamoDB tabela única mistura todas as entidades sob um esquema, então um item não carrega
resposta integrada para "o que é isso?".
O atributo Type devolve essa resposta: uma string simples em cada item nomeando a entidade que representa.
Qual é o atributo Type em DynamoDB?
O atributo Type é uma string simples que você carimba em cada item — como EntityType: "Document" — nomeando a entidade que o item representa. Como uma tabela única mistura muitas entidades em um esquema, os itens não carregam nenhum tipo integrado. O Type o coloca de volta, para que seu código identifique linhas, filtre um GSI para uma entidade e sobreviva às migrações.
- Carimbe um tipo em cada gravação. Um atributo —
EntityType: "Document"— em cada item, sem exceções. Custa alguns bytes e economiza mais tarde. - Identifica entidades em uma partição mista. Um
Queryretorna espaços de trabalho, documentos e comentários juntos; o Type informa ao seu código qual é qual sem analisar prefixos de chave. - Ele alimenta a filtragem de entidade única em um. Projete o tipo em um índice e você pode restringir um índice sobrecarregado a exatamente um tipo de entidade.
- É a sua saída de emergência para migrações. Quando você exporta para remodelar ou mover uma entidade para sua própria tabela, o Tipo é a coluna na qual você divide.
Por que uma tabela mista perde o tipo
Design de tabela única armazena todas as entidades em uma
tabela atrás de chaves genéricas como PK e SK. Esse é o ponto principal - um
Query retorna um pai e seus filhos juntos. Mas isso significa que uma partição é
heterogêneo.
Pegue um aplicativo SaaS de colaboração documental. Uma partição do espaço de trabalho contém o espaço de trabalho registro, seus documentos e os comentários sobre esses documentos:
| 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" devolve todos os quatro itens em uma leitura faturada. Agora seu
código tem uma lista de itens brutos e nenhuma maneira confiável de dizer qual é um documento e
que é um comentário - sem corresponder à string SK, que é frágil
momento em que seu formato de chave muda.
Carimbe o tipo em cada item
A correção é um atributo em cada gravação, nomeando a entidade:
| PK | SK | EntityType | title |
|---|---|---|---|
| WS#acme | META | Workspace | — |
| WS#acme | DOC#a1#META | Document | Q3 Roadmap |
| WS#acme | DOC#a1#CMT#0007 | Comment | — |
Ramificar em item.EntityType === "Document" é uma verificação de igualdade estável.
Analisar SK.startsWith("DOC#") && SK.includes("#CMT#") é um palpite que quebra
quando você acelera a chave. O Type separa sua lógica de leitura de sua codificação de chave -
essa é a verdadeira vitória.
Uma leitura retorna três tipos de entidade; o atributo Type roteia cada item para o manipulador direito sem tocar nas teclas.
Filtre um GSI até uma entidade
O Tipo ganha seu sustento nos índices. Digamos que você adicione um GSI digitado
GSI1PK = WS#acme, GSI1SK = atualizadoAt para listar "tudo que mudou recentemente em
este espaço de trabalho, o mais novo primeiro". Um índice sobrecarregado varre documentos e
comentários – mas uma UI de feed pode querer apenas documentos.
Duas maneiras de reduzi-lo, e a diferença é o dinheiro:
| Abordagem | Quanto custa | Quando usar |
|---|---|---|
FilterExpression no tipo | Lê todos os itens correspondentes, fatura todos eles, elimina os itens não correspondentes após a leitura | Entidades mistas são raras no resultado; envio rápido |
Índice esparso (GSI1PK escrito apenas na entidade alvo) | Somente a entidade que você deseja chega ao índice | Uma entidade domina; você quer desperdício zero |
Sob demanda em us-east-1, um GSI Query retornando 100 itens mistos em 2 KB
cada um fatura aproximadamente 100 RCU eventualmente consistente - e um FilterExpression em
EntityType ainda mede cada linha antes de descartar os comentários. Um índice esparso que
nunca indexa comentários fatura apenas as linhas do documento. Modele ambas as formas no
calculadora de preços.
Um FilterExpression é executado após os itens serem lidos e após a capacidade ser
consumido — AWS é explícito que a filtragem não reduz o custo de leitura
(DynamoDB Guia do desenvolvedor: FilterExpression).
A filtragem por tipo é honesta, não gratuita: você paga pelos comentários que joga fora.
Para restringir o feed a documentos, a consulta carrega uma condição no tipo
atributo. Monte FilterExpression, nomes e valores com o
DynamoDB construtor de expressão — emite o
#t = :doc espaço reservado para que você não deslize uma palavra reservada.
KeyConditionExpression GSI1PK = :ws
FilterExpression #t = :doc
ExpressionAttributeNames { "#t": "EntityType" }
ExpressionAttributeValues { ":ws": "WS#acme", ":doc": "Document" }
Quer que o índice contenha apenas documentos e ignore totalmente o filtro? Escreva
GSI1PK apenas em itens de documento — a .
Itens sem a chave GSI nunca são replicados no índice, então a leitura toca
documentos sozinhos. O atributo Type é o que informa ao seu redator quais itens
qualificar.
Mantenha o valor estável e singular
Escolha o valor uma vez e trate-o como um enum. Documento, nunca às vezes Doc
e às vezes document - um valor flutuante é pior do que nenhum valor, porque seu
as verificações de igualdade passam por um invólucro e ignoram silenciosamente o outro.
Um tipo por item. Se um item parece duas entidades, geralmente é uma modelagem cheiro — devem ser dois itens, cada um em sua própria coleção ou intervalo de chaves de classificação, nem uma fileira usando dois chapéus.
A recompensa da migração
A razão para carimbar o Tipo antes de precisar dele: remodelação. O recomendado o caminho de remodelação é exportar, transformar, reimportar - e AWS exporta em massa documentos para S3 exatamente para esse tipo de remodelagem offline (Exportando DynamoDB para S3).
Quando esse dia chegar, o Tipo será a coluna que você GROUP BY. Quer levantar comentários
em sua própria tabela ou renormalizar a exportação em arquivos por entidade para um
armazém de análise? Você divide o dump em EntityType. Sem isso, você está de volta
para chaves de engenharia reversa em milhões de linhas.
Próximos passos
Um atributo Type é um seguro barato. Use-o para identificar entidades em uma leitura mista, filtro um GSI sobrecarregado e dividido de forma limpa quando você remodela. Carimbe em cada gravação desde o primeiro dia – adaptá-lo a uma mesa dinâmica significa um preenchimento total.
Leitura relacionada: design de tabela única para o
padrão de partição mista que serve, GSI vs LSI para
escolher a forma do índice atrás de um índice esparso e
Query vs Scan para saber por que um FilterExpression nunca salva
você leu custo.
Construa o filtro no Tipo com o DynamoDB construtor de expressão, e tente DynoTable para navegar em uma tabela real de entidade mista e ver o tipo alinhamento de colunas em cada item.