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

Есть 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
10.07.2008, 09:37
    #35422128
geogaga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Версионинг дерева Nested Sets
Сейчас смотрю - забыл совсем сказать о том, что изменения в дереве однонаправленные: за одну итерацию изменений все непосредственные потомки одного нода могут перейти к родителю этого самого нода, а новые чайлды после подобной реструктуризации у контекстного нода должны появляться и оставаться на уровне 1 до того момента, как его снова не коснется т.н. "компрессия". Сами отчеты зависят от уровня нахождения определенного нода односительно одного из предков.

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

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

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

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


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