Разработка базы данных с периодическими данными датчиков - PullRequest
4 голосов
/ 07 марта 2011

Я проектирую базу данных PostgreSQL, которая принимает показания от многих сенсорных источников. Я провел много исследований в области дизайна, и мне нужен свежий материал, чтобы помочь мне выбраться из этого колеи.

Для ясности, я не ищу помощи , описывающей источники данных или любые связанные метаданные. Я специально пытаюсь выяснить, как лучше хранить значения данных (в конечном итоге различных типов).

Основная структура входящих данных выглядит следующим образом:

  • Для каждого устройства регистрации данных имеется несколько каналов.
  • Для каждого канала регистратор считывает данные и прикрепляет их к записи с отметкой времени
  • Разные каналы могут иметь разные типы данных, но обычно достаточно float4.
  • Пользователи должны (через функции базы данных) иметь возможность добавлять различные типы значений, но эта проблема вторична.
  • Регистраторы и каналы также будут добавлены через функции.

Отличительной особенностью этого макета данных является то, что у меня есть много каналов, связывающих точки данных с одной записью с отметкой времени и номером индекса.

Теперь, чтобы описать объем данных и общие шаблоны доступа:

  • Данные будут поступать примерно для 5 регистраторов, каждый с 48 каналами, за каждую минуту.
    • Общий объем данных в этом случае составит 345 600 чтений в день, 126 миллионов в год, и эти данные необходимо постоянно читать как минимум в течение следующих 10 лет.
  • В будущем будет добавлено больше регистраторов и каналов, возможно, с устройств разных типов, но, надеюсь, с аналогичным представлением хранилища.
  • Общий доступ будет включать в себя запросы одинаковых типов каналов во всех регистраторах и объединение временных меток регистратора. Например, получить канал 1 из logger1, канал 4 из logger2 и выполнить полное внешнее соединение для logger1.time = logger2.time.

Я должен также упомянуть, что каждая временная метка регистратора является чем-то, что может изменяться из-за настройки времени, и будет описана в другой таблице, показывающей чтение времени сервером, считывание времени регистратора, задержку передачи, настройку часов и результат скорректированное значение часов. Это произойдет для набора записей / временных отметок регистратора в зависимости от поиска. Это моя мотивация для RecordTable ниже, но в остальном пока это не вызывает особого беспокойства, поскольку я могу ссылаться на строку (регистратор, время, запись) откуда-то, которая изменит временные метки для связанных данных.

Я рассмотрел довольно много вариантов схемы, самый простой из которых напоминает гибридный подход EAV, где сама таблица описывает атрибут, поскольку большинство атрибутов будет просто реальным значением, называемым «значением». Вот базовый макет:

RecordTable          DataValueTable
----------           --------------
[PK] id        <--   [FK] record_id
[FK] logger_id       [FK] channel_id
record_number        value
logger_time    

Учитывая, что logger_id, record_number и logger_time уникальны, я полагаю, что я использую здесь суррогатные ключи, но, надеюсь, мое оправдание экономии места здесь имеет смысл. Я также рассмотрел добавление идентификатора PK в DataValueTable (вместо PK, являющегося record_id и channel_id), чтобы ссылаться на значения данных из других таблиц, но я пытаюсь сопротивляться желанию создать эту модель "тоже гибкий »пока. Однако я хочу начать получать данные в ближайшее время, и мне не нужно менять эту часть, когда позже необходимо добавить дополнительные функции или данные с другой структурой.

Сначала я создавал таблицы записей для каждого регистратора, а затем таблицы значений для каждого канала и описывал их в другом месте (в одном месте), с представлениями для их соединения, но это было просто "неправильно", потому что я повторял одно и то же много раз. Я думаю, что я пытаюсь найти счастливую среду между слишком большим количеством таблиц и слишком большим количеством строк, но разделение больших данных (DataValueTable) кажется странным, потому что я бы, скорее всего, разделил на channel_id, поэтому каждый раздел имел бы одинаковое значение для каждой строки. Кроме того, разделение в этом отношении потребует немного усилий для переопределения условий проверки в основной таблице каждый раз, когда добавляется канал. Разделение по дате применимо только к RecordTable, что на самом деле не нужно, учитывая, насколько оно будет относительно небольшим (7200 строк в день с 5 регистраторами).

Я также рассмотрел использование вышеупомянутого с частичными индексами на channel_id, поскольку DataValueTable будет расти очень большим, но набор идентификаторов каналов останется небольшим, но я действительно не уверен, что это будет хорошо масштабироваться через много лет , Я провел некоторое базовое тестирование с фиктивными данными, и производительность только такова, и я хочу, чтобы он оставался исключительным по мере роста объема данных. Кроме того, некоторые выражают озабоченность по поводу очистки и анализа большой таблицы и работы с большим количеством индексов (в данном случае до 250).

На небольшом примечании я также буду отслеживать изменения в этих данных и учитывать аннотации (например, птицу, потрескавшуюся на датчике, чтобы эти значения были отрегулированы / помечены и т. Д.), Так что держите это в задней части вашего не забывайте о дизайне здесь, но сейчас это отдельная проблема.

Некоторые сведения о моем опыте / техническом уровне, если они помогают понять, откуда я родом: я являюсь аспирантом CS и регулярно работаю с данными / базами данных в рамках своего исследования. Однако мой практический опыт в разработке надежной базы данных для клиентов (это часть бизнеса), которая обладает исключительной долговечностью и гибким представлением данных, несколько ограничен. Я думаю, что моя главная проблема сейчас заключается в том, что я рассматриваю все аспекты подхода к этой проблеме, вместо того чтобы сосредоточиться на ее решении, и я не вижу перед собой «правильного» решения.

Итак, в заключение, я думаю, это мои основные запросы для вас: если вы сделали что-то подобное, что сработало для вас? Каковы преимущества / недостатки я не вижу различных конструкций, которые я предложил здесь? Как вы могли бы спроектировать что-то подобное, учитывая эти параметры и шаблоны доступа?

Я буду рад предоставить разъяснения / подробности, где это необходимо, и заранее благодарю за то, что вы классные.

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Нет проблем предоставить все это в реляционной базе данных. PostgreSQL - это не корпоративный класс, но, безусловно, один из лучших бесплатных SQL-запросов.

Для ясности, я не ищу помощи , описывающей источники данных или любые связанные метаданные. Я специально пытаюсь выяснить, как лучше хранить значения данных (в конечном итоге различных типов).

Это ваше самое большое препятствие. В отличие от разработки программы, которая допускает декомпозицию и изолированный анализ / проектирование компонентов, базы данных должны проектироваться как единое целое. Нормализация и другие методы проектирования должны учитывать как целое, так и компонент в контексте. Данные, описания, метаданные должны оцениваться вместе, а не как отдельные части.

Во-вторых, когда вы начинаете с суррогатных ключей, подразумевая, что вы знаете данные и как они связаны с другими данными, это препятствует подлинному моделированию данных.

Я ответил на очень похожий набор вопросов, по совпадению повторно очень похожие данные. Если бы вы могли сначала прочитать эти ответы, это сэкономило бы нам обоим много времени на ввод вашего вопроса / ответа.

Ответ одно / препятствие ID
Ответ два / Основной
Ответ три / Исторический

0 голосов
/ 07 марта 2011

Я сделал что-то подобное с сейсмическими данными для компании по разведке нефти.

Мое предложение состояло бы в том, чтобы хранить метаданные в базе данных и хранить данные датчиков в плоских файлах, что бы это ни значило для операционной системы вашего компьютера.

Вы должны написать свои собственные процедуры доступа, если хотите изменить данные датчика. На самом деле, вы никогда не должны изменять данные датчика. Вам следует сделать копию данных датчика с изменениями, чтобы позже можно было показать, какие изменения были внесены в данные датчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...