Mi è stato assegnato il compito di implementare una soluzione (app e db) per archiviare i campioni di dati da un enorme array di sensori. L'array è attualmente composto da circa 20.000 sensori, ma che presto crescerà, fino a 100.000 sensori. Ogni sensore invia un campione di dati ogni 10 secondi e ogni campione ha una dimensione di 28 byte.
Fare le somme porta quindi a:
- 8640 campioni per sensore al giorno
- 242kB di dati per sensore al giorno
- 864 milioni di campioni al giorno
Ora mi chiedevo quale sarebbe il modo migliore per archiviare / recuperare i dati? Ho aderito a questo progetto dopo che il software è già stato specificato, quindi deve essere implementato su una piattaforma Windows utilizzando SQL Server.
La soluzione attuale nella mia testa è quella di creare un DB con due tabelle per memorizzare i campioni di dati. Il primo funge da una sorta di indice nel secondo che memorizza i campioni raccolti in un campo binario su base giornaliera per sensore:
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
Fondamentalmente scriverò i campioni da tutti i sensori in file temporanei (1 per sensore). Alla fine di ogni giorno creerò quindi una voce nella Tabella 1, userò il RecordID generato e scaricherò il file nel campo Dati nella Tabella 2.
In questo modo finisco con solo 100.000 voci nella tabella al giorno, invece di 864 milioni di voci. I dati dovrebbero essere disponibili sulla LAN o sulla WAN ad alta velocità, quindi il recupero dei dati del sensore su base giornaliera sarebbe accettabile.
Sebbene tutti i dati debbano essere archiviati, probabilmente non verranno mai letti. Quindi la quantità di letture nelle tabelle non sarà enormemente maggiore delle scritture.
So che potrei implementare qualcosa usando il file system semplicemente memorizzando il percorso dei file di dati, ma ho letto che SQL Server supera NTFS mentre i tuoi campi binari sono meno grazie a 256kB. (Esiste un'area grigia tra 256 KB e 1 MB, mentre NTFS supera di gran lunga SQL Server per dimensioni binarie> 1 MB).
Sono anche leggermente diffidente nell'archiviare i dati da 100.000 sensori nei propri file senza causare problemi nel file system avendo enormi quantità di file in una cartella o avendo una struttura ad albero complessa con pochi file in ogni cartella, ma non anche tenendo conto della frammentazione dei file.
Qualcuno può offrirmi alcuni consigli pratici / commenti su quanto sopra?
Ci sono ovvie insidie in cui cadrò?
I dati di esempio vengono compressi abbastanza bene. Un file di 242 kB si comprime a circa 85 kB. Posso tuttavia implementare un tipo di compressione a livello di database in modo che i dati di esempio (colonna) vengano compressi automaticamente?
SQL Server è ovviamente una scelta errata per questo progetto?
Il mio design dei due tavoli è saggio o potrei anche combinarlo in un unico tavolo che sarà comunque "performante" come i due tavoli?