Nested Sets. Копирование ветки.

chaan

Guest
Nested Sets. Копирование ветки.

Поля: id, parent, left, right, level.
Интересует алгоритм копирования ветки.
Копирование одной записи -- выбираем нужную инфу, вставляем новую страницу.
Копирование ветки -- проблема в изменении поля `parent` и, собственно, определение родителя для каждого элемента переносимой ветки. Единого смещения обнаружить не удалось, т.е., например, смещение вида "mysql_insert_id() - $id" работает только для прямых потомков.
 

jdoe

Новичок
http://downloads.ebuki.apvs.ru/Morgan.Kaufmann/Morgan.Kaufmann.Joe.Celkos.Trees.and.Hierarchies.in.SQL.for.Smarties.May.2004.eBook-DDU.pdf
 

Popoff

popoff.donetsk.ua
jdoe
Мы не можем и не станем удовлетворять ваш запрос на загрузку файла..

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

Мы не дадим вам скачать этот файл только потому, что он вам "действительно нужен".

"Только пользователями находящимеся в России" мы уже говорили.
-~{}~ 27.08.05 17:06:

chaan
в два этапа (возможно даже, в два запроса):
1. смещаем дерево - освобождаем место для новых элементов
2. копируем. ко всем левым и правым значениям прибавляем одно и то же смещение по отношению к старому значению
 

chaan

Guest
Может, я неясно изъяснился? При вставке нужен номер будущего РОДИТЕЛЯ в любом случае. Как его определить?

-~{}~ 27.08.05 18:27:

Popoff
То, что Вы написали, относится к перемещению, т.к. там не меняются id элементов, => и поле `parent` менять не нужно.
 

Popoff

popoff.donetsk.ua
При вставке нужен номер будущего РОДИТЕЛЯ
"будущий родитель" - это вершина, которая будет родителем для того поддерева, которое ты копируешь? Если это так, то его номер не определяется, а задается - так же, как и при перемещении. Если мы хотим переместить что-то, то мы не можем определить, куда пользователь хотел переместить, если только он сам об этом не скажет.

Если при копировании ты хотел добавлять новую вершину, которая будет содержать в себе только перемещаемое поддерево, то добавляешь ее обычными способом - при любом способе добавления ты узнаешь ее идентификатор. А потом - описанные выше два пункта.

-~{}~ 27.08.05 17:31:

chaan
и поле `parent` менять не нужно
Nested Sets. Копирование ветки.
при использовании Nested Sets нет поля parent. Если Вы используете комбинацию Nested Sets + списки смежности, то сначала забываете о списках смежности, а когда поддерево скопировано - восстанавливаете списки смежности по информации из Nested Sets. Или я снова Вас не правильно понимаю?
 

chaan

Guest
"Вершину", понятно, задает пользователь. Вот есть трехуровневая ветка. При переносе пользователь задает родителя для вершины. Далее перемещаем вершину, узнаем её id, и можно переместить прямых потомков "вершины", так? Как определить новые id родителей для узлов третьего уровня? Можно, конечно, проверять каждый узел на наличие потомков и передавать им новый id их родителя.
 

Popoff

popoff.donetsk.ua
Если Вы используете комбинацию Nested Sets + списки смежности, то сначала забываете о списках смежности, а когда поддерево скопировано - восстанавливаете списки смежности по информации из Nested Sets.
Или это не ясно?
 

chaan

Guest
Вообще, где я не читал, нигде не было написано про копирование, только вставка, удаление, перемещение. Моим решением было: выборка инфы о каждой страницы и её вставка. Для вставки нужен номер родителя. Следовательно, независимо от того, есть ли поле `parent`, нужно иметь ID НОВОГО РОДИТЕЛЯ ДЛЯ КАЖДОГО УЗЛА.
 

Popoff

popoff.donetsk.ua
Вообще, где я не читал, нигде не было написано про копирование,
Если не написано, то это не означает, что этого делать нельзя. Напишите - и будет написано. :)
Моим решением было: выборка инфы о каждой страницы и её вставка.
делается одним запросом типа insert into ... select сразу для всего поддерева.
Для вставки нужен номер родителя.
Не нужен для вставки во вложенных множествах номер родителя. Нужно левое и правое значение того места, куда Вы хотите вставить.
Следовательно, независимо от того, есть ли поле `parent`, нужно иметь ID НОВОГО РОДИТЕЛЯ ДЛЯ КАЖДОГО УЗЛА.
Вы что-то путаете :)

-~{}~ 27.08.05 18:08:

Для вставки нужен номер родителя.
Добавлять вершины в общем случае можно не только ребенком, но и братом. Чем в таком случае Вам поможет номер родителя?
 

chaan

Guest
Хорошо, может у Вас есть ли рабочий пример?
делается одним запросом типа insert into ... select сразу для всего поддерева.
Если Вы напишите сей запрос, будет просто восхитительно.
Конечно, если можно копировать все узлы без копирования каждого в отдельности, хорошо, но все, как я понимаю, упирается во вставку. Ведь для вставки узла нужен номер нового родителя? Без номера родителя "навряд ли" можно что-то вставить.
 

Popoff

popoff.donetsk.ua
Ведь для вставки узла нужен номер нового родителя? Без номера родителя "навряд ли" можно что-то вставить.
Я могу лишь повторить то, что я уже написал:
Не нужен для вставки во вложенных множествах номер родителя. Нужно левое и правое значение того места, куда Вы хотите вставить.

Для того, что бы понять остальное, нужно сначала понять это.
 

chaan

Guest
Вообщее, для вставки нам нужен один параметр, касающийся расположения непосредственно, -- "куда", так?
Без номера нового родителя невозможно определить ни `left`, ни `right`, так?
Страницы вставляются по одной в запросе?
Может Вы имеете ввиду, что мы при вставке задаем не родителя, а "лево-право"?*

*Если да, то это, наверно, то, что мне нужно.
 

Popoff

popoff.donetsk.ua
Да. Это самое "лево - право" определяется как смещение между стырым "лево-право" и тем местом, куда Вы хотите переместить поддерево. Причем это смещение одинаково всех вершин поддерева. В целом Вы можете рассматривать операцию копирования так же, как операцию перемещения за тем исключением, что из старого места не удаляются вершины.
 

jdoe

Новичок
Popoff

ну так chaan в России находится, судя по инфе. а лучше, чем Целко, вряд ли можно объяснить. можно его процитировать, но смысл?
 
Сверху