Se me ha encomendado la tarea de implementar una solución (aplicación y base de datos) para almacenar las muestras de datos de una gran matriz de sensores. Actualmente, la matriz consta de unos 20,000 sensores, pero pronto crecerá, hasta 100,000 sensores. Cada sensor envía una muestra de datos cada 10 segundos y cada muestra tiene un tamaño de 28 bytes.
Hacer las sumas conduce a:
- 8640 muestras por sensor por día
- 242kB de datos por sensor por día
- 864 millones de muestras por día
Ahora me he estado preguntando cuál sería la mejor manera de almacenar / recuperar los datos. Me "uní" a este proyecto después de que el software ya se haya especificado, por lo que debe implementarse en una plataforma Windows con SQL Server.
La solución actual en mi cabeza es crear una base de datos con dos tablas para almacenar las muestras de datos. El primero sirve como una especie de índice en el segundo que almacena las muestras clasificadas en un campo binario por día 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
Básicamente escribiré las muestras de todos los sensores en archivos temporales (1 por sensor). Al final de cada día, crearé una entrada en la Tabla 1, usaré el RecordID generado y volcaré el archivo en el campo Datos en la Tabla 2.
De esta manera termino con solo 100,000 entradas en la tabla por día, en lugar de 864 millones de entradas. Los datos deben estar disponibles en la LAN o WAN de alta velocidad, por lo que sería aceptable la recuperación de los datos del sensor durante todo el día.
Aunque todos los datos deben almacenarse, la mayoría de ellos probablemente nunca se leerán. Por lo tanto, la cantidad de lecturas en la (s) tabla (s) no será mucho mayor que la de las escrituras.
Sé que podría implementar algo usando el sistema de archivos simplemente almacenando la ruta a los archivos de datos, pero leí que SQL Server supera a NTFS mientras que sus campos binarios son menos gracias a 256kB. (Existe un área gris entre 256kB y 1MB, mientras que NTFS supera ampliamente a SQL Server para tamaños binarios> 1 MB).
También soy un poco cauteloso de almacenar datos de 100,000 sensores en sus propios archivos sin causar problemas en el sistema de archivos al tener grandes cantidades de archivos en una carpeta o al tener una estructura de árbol compleja con unos pocos archivos en cada carpeta, mientras que no incluso teniendo en cuenta la fragmentación de archivos.
¿Alguien puede ofrecerme algunos consejos prácticos / comentarios sobre lo anterior?
¿Hay obstáculos obvios en los que voy a caer?
Los datos de muestra se comprimen bastante bien. Un archivo de 242 kB se comprime a aproximadamente 85kB. Sin embargo, ¿puedo implementar algún tipo de compresión a nivel de base de datos para que los datos de muestra (columna) se compriman automáticamente?
¿Es SQL Server una elección obviamente incorrecta para este proyecto?
¿Es sabio mi diseño de las dos tablas, o podría combinarlo en una sola tabla que seguirá siendo tan "eficaz" como las dos tablas?