Intermediário7 min de leitura

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

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" 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:

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

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.

Query PK = 'WS#acme'Partição mistaEntityType: 'Espaço de trabalho'EntityType: 'Documento'EntityType: 'Comentário'Rota por tipo

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:

AbordagemQuanto custaQuando usar
FilterExpression no tipoLê todos os itens correspondentes, fatura todos eles, elimina os itens não correspondentes após a leituraEntidades 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 índiceUma 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.

Atualizado