1
resposta

[Dúvida] Qual a melhor maneira de definir as chaves e índices nesta situação?

Pessoal, estou com um projeto de plataforma de streaming e gostaria de armazenar cada acesso que um vídeo teve, e então contabilizar estas visualizações em um período (mensal ou semanal). As "tuplas" no DynamoDB terão mais ou menos o seguinte formato:

{
    "view_id": "1139-abcd-9873-cyzv"
    "video_id": 2457,
    "date_viewed": "2023-06-30T20:23:59"
}

O meu objetivo é acumular esses documentos e então filtrá-los para contabilizar quantas visualizações (fazer um SELECT COUNT com o Query) que cada vídeo teve. Neste caso, pensei na seguinte configuração de chaves e índice:

chave de partição: video_id chave de classificação: view_id índice secundário global: date_viewed

Com isto, imaginando que essa tabela ocupe 1 milhão de registros em pouco tempo, um COUNT performaria bem? Levando em consideração que irei fazer uma consulta do tipo "contar quantas visualizações um video_id X teve com o date_viewed entre 01/06/23 e 30/06/23.

OBS: também pensei em definir a ch de partição como video_id e ch de classificação como view_id, mas pode acontecer de duas ou mais pessoas assistirem o mesmo vídeo no mesmo segundo, o que faria duplicar a chave primária e então iria manter apenas um registro, correto?

1 resposta

Olá, Eduardo

Sua dúvida é muito pertinente e é uma questão comum no design de tabelas do DynamoDB.

Primeiramente, você está correto em sua observação final. Se você definir a chave de partição como video_id e a chave de classificação como view_id, você pode acabar com chaves duplicadas se mais de uma pessoa assistir ao mesmo vídeo no mesmo segundo. O DynamoDB mantém apenas um item por chave primária, então você perderia dados de visualizações nesse caso.

Agora, vamos à sua estrutura de chave e índice proposta. A chave de partição video_id e a chave de classificação view_id parecem ser uma boa escolha, já que você quer contar as visualizações por vídeo. O índice secundário global date_viewed também será útil para filtrar as visualizações por data.

No entanto, você deve estar ciente de que a performance do COUNT pode ser afetada pelo tamanho da sua tabela. O DynamoDB lê os dados em blocos de 4KB, então se seus itens são pequenos, você pode acabar pagando por leituras extras. Além disso, o COUNT no DynamoDB não é uma operação muito eficiente, pois ele precisa ler todos os itens para contar, mesmo que você esteja usando um índice.

Uma alternativa para melhorar a performance seria manter um contador de visualizações para cada vídeo e atualizá-lo sempre que uma nova visualização é registrada. Você poderia armazenar esse contador em um campo separado na sua tabela ou em uma tabela diferente. Dessa forma, você não precisaria contar todos os itens cada vez que quiser saber o número de visualizações.

Por exemplo, você poderia ter uma tabela video_views com a seguinte estrutura:

{
    "video_id": 2457,
    "views": 1000,
    "last_update": "2023-06-30T20:23:59"
}

Nesse caso, sempre que uma nova visualização é registrada, você incrementa o campo views e atualiza o campo last_update. Assim, você pode obter o número de visualizações de um vídeo com uma única leitura, independentemente do número de visualizações.

Espero ter ajudado e bons estudos!