powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Посоветуйте реализацию БД
6 сообщений из 6, страница 1 из 1
Посоветуйте реализацию БД
    #37972954
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БД пока не выбрана, но скорее всего это будет MySQL или PostgreSQL.
Есть система мониторинга, которая опрашивает различные сетевые устройства, и пишет информацию по ним в базу, по которой строятся различные графики. Сейчас все пишется в кольцевую БД (RRD), есть желание перенести все в реляционную.
В чистом виде структура основной таблички очень простая:
ИмяТип данныхОписаниеidintPKsensor_idintFK на датчикclockdatetimeдата/время измеренияvaluenumber(8,4)Результат измеренияerrintЕсли при измерении были ошибки, то код ошибки
Но ожидается довольно большая нагрузка — несколько тысяч или десятков тысяч датчиков будут опрашиваться раз в минуту, результаты будут хранится за достаточно большой интервал (несколько лет). Поэтому хотелось бы сделать так, чтобы со временем не переделывать все заново.

И есть несколько вопросов. Ожидаемые запросы — выборка для определенного sensor_id данных за определенный период или на указанную дату. sensor_id может быть каким-то конкретным значением, а может быть неким набором данных (джойн по sensor_id и фильтр по полям присоединенных таблиц).

1. Нужен ли мне id? Или вместо PK будет достаточно полей sensor_id,clock?


2. Разрешать ли null в полях value и err? Или лучше туда писать какие-то значения (например -1 и 0)?


3. Несколько смущает несбалансированность таблиц; в БД будет несколько таблиц с относительно малым числом строк и одна таблица с большим числом строк. Не будет ли с этим проблем?
Может быть лучше таблицу организовать по другому, примерно так — id, sensor_id, clock, value0, value1, value2, ..., value59 — где valueN — это результаты измерений за момент (clock + N минут)? Тут конечно сильно усложнится выборка и обновление данных, но зато сократится число строк.


4. Нужно предусмотреть, что через какое-то время (несколько лет) базу нужно будет чистить от старых данных. Как это сделать так, чтобы процедура не занимала несколько часов? Хотелось бы устаревшие данные не удалять безвозвратно, а переносить в архив (возможно с агрегацией и снижением точности, как это делается в кольцевых БД).

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Посоветуйте реализацию БД
    #37973017
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по пунктам

Alibek B.1. Нужен ли мне id? Или вместо PK будет достаточно полей sensor_id,clock?


Не очень нужен, с другой стороны, сэкономите где-то 5-7% на его отсутствии. Имхо - некритичный пункт.

Alibek B.2. Разрешать ли null в полях value и err? Или лучше туда писать какие-то значения (например -1 и 0)?


Лучше разрешать

Alibek B.
3. Несколько смущает несбалансированность таблиц; в БД будет несколько таблиц с относительно малым числом строк и одна таблица с большим числом строк. Не будет ли с этим проблем?


Не будет, это нормально

Alibek B.
Может быть лучше таблицу организовать по другому, примерно так — id, sensor_id, clock, value0, value1, value2, ..., value59 — где valueN — это результаты измерений за момент (clock + N минут)? Тут конечно сильно усложнится выборка и обновление данных, но зато сократится число строк.

Нет, так хуже.

Alibek B.
4. Нужно предусмотреть, что через какое-то время (несколько лет) базу нужно будет чистить от старых данных. Как это сделать так, чтобы процедура не занимала несколько часов? Хотелось бы устаревшие данные не удалять безвозвратно, а переносить в архив (возможно с агрегацией и снижением точности, как это делается в кольцевых БД).


Смотрите, есть ли в Вашей СУБД секционирование.
Если нет - можно делать "закат солнца вручную", т.е. делать отдельную таблицу на каждый месяц/квартал/год, и общую вьюшку через union для поиска. При "переносе в архив" Вы пересоздаете вьюшку, исключая из нее "архивные" таблицы.
Но надо мерять, насколько оптимизатор Вашей СУБД будет хорошо обрабатывать такую вьюшку - вполне возможно, что потери времени на поиск сожрут весь выигрыш от экономии на удалении.
...
Рейтинг: 0 / 0
Посоветуйте реализацию БД
    #37973025
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Сейчас все пишется в кольцевую БД (RRD), есть желание перенести все в
реляционную.
А чем это желание вызвано? Скучно жить, решили заняться поиском приключений на свою голову?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Посоветуйте реализацию БД
    #37973603
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> # 1. Нужен ли мне id? Или вместо PK будет достаточно полей sensor_id,clock?
>
> # 2. Разрешать ли null в полях value и err? Или лучше туда писать какие-то
> значения (например -1 и 0)?

На все эти вопросы может ответить только один человек -- ты. Кроме тебя самого
это никто не знает.

> # 3. Несколько смущает несбалансированность таблиц; в БД будет несколько таблиц с
> относительно малым числом строк и одна таблица с большим числом строк. Не будет
> ли с этим проблем?

Нет.

> Может быть лучше таблицу организовать по другому, примерно так — id, sensor_id,
> clock, value0, value1, value2, ..., value59 — где valueN — это результаты
> измерений за момент (clock + N минут)? Тут конечно сильно усложнится выборка и
> обновление данных, но зато сократится число строк.

Это нарушение 1НФ таблиц, очень грубая ошибка проектирования РБД.
НЕ ДЕЛАЙ так.

> # 4. Нужно предусмотреть, что через какое-то время (несколько лет) базу нужно
> будет чистить от старых данных. Как это сделать так, чтобы процедура не занимала
> несколько часов?

В общем-то никак, на самом деле это не важно, сколько оно будет занимать, на
самом деле ты хотел задать другой вопрос: как сделать так, чтобы процесс
архивации данных не мешал бы нормальной работе остальной части БД.
Ответ - правильно организовать транзакции. Но это тоже кроме тебя самого никто
не сделает.


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

На самом деле есть один маленький секрет, который на самом деле вовсе не секрет.
При доступе по индексу производительность запроса пропорциональна log N, (N
число строк в таблице). Поэтому что миллион строк в БД, что 100 миллионов -- всё
равно. Поэтому очень может быть, что архивировать вообще ничего не нужно.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Посоветуйте реализацию БД
    #37974109
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин, благодарю, все доступно объяснили.

Dimitry Sibiryakov, иногда нужно посмотреть информацию по прошлым периодам, с точностью хотя бы до часа. А в RRD они уже агрегировались по среднему за сутки.

MasterZivНа все эти вопросы может ответить только один человек -- ты. Кроме тебя самого это никто не знает.
Мне без разницы, как именно сделать. Но я подозреваю, что будет разница для БД.
Например мне откуда-то вспоминается, что наличие null в таблицах ухудшает производительность работы с таблицами и индексами.

MasterZivНа самом деле есть один маленький секрет, который на самом деле вовсе не секрет. При доступе по индексу производительность запроса пропорциональна log N, (N число строк в таблице). Поэтому что миллион строк в БД, что 100 миллионов -- всё равно.
Я как бы знаю, но это в теории. На практике у 100 миллионов записей индекс будет занимать большой объем и возможны всякие тормоза, связанные уже с конкретной реализацией СУБД; скажем индекс перестанет умещаться в страницу памяти или будет требоваться его реорганизация.
...
Рейтинг: 0 / 0
Посоветуйте реализацию БД
    #37975462
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

1.ИМХО, не нужен.
Можно сделать таблицу кластерной по sensor_id,clock, тогда будут быстро работать запросы.
Отрицательный момент - замедлится вставка. И п.4 удаление/копирование старых данных будет работать медленнее, таблица после чистки будет "с дырками" (фрагментация, плюс блоки данных заполнены частично). Либо удаление делать перезаписью в другую таблицу и переименованием.

2.Лучше вообще не хранить такие строчки. Нулевое значение может означать неисправность датчика, а не отсутствие значения.

3.Не страшно. Хуже если все таблицы большие:)
А вот id, sensor_id, clock, value0, value1, value2, ..., value59 мне категорически не нравится,
кстати "несколько тысяч или десятков тысяч датчиков" все равно не впишутся в одну таблицу.
В систему АСУТП замеры с датчиков приходят в разное время. Время, выставленное на сервере и на контроллерах может отличаться.
Есть логическое "время замера" - оно одинаковое, и есть время передачи(сохранения) замера в БД.
Полезно иметь время сохранения замера, когда тебе задают вопрос "почему нет замера на ХХчас?".

4.Учитывая п.1, ничего другого не приходит в голову, как писать программу архивации с рассчетом средних значений за укрупненный период времени.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Посоветуйте реализацию БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]