![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| myth777 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 30.3.2009 Репутация: -1 Всего: -1 |
Лучше всего одна таблица с
ParentId ID Если предпологается большая выборка из таблицы то для быстрого поиска и пробежке по дочерним нодам лучше создать дополнительную таблицу с сылкой на дочерние ноды и принебречь избыточностью данных. |
|||
|
||||
| Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
Я делал это несколькими способами. 1. Самый простой: в форме деталей раздела поле select, а в нем все разделы. выбираешь нужный, и сабмитишь 2. аяксовый есть для jquery плагин. simpletree кажется. у него есть возможность перемещать узлы дерева мышкой. выводишь на страницу дерево, перемещаешь узлы куда надо. И нажимаешь кнопку сохранить структуру дерева. жаваскрипт пробегает по всему дереву строит список узлов и информацией об id, parentid и отправляет на сервер. Там это все сохраняется в таблицу. Вариант очень удобен для сортировки узлов дерева. 3. Тоже что и второй, только данные отправляются по каждому узлу, который перетащил куда-либо. Вариант удобен для работы с большими деревьями. --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
подскажите как вывести всех родителей дерева из id и name
есть
используется MySQL, рекурсии в ней нету, такой запрос не реально написать может ORM поможет? или как запрос написать, в гугле не нашел....! |
|||
|
||||
| sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
gcc, ну вы почитайте топик с самого начала. Все как раз таким вопросом и задаются.
Там даже статья есть. В MySQL - пока никак. Т.е. нужно придумывать доп. конструкции в базе В PostgreSQL - вроде добавили рекурсию в последней версии |
|||
|
||||
| Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
1. По каждому найденному родительскому узлу делать sql запрос. Минусы - много запросов к бд. Если кол. данных возвращаемых запросом небольшое, то есть большая вероятность, что запросы будут положены в кеш бд. Соответственно скорость работы будет высокой. 2. Кешировать у себя в программе целиком дерево. Можно кешировать простым списком, а можно строить полноценное дерево. На CPAN есть модули работы с деревьями. Т.к. данные все есть, то выбрать из них нужное не составит проблем. Способ не очешь хорош на больших деревьях, т.к. приходится все дерево хранить в памяти. Но зато очень быстрый. Если Ваше приложение - cgi, то стоит подумать, что выбрать. Если fastcgi и т.п., то однозначно второй способ. Только надо не забывать при изменении дерева обновлять кеш. Я всегда использовал второй способ для древовидной структуры сайтов. Мне так удобней. Выбирается 1 раз все дерево. И эти данные пихаются в разные функции, которые на выходе дают, что я хочу. Получается выгода, если в течение одного запроса пользователя нужно несколько раз использовать данные дерева. Например, построить меню и путь к текущей странице ( цепочка ссылок предков ) И еще. Можно хранить не целиком все данные о дереве, а только id, parent_id, sort. Тогда будет меньше памяти занимать. А недостающие данные можно уже доставать sql запросом. --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
нашел что NestedSet как раз для того чтобы, вытащить часть родителей и не делать рекурсию...
еще нашел вариант, серилизации в отдельном столбце всех id родителей, например: 001.005.009.020.030 Это сообщение отредактировал(а) gcc - 5.5.2009, 11:57 |
|||
|
||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
NestedSet вообще позволяет делать практические любые операции с деревом без рекурсии и достаточно простыми запросами.
единственный минус - очень ресурсоемкие операции вставки/перемещения узлов. Это сообщение отредактировал(а) Ramirez - 8.5.2009, 11:20 |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |