J'ai été chargé de mettre en œuvre une solution (app et db) pour stocker les échantillons de données à partir d'un énorme réseau de capteurs. Le réseau se compose actuellement d'environ 20 000 capteurs, mais cela va bientôt augmenter, jusqu'à 100 000 capteurs. Chaque capteur envoie un échantillon de données toutes les 10 secondes et chaque échantillon a une taille de 28 octets.
Faire les sommes conduit donc à:
- 8640 échantillons par capteur par jour
- 242 Ko de données par capteur et par jour
- 864 millions d'échantillons par jour
Maintenant, je me demandais quelle serait la meilleure façon de stocker / récupérer les données? J'ai «rejoint» ce projet après que le logiciel a déjà été spécifié, il doit donc être implémenté sur une plate-forme Windows utilisant SQL Server.
La solution actuelle dans ma tête est de créer une base de données avec deux tables pour stocker les échantillons de données. Le premier sert comme une sorte d'index dans le second qui stocke les échantillons rassemblés dans un champ binaire par jour et par capteur:
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
Fondamentalement, j'écrirai les échantillons de tous les capteurs dans des fichiers temporaires (1 par capteur). À la fin de chaque journée, je vais ensuite créer une entrée dans le tableau 1, utiliser le RecordID généré et vider le fichier dans le champ de données du tableau 2.
De cette façon, je me retrouve avec seulement 100 000 entrées dans la table par jour, au lieu de 864 millions d'entrées. Les données doivent être disponibles sur le LAN ou le WAN haute vitesse, de sorte que la récupération des données du capteur sur une journée entière serait acceptable.
Bien que toutes les données doivent être stockées, la plupart d'entre elles ne seront probablement jamais lues. Ainsi, le nombre de lectures sur les tables ne sera pas énormément supérieur aux écritures.
Je sais que je pourrais implémenter quelque chose en utilisant le système de fichiers en stockant simplement le chemin d'accès aux fichiers de données, mais j'ai lu que SQL Server surpasse NTFS tandis que vos champs binaires sont moins 256 Ko. (Une zone grise existe entre 256 Ko et 1 Mo, tandis que NTFS surpasse de loin SQL Server pour des tailles binaires> 1 Mo).
Je suis également légèrement réticent à l'idée de stocker des données de 100 000 capteurs dans leurs propres fichiers sans causer de problèmes dans le système de fichiers en ayant d'énormes quantités de fichiers dans un dossier, ou en ayant une arborescence complexe avec quelques fichiers dans chaque dossier, sans même en tenant compte de la fragmentation des fichiers.
Quelqu'un peut-il me donner des conseils / commentaires pratiques sur ce qui précède?
Y a-t-il des pièges évidents dans lesquels je vais tomber?
Les données d'exemple se compressent assez bien. Un fichier de 242 Ko se comprime à environ 85 Ko. Puis-je cependant implémenter un type de compression au niveau de la base de données afin que les données d'exemple (colonne) soient compressées automatiquement?
SQL Server est-il manifestement un mauvais choix pour ce projet?
Ma conception des deux tables est-elle judicieuse, ou pourrais-je tout aussi bien la combiner en une seule table qui sera toujours aussi "performante" que les deux tables?