powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионинг дерева Nested Sets
5 сообщений из 5, страница 1 из 1
Версионинг дерева Nested Sets
    #35421849
geogaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хэлоу!

Есть Nested Sets дерево (актульное) в таблице вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE "tree"
(
   id bigint PRIMARY KEY NOT NULL,
   lft bigint,
   rgt bigint,
   parent_id bigint
);

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

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

Я понимаю, что маловероятно, но может быть есть какой-то более изящный способ получить запросом набор нодов и их состояний актуальных на определенную дату?

База - PostgreSQL 8.2
...
Рейтинг: 0 / 0
Версионинг дерева Nested Sets
    #35422128
geogaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас смотрю - забыл совсем сказать о том, что изменения в дереве однонаправленные: за одну итерацию изменений все непосредственные потомки одного нода могут перейти к родителю этого самого нода, а новые чайлды после подобной реструктуризации у контекстного нода должны появляться и оставаться на уровне 1 до того момента, как его снова не коснется т.н. "компрессия". Сами отчеты зависят от уровня нахождения определенного нода односительно одного из предков.

В д у ше как раз придумал следующее :) :

Т.к. известна дата добавления в таблицу каждого нода, держать в таблице вида
Код: plaintext
1.
2.
3.
CREATE TABLE "compression_history" (
    id NOT NULL CONSTRAINT fk_node REFERENCES tree (id),
    date timestamp NOT NULL
);
историю применения "компрессии" к определенным нодам и уже исходя из нее исключать из цепочки расчета уровня относительно предка ноды, перешедшие к родителю контекстного нода.

Дай бог, чтобы тот, кому было интересно, понял, к чему я клоню :)

Всем спасибо.
...
Рейтинг: 0 / 0
Версионинг дерева Nested Sets
    #35422149
geogaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А текущее состояние для отчетов актуальных на "сейчас" можно в MatView пихнуть.
...
Рейтинг: 0 / 0
Версионинг дерева Nested Sets
    #35429139
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделайте дублирующую таблицу, где хранится состояние дерева на определенную дату (т.е. на каждое изменение).
...
Рейтинг: 0 / 0
Версионинг дерева Nested Sets
    #35429729
Денис Ильин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я в данной ситуации вообще не парюсь
при каждом изменении дерева (добавлении узла, или т.п. фигни) скидываю дерево ПОЛНОСТЬЮ в табличку с историей. В виде xml. Не то, что бы это безумно быстро работает и всегда поддерживается целкостность данных - зато безотказно как автомат калашникова, и легко модифицируется если что.
Есть правда обратная задача - восстановление версии, но тут мною был проделан волшебный финтушами, который не в каждой архитектуре приложения возможен. Восстановление получилось чуть ли не проще записи в историю.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионинг дерева Nested Sets
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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