Design do esquema para dados de intervalos temporais

Esta página descreve os padrões de conceção de esquemas para armazenar dados de séries cronológicas no Bigtable. Esta página baseia-se em Conceber o seu esquema e pressupõe que conhece os conceitos e as recomendações descritos nessa página.

Uma série cronológica é uma coleção de dados que consiste em medições e nas horas em que as medições são registadas. Seguem-se alguns exemplos de séries cronológicas:

  • O gráfico da utilização de memória no seu computador
  • Temperatura ao longo do tempo num relatório de notícias
  • Cotações do mercado de ações durante um período

Um bom esquema resulta num excelente desempenho e escalabilidade, e um mau esquema pode levar a um sistema com um desempenho fraco. No entanto, nenhum design de esquema único se adequa melhor a todos os exemplos de utilização.

Os padrões descritos nesta página oferecem um ponto de partida. O conjunto de dados exclusivo e as consultas que planeia usar são os aspetos mais importantes a ter em conta ao criar um esquema para os seus dados de séries cronológicas.

Os padrões de design básicos para armazenar dados de séries cronológicas no Bigtable são os seguintes:

Dados para exemplos

Para ilustrar as diferenças entre padrões, os exemplos nesta página partem do princípio de que está a armazenar dados para uma app que regista as medições que os balões meteorológicos fazem uma vez por minuto. Usamos evento para significar um único pedido que escreve uma ou várias células ao mesmo tempo. Os IDs de localizações correspondem a Google Cloud regiões.

Medição Exemplo
  1. As datas/horas nesta página estão formatadas como `tAAAA-MM-DD-HHMM` para facilitar a leitura. Numa tabela de produção, as datas/horas são normalmente expressas como o número de microssegundos desde 01/01/1970 às 00:00:00 UTC, como "1616264288050807".
Pressão (pascais) 94587
Temperatura (Celsius) 9.5
Humidade (percentagem) 65
Altitude (metros) 601
Dados relacionados Exemplo
ID do balão 3698
Localização asia-southeast1
Indicação de tempo1 t2021-03-05-1204

Intervalos de tempo

Num padrão de intervalo de tempo, cada linha na tabela representa um "intervalo" de tempo, como uma hora, um dia ou um mês. Uma chave de linha inclui um identificador sem indicação de tempo, como week49, para o período registado na linha, juntamente com outros dados de identificação.

O tamanho do intervalo que usa, como minuto, hora ou dia, depende das consultas que planeia usar e dos limites de tamanho dos dados do Bigtable. Por exemplo, se as linhas que contêm uma hora de dados forem maiores do que o tamanho máximo recomendado por linha de 100 MB, as linhas que representam meia hora ou um minuto são provavelmente uma melhor escolha.

Vantagens dos padrões de intervalos de tempo incluem o seguinte:

  • Vai ver um melhor desempenho. Por exemplo, se armazenar 100 medições, o Bigtable escreve e lê essas medições mais rapidamente se estiverem numa linha do que se estiverem em 100 linhas.

  • Os dados armazenados desta forma são comprimidos de forma mais eficiente do que os dados em tabelas altas e estreitas.

As desvantagens incluem o seguinte:

  • Os padrões de design de esquemas de intervalos de tempo são mais complicados do que os padrões de data/hora únicos e podem exigir mais tempo e esforço para desenvolver.

Adicionar novas colunas para novos eventos

Neste padrão de intervalo de tempo, escreve uma nova coluna numa linha para cada evento, armazenando os dados no qualificador de coluna em vez de como um valor de célula. Isto significa que, para cada célula, envia a família de colunas, o qualificador de coluna e a data/hora, mas nenhum valor.

Usando este padrão para os dados de exemplo do balão meteorológico, cada linha contém todas as medições de uma única métrica, como pressure, para um único balão meteorológico, ao longo de uma semana. Cada chave de linha contém a localização, o ID do balão, a métrica que está a registar na linha e um número da semana. Sempre que um balão envia os respetivos dados para uma métrica, adiciona uma nova coluna à linha. O qualificador de coluna contém a medição, a pressão em Pascal, para o minuto identificado pela data/hora da célula.

Neste exemplo, após três minutos, uma linha pode ter este aspeto:

Chave da linha 94558 94122 95992
us-west2#3698#pressure#week1 "" (t2021-03-05-1200) "" (t2021-03-05-1201) "" (t2021-03-05-1202)

Exemplos de utilização deste padrão:

Adicionar novas células para novos eventos

Neste padrão de intervalo de tempo, adiciona novas células a colunas existentes quando escreve um novo evento. Este padrão permite-lhe tirar partido da capacidade do Bigtable de armazenar várias células com indicação de data/hora numa determinada linha e coluna. É importante especificar regras de recolha de lixo quando usa este padrão.

Usando os dados do balão meteorológico como exemplo, cada linha contém todas as medições de um único balão meteorológico ao longo de uma semana. O prefixo da chave da linha é um identificador da semana, pelo que pode ler os dados de uma semana inteira para vários balões com uma única consulta. Os outros segmentos da chave de linha são a localização onde o balão opera e o número de identificação do balão. A tabela tem uma família de colunas, measurements, e essa família de colunas tem uma coluna para cada tipo de medição: pressure, temperature, humidity e altitude.

Sempre que um balão envia as respetivas medições, a aplicação escreve novos valores na linha que contém os dados da semana atual para o balão, escrevendo células com data/hora adicionais em cada coluna. No final da semana, cada coluna em cada linha tem uma medição para cada minuto da semana ou 10 080 células (se a sua política de recolha de lixo o permitir).

Cada coluna em cada linha contém uma medição para cada minuto da semana. Neste caso, após três minutos, as duas primeiras colunas de uma linha podem ter o seguinte aspeto:

Chave da linha pressão temp
asia-south2#3698#week1 94558 (t2021-03-05-1200) 9.5 (t2021-03-05-1200)
94122 (t2021-03-05-1201) 9.4 (t2021-03-05-1201)
95992 (t2021-03-05-1202) 9.2 (t2021-03-05-1202)

Exemplos de utilização deste padrão:

  • Quer poder medir as alterações nas medições ao longo do tempo.

Linhas com uma única indicação de tempo

Neste padrão, cria uma linha para cada novo evento ou medição, em vez de adicionar células a colunas em linhas existentes. O sufixo da chave da linha é o valor da data/hora. As tabelas que seguem este padrão tendem a ser altas e estreitas, e cada coluna numa linha contém apenas uma célula.

Serializado com uma única indicação de tempo

Neste padrão, armazena todos os dados de uma linha numa única coluna num formato serializado, como um protocolo buffer (protobuf). Esta abordagem é descrita mais detalhadamente no artigo Conceber o seu esquema.

Por exemplo, se usar este padrão para armazenar os dados do balão meteorológico, a sua tabela pode ter o seguinte aspeto após quatro minutos:

Chave da linha measurements_blob
us-west2#3698#2021-03-05-1200 protobuf_1
us-west2#3698#2021-03-05-1201 protobuf_2
us-west2#3698#2021-03-05-1202 protobuf_3
us-west2#3698#2021-03-05-1203 protobuf_4

As vantagens deste padrão incluem o seguinte:

  • Eficiência do armazenamento

  • Velocidade

As desvantagens incluem o seguinte:

  • A incapacidade de obter apenas determinadas colunas quando lê os dados

  • A necessidade de desserializar os dados depois de serem lidos

Exemplos de utilização deste padrão:

  • Não tem a certeza de como vai consultar os dados ou as suas consultas podem flutuar.

  • A sua necessidade de manter os custos baixos supera a necessidade de poder filtrar dados antes de os obter do Bigtable.

  • Cada evento contém tantas medições que pode exceder o limite de 100 MB por linha se armazenar os dados em várias colunas.

Single-timestamp unserialized

Neste padrão, armazena cada evento na sua própria linha, mesmo que esteja a registar apenas uma medição. Os dados nas colunas não estão serializados.

As vantagens deste padrão incluem o seguinte:

  • Geralmente, é mais fácil de implementar do que um padrão de intervalo de tempo.

  • Pode passar menos tempo a refinar o seu esquema antes de o usar.

As desvantagens deste padrão superam frequentemente as vantagens:

  • O Bigtable tem um desempenho inferior com este padrão.

  • Os dados armazenados desta forma não são comprimidos de forma tão eficiente como os dados em colunas mais largas.

  • Mesmo quando a data/hora está no final da chave da linha, este padrão pode resultar em pontos críticos.

Exemplos de utilização deste padrão:

  • Quer obter sempre todas as colunas, mas apenas um intervalo especificado de datas/horas, mas tem um motivo para não armazenar os dados numa estrutura serializada.

  • Quer armazenar um número ilimitado de eventos.

Usando os dados de exemplo do balão meteorológico, a família de colunas e os qualificadores de colunas são iguais ao exemplo que usa intervalos de tempo e novas células. No entanto, neste padrão, cada conjunto de medições comunicadas para cada balão meteorológico é escrito numa nova linha. A tabela seguinte mostra cinco linhas escritas com este padrão:

Chave da linha pressão temperatura humidade altitude
us-west2#3698#2021-03-05-1200 94558 9.6 61 612
us-west2#3698#2021-03-05-1201 94122 9.7 62 611
us-west2#3698#2021-03-05-1202 95992 9.5 58 602
us-west2#3698#2021-03-05-1203 96025 9.5 66 598
us-west2#3698#2021-03-05-1204 96021 9.6 63 624

Estratégias adicionais

Se precisar de enviar várias consultas diferentes para o mesmo conjunto de dados, considere armazenar os dados em várias tabelas, cada uma com uma chave de linha concebida para uma das consultas.

Em alguns casos, também pode combinar padrões. Por exemplo, pode armazenar dados serializados em linhas que representam intervalos de tempo, desde que não deixe que as linhas fiquem demasiado grandes.

O que se segue?