Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранение деревьев в базе, немного оффтов но всеже 
:(
    Опции темы
myth777
Дата 3.4.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 30.3.2009

Репутация: -1
Всего: -1



Лучше всего одна таблица с

ParentId 
ID 

Если предпологается   большая выборка из таблицы то для быстрого поиска и пробежке по дочерним нодам лучше создать дополнительную таблицу с сылкой на дочерние ноды и принебречь избыточностью данных. 
PM MAIL   Вверх
Vaneska
Дата 6.4.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Цитата(gcc @  3.4.2009,  13:56 Найти цитируемый пост)
а как управлять с помошью HTML форм этим деревом? если я захожу переметсить какой-то раздел, то как это сделать красиво (показаст ьродителя и подродителлей),  может с JS как-то? кто делал?


Я делал это несколькими способами.
1. Самый простой: в форме деталей раздела поле select, а в нем все разделы.
выбираешь нужный, и сабмитишь

2. аяксовый
есть для jquery плагин. simpletree кажется.
у него есть возможность перемещать узлы дерева мышкой.
выводишь на страницу дерево, перемещаешь узлы куда надо.
И нажимаешь кнопку сохранить структуру дерева.
жаваскрипт пробегает по всему дереву строит список узлов и информацией об id, parentid
и отправляет на сервер. Там это все сохраняется в таблицу.
Вариант очень удобен для сортировки узлов дерева.

3. Тоже что и второй, только данные отправляются по каждому узлу,
который перетащил куда-либо.
Вариант удобен для работы с большими деревьями.

--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
gcc
Дата 3.5.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



подскажите как вывести всех родителей дерева из id и name

есть
Код

 id | parent_id | name


используется MySQL, рекурсии в ней нету,  такой запрос не реально написать

может ORM поможет? или как запрос написать, в гугле не нашел....!
PM WWW ICQ Skype GTalk Jabber   Вверх
sir_nuf_nuf
Дата 3.5.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



gcc, ну вы почитайте топик с самого начала. Все как раз таким вопросом и задаются.
Там даже статья есть.
В MySQL - пока никак.  Т.е. нужно придумывать доп. конструкции в базе
В PostgreSQL - вроде добавили рекурсию в последней версии


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Vaneska
Дата 5.5.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Цитата(gcc @  3.5.2009,  08:11 Найти цитируемый пост)
подскажите как вывести всех родителей дерева из id и name


1. По каждому найденному родительскому узлу делать sql запрос.
Минусы - много запросов к бд.
Если кол. данных возвращаемых запросом небольшое, то есть большая вероятность, что запросы
будут положены в кеш бд. Соответственно скорость работы будет высокой.

2. Кешировать у себя в программе целиком дерево.
Можно кешировать простым списком, а можно строить полноценное дерево.
На CPAN есть модули работы с деревьями.
Т.к. данные все есть, то выбрать из них нужное не составит проблем.
Способ не очешь хорош на больших деревьях, т.к. приходится все дерево хранить в памяти.
Но зато очень быстрый.

Если Ваше приложение - cgi, то стоит подумать, что выбрать. Если fastcgi и т.п., то однозначно второй способ.
Только надо не забывать при изменении дерева обновлять кеш.

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

И еще. Можно хранить не целиком все данные о дереве, а только id, parent_id, sort. Тогда будет меньше памяти занимать. А недостающие данные можно уже доставать sql запросом.
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
gcc
Дата 5.5.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



нашел что NestedSet как раз для того чтобы, вытащить часть родителей и не делать рекурсию...

еще нашел вариант, серилизации в отдельном столбце всех id родителей, например: 001.005.009.020.030

Это сообщение отредактировал(а) gcc - 5.5.2009, 11:57
PM WWW ICQ Skype GTalk Jabber   Вверх
Ramirez
Дата 8.5.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

Репутация: 4
Всего: 5



NestedSet  вообще позволяет делать практические любые операции с деревом без рекурсии и достаточно простыми запросами.
единственный минус - очень ресурсоемкие операции вставки/перемещения узлов.

Это сообщение отредактировал(а) Ramirez - 8.5.2009, 11:20
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.