Мне было поручено реализовать решение (app и db) для хранения выборок данных из огромного массива датчиков. В настоящее время массив состоит из около 20 000 датчиков, но вскоре он будет расти, до 100 000 датчиков. Каждый датчик отправляет образец данных каждые 10 секунд, и каждый образец имеет размер 28 байт.
Выполнение сумм, таким образом, приводит к:
- 8640 проб на сенсор в день
- 242 КБ данных на датчик в день
- 864 миллиона образцов в день
Теперь мне стало интересно, как лучше всего хранить / извлекать данные? Я «присоединился» к этому проекту после того, как программное обеспечение уже было задано, поэтому его необходимо реализовать на платформе Windows с использованием SQL Server.
Текущее решение в моей голове - создать БД с двумя таблицами для хранения образцов данных. Первый служит своего рода индексом для второго, который сохраняет сопоставленные выборки в двоичном поле по дням для каждого датчика:
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
В основном я буду записывать образцы со всех датчиков во временные файлы (по 1 на датчик). В конце каждого дня я буду создавать записи в таблице 1, использовать сгенерированный RecordID и выгружать файл в поле данных в таблице 2.
Таким образом, я получаю в таблице только 100 000 записей в день вместо 864 миллионов записей. Данные должны быть доступны в локальной сети или в высокоскоростной сети WAN, поэтому получение данных с датчиков в течение всего дня будет приемлемым.
Хотя все данные должны храниться, большинство из них, вероятно, никогда не будут прочитаны. Таким образом, количество операций чтения в таблице (таблицах) не будет намного больше, чем операций записи.
Я знаю, что мог бы реализовать что-то, используя файловую систему, просто сохранив путь к файлам данных, но я прочитал, что SQL Server превосходит NTFS, в то время как ваши двоичные поля меньше, чем 256 КБ. (Серая область существует между 256 КБ и 1 МБ, в то время как NTFS намного превосходит SQL Server для двоичных размеров> 1 МБ).
Я также немного опасаюсь хранить данные с 100 000 датчиков в своих собственных файлах без проблем в файловой системе, так как они содержат огромное количество файлов в папке или сложную древовидную структуру с несколькими файлами в каждой папке, хотя даже принимая во внимание фрагментацию файла.
Может ли кто-нибудь предложить мне несколько практических советов / комментариев по поводу вышеизложенного?
Есть ли очевидные подводные камни, в которые я попаду?
Примеры данных сжимаются довольно хорошо. Файл размером 242 КБ сжимается до 85 КБ. Могу ли я, однако, реализовать некоторый тип сжатия на уровне базы данных, чтобы образец данных (столбец) сжимался автоматически?
Является ли SQL Server явно неправильным выбором для этого проекта?
Является ли мой дизайн двух таблиц разумным, или я мог бы с тем же успехом объединить его в одну таблицу, которая все еще будет такой же «производительной», как две таблицы?