|
|
|
Посоветуйте реализацию БД
|
|||
|---|---|---|---|
|
#18+
БД пока не выбрана, но скорее всего это будет 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. Нужно предусмотреть, что через какое-то время (несколько лет) базу нужно будет чистить от старых данных. Как это сделать так, чтобы процедура не занимала несколько часов? Хотелось бы устаревшие данные не удалять безвозвратно, а переносить в архив (возможно с агрегацией и снижением точности, как это делается в кольцевых БД). ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 14:40 |
|
||
|
Посоветуйте реализацию БД
|
|||
|---|---|---|---|
|
#18+
по пунктам 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 для поиска. При "переносе в архив" Вы пересоздаете вьюшку, исключая из нее "архивные" таблицы. Но надо мерять, насколько оптимизатор Вашей СУБД будет хорошо обрабатывать такую вьюшку - вполне возможно, что потери времени на поиск сожрут весь выигрыш от экономии на удалении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 15:12 |
|
||
|
Посоветуйте реализацию БД
|
|||
|---|---|---|---|
|
#18+
Alibek B.Сейчас все пишется в кольцевую БД (RRD), есть желание перенести все в реляционную. А чем это желание вызвано? Скучно жить, решили заняться поиском приключений на свою голову?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 15:17 |
|
||
|
Посоветуйте реализацию БД
|
|||
|---|---|---|---|
|
#18+
> # 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 22:35 |
|
||
|
Посоветуйте реализацию БД
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, благодарю, все доступно объяснили. Dimitry Sibiryakov, иногда нужно посмотреть информацию по прошлым периодам, с точностью хотя бы до часа. А в RRD они уже агрегировались по среднему за сутки. MasterZivНа все эти вопросы может ответить только один человек -- ты. Кроме тебя самого это никто не знает. Мне без разницы, как именно сделать. Но я подозреваю, что будет разница для БД. Например мне откуда-то вспоминается, что наличие null в таблицах ухудшает производительность работы с таблицами и индексами. MasterZivНа самом деле есть один маленький секрет, который на самом деле вовсе не секрет. При доступе по индексу производительность запроса пропорциональна log N, (N число строк в таблице). Поэтому что миллион строк в БД, что 100 миллионов -- всё равно. Я как бы знаю, но это в теории. На практике у 100 миллионов записей индекс будет занимать большой объем и возможны всякие тормоза, связанные уже с конкретной реализацией СУБД; скажем индекс перестанет умещаться в страницу памяти или будет требоваться его реорганизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 11:23 |
|
||
|
Посоветуйте реализацию БД
|
|||
|---|---|---|---|
|
#18+
Alibek B., 1.ИМХО, не нужен. Можно сделать таблицу кластерной по sensor_id,clock, тогда будут быстро работать запросы. Отрицательный момент - замедлится вставка. И п.4 удаление/копирование старых данных будет работать медленнее, таблица после чистки будет "с дырками" (фрагментация, плюс блоки данных заполнены частично). Либо удаление делать перезаписью в другую таблицу и переименованием. 2.Лучше вообще не хранить такие строчки. Нулевое значение может означать неисправность датчика, а не отсутствие значения. 3.Не страшно. Хуже если все таблицы большие:) А вот id, sensor_id, clock, value0, value1, value2, ..., value59 мне категорически не нравится, кстати "несколько тысяч или десятков тысяч датчиков" все равно не впишутся в одну таблицу. В систему АСУТП замеры с датчиков приходят в разное время. Время, выставленное на сервере и на контроллерах может отличаться. Есть логическое "время замера" - оно одинаковое, и есть время передачи(сохранения) замера в БД. Полезно иметь время сохранения замера, когда тебе задают вопрос "почему нет замера на ХХчас?". 4.Учитывая п.1, ничего другого не приходит в голову, как писать программу архивации с рассчетом средних значений за укрупненный период времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 09:27 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37973603&tid=1541530]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
137ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 428ms |

| 0 / 0 |
