|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.03.2013, 01:42 | #1 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Сериализация ацикличного направленного графа для сохранения в БД и десереализация с последующим разложением на деревья
В общем задача у меня такая:
Есть направленный ацикличный граф (если точнее дерево, но некоторые элементы в нем могут иметь несколько родителей и не обязательно что эти родители будут на одном и то же уровне вложенности). Сохраняется он в БД в виде таблицы из кортежей edge_id, start_vertex, end_vertex. Собственно структуру таблицы взял отсюда, но предложенный там алгоритм использовать не могу так как там для полноценной работы нужна СУБД с поддержкой рекурсии в запросах, а я тотально ограничен MySQL, в котором никаких таких WITH нет. Во всяком случае в 5.5. Сделать нужно следующее: Из этих двух таблиц, которые я достаю в чистом виде, построить набор деревьев. Вернее преобразовать узлы (и поддеревья им принадлежащие) которые имеют несколько родителей в отдельные ветви для этих родителей, т.е. продублировать для каждого родителя. Я немного теряюсь какой здесь алгоритм использовать и как вообще к этой задаче подступится. Если это важно, то пишу я это все на PHP и собираюсь результат - вложенный массив - использовать в шаблоне для вывода пользователю. Также будет интересно услышать каким еще методами можно сохранить это дерево (или вернее DAG) в базу, возможно есть и другие методы, которые более удобны для моей задачи?
"Тяжело в учении, легко в бою" - А.В. Суворов
Последний раз редактировалось Ivan_32; 11.03.2013 в 01:45. |
11.03.2013, 07:49 | #2 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Как мне кажется удобней рекурсивных алгоритмов для работы с деревьями ничего еще не придумали. Единственно доказано, что любая хвостовая рекурсия может быть однозначно преобразована в цикл. Попробуйте копать в этом направлении.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
11.03.2013, 22:41 | #3 |
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
Чертовски знакомый вопрос...
Года два назад пытался устроится в какую-то шарашкину контору. Мне задали подобный вопрос - как сохранить и работать с деревом в реляционной таблице. Я их послал очень далеко со словами "только идиоты будут хранить яйца в коробке с гвоздями". p.s. Ответа не знаю. Вообще вопрос крайне нелогичен. |
11.03.2013, 22:52 | #4 |
Форумчанин
Регистрация: 11.03.2011
Сообщений: 426
|
А как же КЛАДР? Разве это не дерево?
|
12.03.2013, 09:08 | #5 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Цитата:
Реляционные базы по сути все есть графы. Что не так с хранением иерархий в базе я не понимаю. Иерархии хранятся не обязательно на основе реляционной модели в таблицах, а вплоть до хранения строк по типу путей к файлам "1/2/1/5". |
|
12.03.2013, 20:58 | #6 | |
Старожил
Регистрация: 19.04.2010
Сообщений: 2,702
|
Цитата:
|
|
13.03.2013, 10:01 | #7 |
Участник клуба
Регистрация: 21.11.2007
Сообщений: 1,690
|
Мммм, может я не до конца понял, но как на счет декартова произведения?(самое простое и наглядное решение для MySQL, но не самое эффективное)
Есть таблица меню вида: id parent title url Нужно одним запросом получить, хм, набор данных который легко превращается в дерево. Код:
id id_menu id_menu_parent Тогда можно выкрутиться декартовым произведением для 3х таблиц с соответствующими условиями Последний раз редактировалось Kostia; 13.03.2013 в 22:32. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
создание графа по матрице и поиск кратчайшего пути из одного графа в другой | 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 |