Мені поставлено завдання реалізувати рішення (додаток та 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 для цього проекту?
Чи розумне моє оформлення двох столів, чи я можу так само добре поєднати його в єдину таблицю, яка все ще буде такою ж "ефективною", як і дві таблиці?