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

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

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

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

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

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

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

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

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

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

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


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