Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2013, 01:42   #1
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию Сериализация ацикличного направленного графа для сохранения в БД и десереализация с последующим разложением на деревья

В общем задача у меня такая:
Есть направленный ацикличный граф (если точнее дерево, но некоторые элементы в нем могут иметь несколько родителей и не обязательно что эти родители будут на одном и то же уровне вложенности). Сохраняется он в БД в виде таблицы из кортежей edge_id, start_vertex, end_vertex. Собственно структуру таблицы взял отсюда, но предложенный там алгоритм использовать не могу так как там для полноценной работы нужна СУБД с поддержкой рекурсии в запросах, а я тотально ограничен MySQL, в котором никаких таких WITH нет. Во всяком случае в 5.5.

Сделать нужно следующее:
Из этих двух таблиц, которые я достаю в чистом виде, построить набор деревьев. Вернее преобразовать узлы (и поддеревья им принадлежащие) которые имеют несколько родителей в отдельные ветви для этих родителей, т.е. продублировать для каждого родителя.

Я немного теряюсь какой здесь алгоритм использовать и как вообще к этой задаче подступится. Если это важно, то пишу я это все на PHP и собираюсь результат - вложенный массив - использовать в шаблоне для вывода пользователю.

Также будет интересно услышать каким еще методами можно сохранить это дерево (или вернее DAG) в базу, возможно есть и другие методы, которые более удобны для моей задачи?
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось Ivan_32; 11.03.2013 в 01:45.
Ivan_32 вне форума Ответить с цитированием
Старый 11.03.2013, 07:49   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Как мне кажется удобней рекурсивных алгоритмов для работы с деревьями ничего еще не придумали. Единственно доказано, что любая хвостовая рекурсия может быть однозначно преобразована в цикл. Попробуйте копать в этом направлении.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.03.2013, 22:41   #3
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Чертовски знакомый вопрос...

Года два назад пытался устроится в какую-то шарашкину контору. Мне задали подобный вопрос - как сохранить и работать с деревом в реляционной таблице.
Я их послал очень далеко со словами "только идиоты будут хранить яйца в коробке с гвоздями".

p.s. Ответа не знаю. Вообще вопрос крайне нелогичен.
Виталий Желтяков вне форума Ответить с цитированием
Старый 11.03.2013, 22:52   #4
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

А как же КЛАДР? Разве это не дерево?
ReportCube вне форума Ответить с цитированием
Старый 12.03.2013, 09:08   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
Сделать нужно следующее:
Из этих двух таблиц, которые я достаю в чистом виде, построить набор деревьев. Вернее преобразовать узлы (и поддеревья им принадлежащие) которые имеют несколько родителей в отдельные ветви для этих родителей, т.е. продублировать для каждого родителя.
В базе должен храниться исходный граф или же в ней можно\нужно хранить дерево с дубликатами? В общем, нужен ли этот граф или всё в итоге будет производиться над деревьями? В случае изменения элемента одного из деревьев-дубликатов, нужно менять все остальные копии или они уже каждый сам по себе?
Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
Мне задали подобный вопрос - как сохранить и работать с деревом в реляционной таблице.
Я их послал очень далеко со словами "только идиоты будут хранить яйца в коробке с гвоздями".
Реляционные базы по сути все есть графы. Что не так с хранением иерархий в базе я не понимаю. Иерархии хранятся не обязательно на основе реляционной модели в таблицах, а вплоть до хранения строк по типу путей к файлам "1/2/1/5".
pu4koff вне форума Ответить с цитированием
Старый 12.03.2013, 20:58   #6
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Реляционные базы по сути все есть графы. Что не так с хранением иерархий в базе я не понимаю. Иерархии хранятся не обязательно на основе реляционной модели в таблицах, а вплоть до хранения строк по типу путей к файлам "1/2/1/5".
Одно дело хранить, а совершенно другое работать с этими данными. Любой запрос будет строится из нескольких подзапросов или объединений.
Виталий Желтяков вне форума Ответить с цитированием
Старый 13.03.2013, 10:01   #7
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Мммм, может я не до конца понял, но как на счет декартова произведения?(самое простое и наглядное решение для MySQL, но не самое эффективное)
Есть таблица меню вида:
id parent title url

Нужно одним запросом получить, хм, набор данных который легко превращается в дерево.
Код:
SELECT * FROM `menu` as table1,`menu` as table2 WHERE table1.id = table2.parent OR (table1.parent = 0 AND table2.parent = 0 AND table1.id = table2.id)
Если родителей много, то добавляется еще одна таблица соответствий вида:
id id_menu id_menu_parent

Тогда можно выкрутиться декартовым произведением для 3х таблиц с соответствующими условиями

Последний раз редактировалось Kostia; 13.03.2013 в 22:32.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание графа по матрице и поиск кратчайшего пути из одного графа в другой lexflax Общие вопросы C/C++ 1 06.09.2012 07:32
Сериализация объектов для отправки их по сети Levsha100 Работа с сетью в Delphi 2 03.03.2012 22:01
Компонент для отображения графа Sasha_S Компоненты Delphi 0 09.02.2012 16:04
по заданной матрице смежности простого графа построить каркас этого графа с использованием поиска вширь d1m2o3n4 Помощь студентам 0 22.06.2011 22:43
Создать макрос для заполнения из формы экзаменационной ведомости с последующим автоматическим вычислением bolotnik Microsoft Office Excel 3 03.05.2011 06:55