Наше приложение (использующее серверную часть SQL Server 2008 R2) хранит данные об удаленных аппаратных устройствах, отправляя отчеты на наши серверы через Интернет. У нас есть несколько «семейств» информации о каждом устройстве, каждое из которых сохраняется отдельным серверным приложением в общей базе данных:
- статическая информация о конфигурации, сохраняемая пользователями с помощью нашего веб-приложения. например Физическое местоположение, понятное имя и т. Д.
- записанная информация о поведении устройства, например, время последнего отчета, дата, когда устройство впервые подключилось к сети, исправно ли устройство и т. д.
- дорогая информация, пересчитанная по расписанию, например, средняя мощность сигнала, средняя продолжительность передачи, историческая частота отказов и т. д.
Все эти свойства являются скалярными значениями, отражающими самые последние данные, которые мы имеем об устройстве. У нас есть отдельный способ хранения исторической информации.
Наибольшее количество экземпляров устройств, о которых нам нужно беспокоиться, будет около 100 000, так что это не проблема «больших данных». В большинстве случаев в базе данных должно быть не более 10 000 устройств.
Запись в данные об отдельном устройстве происходит нечасто - обычно каждые несколько часов. Теоретически это возможно для запланированной задачи, введенных пользователем изменений конфигурации и динамических данных для всех обновлений для одного и того же устройства в одно и то же время, но это кажется очень редким. Чтения происходят чаще: вероятно, 10 раз в минуту чтения по крайней мере с одного устройства в базе данных и несколько раз в час для полного сканирования некоторых свойств всех устройств, описанных в базе данных.
Удаление происходит относительно редко, на самом деле во многих случаях мы используем только «мягкое» удаление устройств, поэтому мы можем использовать их для создания исторических отчетов. Новые устройства вставляются чаще, возможно, несколько каждый день.
Есть (как минимум) два очевидных способа хранения этих данных в нашей базе данных SQL:
- Текущий дизайн нашего приложения хранит каждое из этих семейств информации в отдельных таблицах, каждая с кластеризованным индексом первичного ключа идентификатора устройства. Одно серверное приложение записывает в одну таблицу каждый.
- Альтернативная реализация, которая была предложена, состоит в том, чтобы использовать одну большую таблицу и при необходимости создавать покрывающие индексы для ускорения запросов для групп свойств (например, всей статической информации, всей информации о надежности и т. Д.), Которые часто запрашиваются вместе.
Мой вопрос: есть ли явно лучший вариант? Если ответ «это зависит», то какие обстоятельства могут сделать «одну большую таблицу» или «несколько таблиц» лучше?
Ответы должны учитывать: производительность, ремонтопригодность самой БД, ремонтопригодность кода, который читает / записывает строки, и надежность в условиях непредвиденного поведения. Ремонтопригодность и надежность, вероятно, для нас важнее, чем производительность, если мы вынуждены идти на компромисс.