Fui encarregado de implementar uma solução (app e db) para armazenar as amostras de dados de uma enorme variedade de sensores. Atualmente, a matriz consiste em cerca de 20.000 sensores, mas que em breve crescerá, até 100.000 sensores. Cada sensor envia uma amostra de dados a cada 10 segundos e cada amostra tem 28 bytes de tamanho.
Fazer as somas leva a:
- 8640 amostras por sensor por dia
- 242kB de dados por sensor por dia
- 864 milhões de amostras por dia
Agora eu estava me perguntando qual seria a melhor maneira de armazenar / recuperar os dados? Entrei neste projeto depois que o software já foi especificado, portanto ele precisa ser implementado em uma plataforma Windows usando o SQL Server.
A solução atual em minha cabeça é criar um banco de dados com duas tabelas para armazenar as amostras de dados. O primeiro serve como uma espécie de índice para o segundo que armazena as amostras agrupadas em um campo binário por dia por sensor:
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
Basicamente, escreverei as amostras de todos os sensores em arquivos temporários (1 por sensor). No final de cada dia, criarei uma entrada na Tabela 1, use o RecordID gerado e despejo do arquivo no campo Dados da Tabela 2.
Dessa forma, acabo com apenas 100.000 entradas na tabela por dia, em vez de 864 milhões de entradas. Os dados devem estar disponíveis na LAN ou WAN de alta velocidade, portanto, a recuperação dos dados do sensor em um dia inteiro seria aceitável.
Embora todos os dados precisem ser armazenados, a maioria provavelmente nunca será lida. Portanto, a quantidade de leituras nas tabelas não será muito maior do que as gravações.
Eu sei que eu poderia implementar algo usando o sistema de arquivos apenas armazenando o caminho para os arquivos de dados, mas li que o SQL Server supera o NTFS enquanto seus campos binários são menos agradecidos a 256kB. (Existe uma área cinza entre 256kB e 1 MB, enquanto o NTFS supera em muito o SQL Server para tamanhos binários> 1 MB).
Também tenho um pouco de cautela em armazenar dados de 100.000 sensores em seus próprios arquivos sem causar problemas no sistema de arquivos, pois possui grandes quantidades de arquivos em uma pasta ou uma estrutura em árvore complexa com alguns arquivos em cada pasta, enquanto não mesmo levando em consideração a fragmentação do arquivo.
Alguém pode me oferecer alguns conselhos práticos / comentários sobre o exposto?
Existem armadilhas óbvias nas quais vou cair?
Os dados de amostra são compactados bastante bem. Um arquivo de 242 kB é compactado para cerca de 85 kB. No entanto, posso implementar algum tipo de compactação no nível do banco de dados para que os dados de amostra (coluna) sejam compactados automaticamente?
O SQL Server é uma escolha obviamente errada para este projeto?
O meu design das duas tabelas é sábio ou seria possível combiná-lo em uma única tabela que ainda será tão "eficiente" quanto as duas tabelas?