Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / DB: Копирование иерархий(поддеревьев в дереве) / 17 сообщений из 17, страница 1 из 1
25.03.2003, 16:44
    #32126738
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Привет всем...
Короче...
Есть иерархическая структура представленная как PARENT - CHILD, в таблице вида:
ID | Parent_ID | Level | Other
, где ID - идентификатор объекта;
Parent_ID - ссылка на ID;
Level - уровень в дереве;

Если кто знает или подозревает,
Как можно скопировать часть поддерева и вставить его в новое место, причём именно копирование(как в проводнике с папками), то немогли бы вы поделиться как всётаки это делается.
...
Рейтинг: 0 / 0
25.03.2003, 17:45
    #32126790
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Первое, что приходит в голову - это временная таблица с дополнительным полем вроде NewID. Строго говоря, в этой таблице нужны только 2 поля: ID и NewID

Перед началом копирования ветки в эту таблицу заносятся все записи входящую в копируемую ветку (их ID). Ну и далее в бесконечном цикле идет вставка по одной записи пока не останется ни одной записи во временной таблице с пустым значением NewID

Т.е. для копирования выбирается узел у которого выполняются следующие условия:

-) во временной таблице NewID - пустое
-) минимальное значение Level
-) первый попавшаяся запись из тех, которые удовлетворяют первым 2 условиям

Найти новое значение ParentID и Level через сравнение ID и NewID уже не сложно.

Общая идея, думаю понятна.
...
Рейтинг: 0 / 0
25.03.2003, 18:02
    #32126809
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
За идею спасибо - конечно попробую, но хотелось бы всё таки увидеть как это реализуется, то есть хоть какой ни буди примерчик.........
...
Рейтинг: 0 / 0
26.03.2003, 06:07
    #32126975
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
какие врееменные таблицы? а рекурсией низя попробовать?
когда функцие передается корень дерева, по этому корню получаем список пренадлежащих ему непосредственно вершин, копируем их и потом для каждой из полученных вершин применяем эту же самую функцию...
...
Рейтинг: 0 / 0
26.03.2003, 09:11
    #32127029
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Рекурсией, то можно было бы да вот уровней то в дереве сколько угодно, поэтому рекурсия не очень то подходит.
Да и ещё на некоторых серверах существуют ограничения на вызов рекурсий, а если делать на стороне клиента, то очень загружается и сетевой трафик и сами интерфейсы отображения.

P.S.
Все пока придлогали только выраанты самих решений - это конечно очень хорошо.....
Но всё таки неужели ни кто не может привести пример реализации - чего очень бы хотелось увидеть, как ГУРУ - это бы реализовали...
А там бы после тестов и проверок на устойчивость и избыточность можно было бы охарактеризовать каждый из методов реализации и выбрать один из них, приведя некоторые аргументы в защиту последнего.
...
Рейтинг: 0 / 0
26.03.2003, 09:20
    #32127034
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Только через таблицу соответствия как предлагает ВладимирМ. Т.к. ID_Parent тоже надо перекодировать.
...
Рейтинг: 0 / 0
26.03.2003, 09:58
    #32127067
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Рекурсия как раз и хорошо работает со вложенностью... только бы ограничений не было, это верно... на клиенте ее организовывать глубо, это верно... попробуй выяснить возможно ли на сервере нужную тебе глубину организовать... я думаю 1000 раз вызов вполне возможен, а глубина дерева на 1000 шагов, ИМХО, это довольно много. Хотя все зависит от задачи.

П поводу кода... не думаю что будет кто-то писать... всеж код понятен, и кому-то за тебя его не очень захочется писать, да и кроме того, неизвестно что тебе надо а тут надо весьма подробно все описать. Быстрее будет тебе самому набрать код, ведь алгоритм довольно прост
...
Рейтинг: 0 / 0
26.03.2003, 10:09
    #32127079
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
На счёт кода довольно бонально и понятно...
Но я сам неочень - то силён в написании хранимых процедур и функций, поэтому и хочется увидеть как бы это выглядело у тех кто считается в этом умельцами.
...
Рейтинг: 0 / 0
27.03.2003, 03:18
    #32127792
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
ты бы хотя б любопытства ради СУБД указал...
...
Рейтинг: 0 / 0
27.03.2003, 09:48
    #32127880
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
2StarWind:
На счёт СУБД...
Sybase SQL Anywhere 7
...
Рейтинг: 0 / 0
31.03.2003, 17:37
    #32130420
Shev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Может я чего-то не понимаю...но, не кажется ли вам, что простая замена значения Parent_ID на новое значение и является решением данной задачи. И все! Никаких таблиц и рекурсии...
Единственная проблемка - это поле Level. Если его убрать, то больше ничего делать не надо. А так, после замены Parent_ID необходимо у всех CHILD записей пересчитать LEVEL, который равен:
LEVEL_PARENTNEW - LEVEL_PARENTOLD + CURRENT_LEVEL + 1
...
Рейтинг: 0 / 0
31.03.2003, 17:51
    #32130436
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
2Shev:
Если реализовать как вы предлагаете, то это получиться уже не копирование а перенос.
...
Рейтинг: 0 / 0
31.03.2003, 18:06
    #32130457
Shev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Сорри... а слона то, я и не заметил... :)
...
Рейтинг: 0 / 0
31.03.2003, 18:08
    #32130465
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Мож какие - то предложения по реализации...?
...
Рейтинг: 0 / 0
01.04.2003, 03:48
    #32130582
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
может тебе еще и проект написать?
...
Рейтинг: 0 / 0
01.04.2003, 09:06
    #32130615
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
2StarWind:
>>может тебе еще и проект написать?

Да зачём мне проект.
Проект и так давно уже написан.

Просто, как уже говорилось, я не селён в создании оптимальных хранимых процедур и функций (особенно под Sybase SQL Anywhere - многие фичи не поддерживает), поэтому и обратился в эту конференцию, в надежде на помощь с корректной и правильной реализацией.
...
Рейтинг: 0 / 0
01.04.2003, 14:00
    #32130940
Alexandr Nikolaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB: Копирование иерархий(поддеревьев в дереве)
Всем спасибо кто принимал участие.
Задача решена.
(Цик с пятью строчками - в зависимости от исходных данных)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / DB: Копирование иерархий(поддеревьев в дереве) / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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