Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как получить список категорий деревом?
 
 автор: MIB   (29.10.2008 в 14:29)   письмо автору
 
 

Ситуация: среднестатистический интернет-магазин. Товары как и везде разбиты на категории, подкатегории, подподкатегории и т.д. (неограниченной глубины)...

Вопрос: подскажите пожалста, как организовать вывод списка всех категорий (подкатегорий) в иерархическом порядке (деревом)?

  Ответить  
 
 автор: MIB   (30.10.2008 в 11:00)   письмо автору
 
   для: MIB   (29.10.2008 в 14:29)
 

Никто не знает или это просто из папки "Cash Only"?

  Ответить  
 
 автор: Trianon   (30.10.2008 в 11:03)   письмо автору
 
   для: MIB   (30.10.2008 в 11:00)
 

народу лениво жевать на пустом месте одно и то же который раз.
В поиске тем "Каталог продукции" набирается не один десяток.

  Ответить  
 
 автор: MIB   (30.10.2008 в 15:39)   письмо автору
 
   для: Trianon   (30.10.2008 в 11:03)
 

Замечательно, только задача стоит не в построении каталога продукции - здесь нет ничего сложного, а в логике построения БД для неограниченной глубины подкатегорий и их вывода(!) в форме дерева (например для разворачиваемого списка типа select при добавлени нового товара и т.д.)...

  Ответить  
 
 автор: Trianon   (30.10.2008 в 15:47)   письмо автору
 
   для: MIB   (30.10.2008 в 15:39)
 

Я просто указал, по каким ключевым словам искать.
Но формально Вы правы.

Логика построения БД давно накатана.
Фактически один из двух методов. Adjacency lists либо Nested sets .
Первый хорош, если дерево сравнительно часто модифицируется. Вот как этот форум, например.
Второй отлично подходит , если модификации выполняются редко, и львиная доля запросов - выборка поддерева и его разворот обходом в глубину.

  Ответить  
 
 автор: MIB   (30.10.2008 в 16:01)   письмо автору
 
   для: Trianon   (30.10.2008 в 15:47)
 

Это всё здорово, обязательно изучу. Но имея не столь богатый запас знаний хочу напроситься на урок:
имея таблицу категорий (в т.ч. и подкатегорий и подподкатегорий.... ) мы очень просто можем двигаться по "дереву" (давайте использовать этот термин абстрактно) на шаг вниз и вправо, т.е. "смотреть вглубину", но если у данной ветки достигнуто "дно", то каким образом вернуться на шаг вверх и вправо, при этом незациклиться. В принципе задача возвращения на 1 или 2 шага не сложна (просто зададим "координату" через масив), только как решить задачу, если нужно вернуться на несколько шагов? не вопрос можно всё описать n-мерным массивом и по средствам него "шариться" в БД, но мы же потенциально не знаем глубину и соответственно n-мерность массива. Словно ходить по коридорам, заглядывать в двери и не зациклиться на заглядывании в одну и ту же дверь, а по окончании иметь карту здания по которому и производили поиск.

  Ответить  
 
 автор: Trianon   (30.10.2008 в 17:00)   письмо автору
 
   для: MIB   (30.10.2008 в 16:01)
 

процедура обхода дерева всяко зависит от того, как это дерево представлено.
Ваше представление мне не понять. Приводите пример, может так будет яснее.

  Ответить  
 
 автор: MIB   (30.10.2008 в 17:07)   письмо автору
 
   для: Trianon   (30.10.2008 в 17:00)
 

Посмотрите что пишут про обход дерева (в частности левосторонний)... как программно реализовать фразы "возвращаемся – 5, возвращаемся – 2"? если необходимо возвратиться не на 2 шага назад, а на 10?

  Ответить  
 
 автор: Trianon   (30.10.2008 в 17:12)   письмо автору
 
   для: MIB   (30.10.2008 в 17:07)
 

То есть Вы предлагаете написать обход дерева по его gif-картинке? :)

Читайте дальше.

  Ответить  
 
 автор: MIB   (30.10.2008 в 17:27)   письмо автору
 
   для: Trianon   (30.10.2008 в 17:12)
 

да нет же... при чём здесь картинка?
Пример:
БД, в которой администратор редактирует подкатегории товаров, например:
1. HDD
1.1. Seafgate
1.1.1. >500Gb
1.1.1.1. SAS
1.1.1.2. SATA
1.1.1.3. IDE
1.1.2. <500Gb
1.1.2.1. SAS
1.1.2.2. SATA
1.1.2.3. IDE
1.2. Maxtor
1.2.1. >500Gb
1.2.1.1. SAS
1.3. WD
1.3.1. >500Gb
1.3.1.1. SAS
1.3.1.2. SATA
1.3.1.3. IDE
1.3.2. <500Gb
1.3.2.1. SAS
1.3.2.2. SATA
1.3.2.3. IDE
1.4. Samsung
2. CPU
2.1. Intel
2.2. AMD

вот и смотрим: 1.HDD далее 1.1.Seagate -> 1.1.1. >500Gb -> 1.1.1.1SAS (достигнуто "дно"), теперь необходимо вернуться на шаг назад (1.1.1. >500Gb) и вниз (1.1.1.2. SATA) и т.д. Вопрос: как реализовать этот шаг назад и вниз? если необходимо сделать несколько шагов назад (см.п.1.2., где одна ветвь длинне соседней на несколько шагов)...

  Ответить  
 
 автор: MIB   (31.10.2008 в 12:41)   письмо автору
 
   для: MIB   (30.10.2008 в 17:27)
 

может кто-нить подскажет? плиз...

  Ответить  
 
 автор: sim5   (31.10.2008 в 15:35)   письмо автору
 
   для: MIB   (31.10.2008 в 12:41)
 

Да вам Trianon вроде бы как давал ссылки на решение вопроса. Но вот не понятно, зачем "прыгать" по дереву - в верх, в низ вправо?

  Ответить  
 
 автор: MIB   (31.10.2008 в 17:12)   письмо автору
 
   для: sim5   (31.10.2008 в 15:35)
 

не прыгать, а последовательно проходить по всему "дереву".... НА самом деле прыгать придётся по записям таблицы в БД, но как организовать эти правильные переходы от одной записи к другой? особенно когда необходимо перейти на категорию ниже и на этом уровне сделать шаг вниз...

  Ответить  
 
 автор: sim5   (31.10.2008 в 17:37)   письмо автору
 
   для: MIB   (31.10.2008 в 17:12)
 

Ну как же не прыгать, если вы опять пишите - "когда необходимо перейти на категорию ниже и на этом уровне сделать шаг вниз". Для чего? Если вам требется взять конкретную категорию, зачем "скакать" по всему дереву или части ее? Если вам надо взять отдельную ветвь ее, тоже - какие проблемы, как и получить все дерево? Ссылки вам дали - пользуйтесь, получайте все дерево, часть его... Не знаю, может доктор Trianon вас поймет, а я не понимаю - к чему эти маневры в дереве )

  Ответить  
 
 автор: Trianon   (31.10.2008 в 17:50)   письмо автору
 
   для: MIB   (31.10.2008 в 17:12)
 

Давайте так. Вы приведете небольшой пример дерева в виде SQL-таблицы (Adjacency List или Nested Sets)
Я покажу Вам, как прыгать.

  Ответить  
 
 автор: MIB   (01.11.2008 в 17:36)   письмо автору
 
   для: Trianon   (31.10.2008 в 17:50)
 

не надо было спать на лекциях в своё время! Задача решена, всем спасибо!

  Ответить  
 
 автор: udpn   (01.11.2008 в 19:27)   письмо автору
 
   для: MIB   (31.10.2008 в 12:41)
 

Ключевое слово в решении этого вопроса - рекурсия.

  Ответить  
 
 автор: Trianon   (01.11.2008 в 19:38)   письмо автору
 
   для: udpn   (01.11.2008 в 19:27)
 

Только для AL
Для NS и MP она нахрен не нужна.

  Ответить  
 
 автор: udpn   (01.11.2008 в 19:59)   письмо автору
 
   для: Trianon   (01.11.2008 в 19:38)
 

Согласен =)

Хочу добавить что если для каждого обращения полььзователя строить дерево, может быть весьма неслабая нагрузка, потому что это дело совершает много SQL запросов, поэтому неплохо бы кешировать это дерево.

  Ответить  
 
 автор: BinLaden   (01.11.2008 в 20:55)   письмо автору
 
   для: udpn   (01.11.2008 в 19:59)
 

Вы, пожалуйста, не говорите лишнего. Для того же NS сколько запросов нужно?

  Ответить  
 
 автор: udpn   (01.11.2008 в 23:25)   письмо автору
 
   для: BinLaden   (01.11.2008 в 20:55)
 

Вы пожалуйста сами не говорите лишнего =) Кто сказал что используется именно Nested Sets?

  Ответить  
 
 автор: BinLaden   (01.11.2008 в 23:50)   письмо автору
 
   для: udpn   (01.11.2008 в 23:25)
 

OK.

> Кто сказал что используется именно Nested Sets?
Никто. Ровно как никто и не сказал, что оно не используется. Было лишь сказано Вами:

> для каждого обращения полььзователя строить дерево, может быть весьма неслабая нагрузка, потому что это дело совершает много SQL запросов

Значит я имею право считать, что Вы говорили и про Nested Sets, и про Materialized Path, и про Adjacency List и т.д., т.е. Вы утверждаете, что для всех этих способов организации хранения деревьев используется "много SQL запросов".

  Ответить  
 
 автор: udpn   (02.11.2008 в 00:15)   письмо автору
 
   для: BinLaden   (01.11.2008 в 23:50)
 

Понимаете, это как замена умножений на сложения. Сколько бы ни было умножений, но пока их можно заменить на сложения, их "слишком много".

зы Обязательно проведу на досуге основательный хронометраж.

EDIT "Много запросов" относилось не к единичному обращению к СУБД.

  Ответить  
 
 автор: BinLaden   (02.11.2008 в 01:18)   письмо автору
 
   для: udpn   (02.11.2008 в 00:15)
 

> Понимаете, это как замена умножений на сложения.
> Сколько бы ни было умножений, но пока их можно заменить на сложения, их "слишком много"

o_0

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования