Xpoint
   [напомнить пароль]

Хранение дерева, плавно меняющегося во времени

Метки: [без меток]
2006-03-15 17:30:38 [обр] Старынин Валерий(0/57)[досье]
Имеется сеть GSM. Ее конфигурация описывается трехуровневым деревом "Базовая Станция"->"Сектор"->"Передатчик". Каждый элемент имеет некоторые параметры, в частности номер. Производится тестирование передатчиков. Результаты надо заносить в БД. С течением времени конфигурация сети может меняться, но точно известно, что изменения незначительны (т.е. хранить отличия выгоднее по объему, чем каждую конфигурацию отдельно). При осуществлении выборок результатов тестирования необходимо использовать конфигурацию на момент тестирования. Как лучше сохранять эти конфигурации?
спустя 25 минут [обр] 30-ый(4/584)[досье]

Объединить базовые таблицы через промежуточные (по аналогии со связью many-to-many) таблицы и добавить в промежуточную таблицу номер изменения (транзакции).

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

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

спустя 6 часов [обр] Старынин Валерий(0/57)[досье]
Я так понял, что идет в отдельных таблицах информация по объектам с указанием ID, а в связующих - связи между объектами по ID с указанием "номера ревизии". Т.е. при изменении конфигурации вносятся небольшие изменения в таблицы объектов, но связи полностью переписываются с новым номером ревизии?
И 2-й вопрос: Связи лучше хранить в разных таблицах или ввести поле, различающее связи м/у БС/сект. и сект./передатч.?
спустя 10 часов [обр] 30-ый(4/584)[досье]

Нет, связи переписываются не полностью. Переписываются только все связи родителя (например "Сектора") в случае если к нему был добавлен или удален один ребенок ("Передатчик").

Лучше связи хранить в разных таблицах, чтобы была возможность задействовать FOREIGN KEY сервера баз данных... Я бы даже сказал, что связи обязательно надо хранить в разных таблицах.

спустя 2 часа 18 минут [обр] Старынин Валерий(0/57)[досье]
А как же тогда получить все связи для заданного "номера редакции"?
спустя 22 минуты [обр] 30-ый(4/584)[досье]
При поиске на определенную дату все операции производить с дополнительным фильтром версии как "меньше чем".
спустя 9 часов [обр] Старынин Валерий(0/57)[досье]
Остается только непонятно, как быть, если просто удаляется потомок?
спустя 1 час 8 минут [обр] 30-ый(4/584)[досье]
У всех объектов надо добавить флаг "удален". В результате не удалять их, а помечать этот флаг. Учитывая вашу специфику, флаг тоже должен быть числом, т.е. номером обновления, который будет писаться в таблицу обновлений наряду с переносом объекта по дереву.
спустя 6 часов [обр] Старынин Валерий(0/57)[досье]
У всех объектов надо добавить флаг "удален"

У объектов или у связей?

писаться в таблицу обновлений

Такую таблицу мы не обсуждали. М.б. это таблица/ы связей?

спустя 4 часа 1 минуту [обр] 30-ый(4/584)[досье]

Да это в принципе пофиг - как удобнее. Я бы у объектов сделал... так на мой взгляд логичнее. Но можно и у связей... дело вкуса.

Про таблицу обновлений - цитата из моей первой реплики: "Если изменения нумеровать сквозным счетчиком, то можно будет вести отдельную таблицу с датой изменения, тогда путем несложного фильтра можно будет получать конфигурацию на любой момент времени."

спустя 1 месяц 25 дней [обр] Старынин Валерий(0/57)[досье]
Я думаю, тему можно закрывать. Примерно так и сделал, только с учетом пару раз изменившегося задания.
Powered by POEM™ Engine Copyright © 2002-2005