Iniciante9 min de leitura

DynamoDB Coleções de itens

Uma coleção de itens é o conjunto de todos os itens em uma tabela (ou índice) que compartilham o mesmovalue — uma propriedade emergente do seu esquema principal.

No momento em que dois itens carregam a mesma chave de partição, eles formam uma coleção, e isso coleção se torna a unidade DynamoDB permite que você leia juntos em um único Query.

Faça isso direito e suas leituras voltarão em uma viagem de ida e volta. Se errar e você estará preso com um Scan.

O que é uma coleção de itens DynamoDB?

Uma coleção de itens DynamoDB é o conjunto de todos os itens que compartilham o mesmovalor, armazenados juntos e classificados por chave de classificação. A coleção emerge do seu esquema principal. A coleção é a unidade que um único Query lê com eficiência, enquanto um Scan percorre cada partição.

  • Uma coleção é apenas a "mesma chave de partição". Dois ou mais itens com a mesma os valores da chave de partição são armazenados juntos, classificados por.
  • É a unidade de um Query eficiente. Query lê uma coleção; Scan percorre todas as partições. Essa é toda a história do desempenho.
  • Sem chave de classificação, sem coleção. Uma tabela somente com chave de partição contém um item por chave — nada para coletar.
  • Dois limites são válidos: o teto de 10 GB por coleção quando umexiste, e quente partições de chaves de baixa cardinalidade.

O problema: ler itens relacionados juntos

Digamos que você opere uma frota de veículos, cada um transmitindo telemetria – velocidade, refrigerante temperatura, nível de combustível – a cada poucos segundos. A leitura dominante é "dê-me o leituras recentes para o veículo V-7741".

Vindo de SQL, você indexaria uma coluna vehicle_id e deixaria o planejador fazer o trabalho. Um armazenamento simples de valores-chave não oferece esse luxo.

Trata cada leitura como um registro isolado, de modo que essa pergunta significa examinar o tabela inteira e filtragem. Lento, caro e pior à medida que a frota cresce.

A resposta de DynamoDB é fazer com que "todas as leituras de um veículo" sejam agrupadas fisicamente, coisa diretamente endereçável. Esse agrupamento é a coleção de itens.

O que realmente é uma coleção

DynamoDB armazena itens em partições e roteia cada item para uma partição por hash de sua chave de partição. Cada item com o mesmo valor de chave de partição é armazenado juntos e classificados por chave de classificação. Eles começam em uma partição, mas sem LSI DynamoDB pode dividir uma coleção grande ou quente entre partições em um limite de chave de classificação; apenas um LSI fixa toda a coleção em uma única partição (é por isso que os 10 GB o limite abaixo é apenas LSI).

O Guia do desenvolvedor AWS nomeia isso exatamente. Itens que compartilham um valor de chave de partição são uma coleção de itens, armazenados juntos e ordenados por chave de classificação.

Esta é a mesma ideia que o artigo do Amazon Dynamo de 2007 introduziu - hashing consistente para atribuir chaves aos nós - estendido com uma dimensão de classificação para que os itens relacionados fiquem adjacentes disco.

Por serem adjacentes e ordenados, DynamoDB retorna uma sequência contígua deles com uma procura. É por isso que Query é barato e Scan não é: Query lê um único coleção; Scan percorre todas as partições.

Para formar uma coleção você precisa de um — uma chave de partição e uma chave de classificação. Uma tabela codificada apenas na chave de partição tem exatamente um item por valor de chave, então não há nada para coletar.

Nosso exemplo trabalhado: veículo → leituras de telemetria

Modele o fluxo de telemetria com uma chave composta. A chave de partição identifica o veículo; a chave de classificação é o carimbo de data/hora da leitura, que mantém as leituras no carimbo de data/hora ordem (crescente por padrão; passe ScanIndexForward=false para o mais novo primeiro).

PK (vehicleId)SK (recordedAt)attributes
VEH#V-7741METAplate, model, depotCode
VEH#V-7741TS#2026-06-23T09:00:01ZspeedKph, coolantC, fuelPct
VEH#V-7741TS#2026-06-23T09:00:06ZspeedKph, coolantC, fuelPct
VEH#V-7741TS#2026-06-23T09:00:11ZspeedKph, coolantC, fuelPct
VEH#V-7742METAplate, model, depotCode
VEH#V-7742TS#2026-06-23T09:00:02ZspeedKph, coolantC, fuelPct

Duas coleções residem aqui – uma por veículo. O item META (metadados do veículo) e todas as leituras do V-7741 formam uma coleção; Os itens do V-7742 formam outro.

Dê aos metadados uma chave de classificação (META) que classifica antes de qualquer TS#... valor, e um único Query em PK = "VEH#V-7741" retorna o perfil do veículo e suas leituras juntas.

Esse é o padrão de pais e filhos que está no cerne da design de tabela única.

Partition · VEH#V-7742META perfil do veículoTS#09:00:02Partition · VEH#V-7741META perfil do veículoTS#09:00:01TS#09:00:06TS#09:00:11

Cada caixa tracejada é uma coleção de itens: mesma chave de partição, itens classificados por chave de classificação. Um Query lê exatamente uma caixa.

Query criando uma coleção

Como a coleção é classificada por chave de classificação, você obtém leituras de intervalo gratuitamente. Para puxar as leituras registradas em uma janela de dez minutos para um veículo, você vinculou a chave de classificação:

# Query
KeyConditionExpression   vehicleId = :v AND recordedAt BETWEEN :from AND :to
ScanIndexForward         false        # newest first

A condição chave restringe você a uma coleção (vehicleId = :v) e depois a uma fatia contígua dele (recordedAt BETWEEN ...). DynamoDB lê apenas esses itens e cobra de você apenas por eles. Quer apenas os metadados? recordedAt = "META" busca o único item META.

Construir essas condições-chave e expressões de projeção manualmente é complicado. O DynamoDB Expression Builder gera o KeyConditionExpression, o ExpressionAttributeNames e o ExpressionAttributeValues para você, então os detalhes da palavra reservada e do espaço reservado não morda.

Coleções em índices

Um índice secundário tem seu esquema de chave próprio, portanto ele forma suas coleções de itens próprias.

Adicione um índice secundário global codificado em depotCode (partição) e recordedAt (classificação), e "todas as leituras do depósito DEP-LON-3, as mais recentes primeiro" tornam-se um único Query contra a coleção desse índice - uma leitura que a tabela base não pode servir.

É por isso que o tipo de índice é importante: ele determina quais coleções você pode formar e como eles se comportam. Consulte GSI vs LSI para ver a compensação.

Uma distinção nítida: um índice secundário local (LSI) compartilha a tabela base chave de partição, então sua coleção está fisicamente ligada à coleção de itens base - e esse vínculo cria um limite rígido, abaixo.

Os limites que mordem

As coleções de itens são poderosas, mas duas restrições decidem como você molda as chaves:

  • O limite LSI de 10 GB. Quando uma tabela tem um ou mais índices secundários locais, uma única coleção de itens — os itens básicos mais suas projeções LSI para um chave de partição — não pode exceder 10 GB. Excede-o e escreve que faz crescer o a coleção começa a falhar com ItemCollectionSizeLimitExceededException. Uma mesa com não LSI não possui esse teto por coleção. É exatamente por isso que um ilimitado, fluxo cada vez maior (telemetria que nunca para) não é adequado para um LSI: o a arrecadação só cresce. Um GSI obtém suas próprias partições, portanto ultrapassa o limite.
  • . Uma coleção reside em uma partição e uma única partição possui rendimento finito. Se um veículo (ou um depotCode) atrair um grande público uma parcela desproporcional de tráfego, você pode conectar essa partição mesmo quando o a tabela como um todo está bem abaixo de sua taxa de transferência provisionada. Capacidade adaptativa - abordada em AWS's "Padrões de design avançados para DynamoDB" re:Inventar mergulhos profundos - isola e aumenta teclas de atalho automaticamente, mas não é possível resgatar uma chave sem propagação alguma. Escolha chaves de partição com alta cardinalidade para que o tráfego se espalhe por muitas coleções.

Veja no DynoTable

A maneira mais rápida de criar intuição para coleções é olhar para uma. Em DynoTable, consultar uma chave de partição torna toda a coleção como contígua, lista ordenada por chave de classificação - o item META fica logo à frente de suas leituras com carimbo de data e hora, na tela, nenhuma reconstrução mental é necessária.

Um DynamoDB Query em uma chave de partição em DynoTable, mostrando cada item da coleção ordenado por chave de classificação.
Um DynamoDB Query em uma chave de partição em DynoTable, mostrando cada item da coleção ordenado por chave de classificação.

Armadilhas e próximos passos

  • Sem chave de classificação, sem coleção. Uma tabela somente com chave de partição não pode agrupar itens relacionados itens. Se precisar ler itens juntos, você precisará de uma chave composta.
  • Não deixe uma coleção LSI crescer ilimitadamente. Fluxos somente anexados pertencem a um GSI (ou uma chave de partição com intervalo de tempo), não uma LSI, devido ao teto de 10 GB.
  • Divulgue suas chaves de partição. Uma coleção é tão escalonável quanto a partição ele reside. Chaves de partição de baixa cardinalidade criam pontos de acesso.
  • Alcance Query, não Scan. Existem coleções para que você possa ler itens relacionados com um Query direcionado; voltar para Scan joga fora essa vantagem - veja Query vs Scan.

Esboce seu próprio esquema de chave, execute um Query em uma chave de partição real e observe o coleção volta ordenada. Baixe DynoTable e explore suas mesas coleções diretamente.

Atualizado