Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > иерархия всех родителей раздела


Автор: taral 4.2.2009, 22:02
Доброго времени суток уважаемые форумчане! Вот думаю как оптимально решить задачу.
Есть таблица:
id_sort
id_parent
title
С ее помощью формируется дерево разделов.
Например:

Аудио, видео, фото техника
        Телевизоры
               ЭЛТ, LCD, плазменные телевизоры
               Портативные (автомобильные) телевизоры
               Аксессуары для телевизоров
        Фото техника
        Видео и Web камеры
 Компьютеры 
 Мобильная связь 
..............
в таблице id_sort уникальный ключ. id_parent уникальный ключ родителя раздела и title название раздела.
А теперь собственно задача.
Когда мы находимся в категории ЭЛТ, LCD, плазменные телевизоры
Показывается менюшка
Аудио, видео, фото техника -> Телевизоры -> ЭЛТ, LCD, плазменные телевизоры
Когда находимся в категории Телевизоры показывается
Аудио, видео, фото техника -> Телевизоры
пока что я вижу 3 решения данной задачи.
1) по id категории находим его родителя по id родителя находим его родителя и т.д.
 недостаток что будет много запросов в базу. при вложенности 10 будет 10 запросов. Потому данный метод я откинул
2) добавить в таблицу еще одну ячейку в которой хранить строку всех родителей.
что-то вроде <a href="...">Аудио, видео, фото техника</a> -> <a href="...">Телевизоры</a> -> ЭЛТ, LCD, плазменные телевизоры
Вариант не нравится. Много лишнего текста. Да и если сайт переедет переедет то ссылки работать не будут. Потому вариант откинул.
3) добавить в ячейкустроку в которой хранить id всех родителей. Что-то вроде 12 23 45. И еще одним запросом получаем строку иерархии.
К 3-му варианту и склоняюсь.
Может есть метод лучше?
               

Автор: lelik133 4.2.2009, 23:14
есть называется Nested Sets (вложенные множества) 
вот ссылочка для ознакомления http://www.internet-technologies.ru/articles/article_635.html ну и google в помощь инфы по ним много.

Автор: destrd 4.2.2009, 23:17
Чёт я не пойму, в третьем варианте типа вы не будете запрашивать категории с этим парентом?

Автор: taral 5.2.2009, 00:07
2destrd
Наоборот. Там перечисляются id категорий родителей.
lelik133 Огромное спасибо. Ознакомлюсь.

Автор: skyboy 5.2.2009, 00:08
Цитата(destrd @  4.2.2009,  22:17 Найти цитируемый пост)
не будете запрашивать категории с этим парентом? 

можно одним запросом получить и єлемент и всех его непосредственных родителей.
Цитата(lelik133 @  4.2.2009,  22:14 Найти цитируемый пост)
есть называется Nested Sets (вложенные множества)

да, только у nested sets есть конструктивное ограничение.
на этом механизме обощенный граф не построишь - только дерево. значит, продукт не может относиться к нескольким категориям, и подкатегория будет относиться только к одной категории. 
А кроме строгого разделения по "полочкам" для продуктов могут применяться и обобщающие категории, вроде "романтический подарок ко Дню святого Валентина" или "эксклюзив" - при использовании netsted sets не "параллельные" ирерархии придется хранить в разных таблицах или вводить доп. поле

Автор: taral 5.2.2009, 00:23
lelik133 Обалдеть! Еще раз спасибо! Прослушал я лекции про деревья в универе =( Тогда казалось что не понадобится.

Добавлено @ 00:30
Я так понял что при добавлении новой категории значения (left right) будут переписываться.

Автор: taral 5.2.2009, 01:13
Класс! Все равно способ очень хороший!

Автор: lelik133 5.2.2009, 11:44
skyboy, ну про то что элемент должен присутствовать в нескольких категориях автор не упоминал   smile 

Автор: skyboy 5.2.2009, 12:58
lelik133, не, ну я уточнил неочевидные(как на меня) на первый взгляд(как на меня) вещи. против nested sets абсолютно ничего  не имею.

Автор: taral 5.2.2009, 15:16
Всем спасибо. Я думаю что все вопросы решены. Потому закрываю тему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)