Nested Sets - возращение целостности данных...

cDLEON

Онанист РНРСlub
Nested Sets - возращение целостности данных...

В общем имеется клиент один.
Попросил сделать скрипт "индексатор" индексирующий и перемещающий файлы....
Скрипт был написан, в качестве хранения данных была избрана модель Nested Sets...
Вопреки всем моим словам, что вручную из БД нельзя удалять записи..... в общем снёс он "ненужный мусор" оттуда....
В итоге наделал дыр в таблице...
А после этого - сделал ещё круче. Прошёлся индексатором по новой порции данных.
В итоге - в БД кавардак... Что сделать посоветуете?
Файлы, которые перемещал индексатор вернуть не получится т.к. их перемешало уже с предыдущими файлами (из других порций) на диске. Т.е. по-сути нужно все ошибки в дереве нужно как то пофиксить (
Есть какие-нибудь идеи?
 

Krishna

Продался Java
Ну вообще по идее удаление части нод из Nested sets не должно вести к краху дерева?

-~{}~ 01.10.09 22:21:


А, там наверное не было level?
 

Wicked

Новичок
бэкап + бинлог :)

если серьезно, то фикс подобных данных не всегда возможен.
например, я знаю, как пофиксать такое, при учете, что что-то было удалено сознательно:
Код:
l r name
1 6 'root item'
2 3 'l1 item'
а вот как чинить такое - уже не так понятно.
Код:
l r name
1 6 'root item'
3 4 'l2 item'
дальше вообще мрак.

вообще все зависит от того, насколько твой индексирующий механизм полагается на неразрывность деревьев.

я бы посоветовал для начала провести диагностику запросами типа:
select * from ns where ns.l > ns.r;
// совсем идиотизм

select * from ns as ns1 inner join ns as ns2 on ((ns1.l < ns2.l or ns2.r < ns1.r) and ns1.level > ns2.level);
// у родителя оказался уровень больше, чем у его ребенка_по_ns, полный п

select * from ns as ns1 inner join ns as ns2 on (ns1.l < ns2.l and ns2.l < ns1.r and ns2.r > ns1.r);
// частичное перекрытие интервалов

select * from ns as ns1 left join ns as ns2 on (ns1.l = ns2.l + 1 or ns1.l = ns2.r + 1) where ns2.id is null;
select * from ns as ns1 left join ns as ns2 on (ns1.r = ns2.r - 1 or ns1.r = ns2.l - 1) where ns2.id is null;
// пропуски до и после интервалов

Ну вообще по идее удаление части нод из Nested sets не должно вести к краху дерева?
казалось бы :)

Было. Просто некоторые куски новых построенных деревьев, повылазили... Т.е. стали лишними...
поподробнее и в терминологии нс :)
 
Сверху