| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > Ищется самый оптимальный алгоритм по выводу дерева |
| Автор: webaliser 15.12.2007, 17:35 | ||
| Цель вопроса: тайминги срабатывания кода или чем быстрее обрабатывается код - тем лучше! Дано: Если честно, речь идет о обработке $_SERVER['REQUEST_URI'] и mod_rewrite'е. Допустим поступает нам строка http://domain/pages/page_group/page_group2/page1 , соответственно, $_SERVER['REQUEST_URI'] видит /pages/page_group/page_group2/page1 Есть таблица Т в базе MySQL, в ней есть несколько полей: - ИД (уникальный символьный ключ). В нашем случае: page1 - Парент (его предок). В нашем случае: group2 - Парентс (все предки). В нашем случае: pages/group1/group2 - Нэйм (Символическое название). В нашем случае (допустим): СТРАНИЦА1 ВОПРОС: Нужен алгоритм (без примеров кода) как хранить или как обрабатывать данные с базы по запросу $_SERVER['REQUEST_URI'] чтобы получить вот такое: Вход: http://domain/pages/group1/group2/page1 Выход:
или вот так: http://domain/->http://domain/pages->http://domain/pages/group1->http://domain/pages/group1/group2->http://domain/pages/group1/group2/page1 Допускаются любые модификации структуры базы и способов хранения данных в полях. ВСЕМ УЧАСТВУЮЩИМ: Большое СПС! ...пожалуйста без оффтопа и "посылания почитать букварь", алгоритм у меня есть, хочу добится быстрой обработки... |
| Автор: WolfON 15.12.2007, 17:43 |
| если прям текстом так и хранится пусть в бд, то для выбора группы почему-бы не сделать `group` LIKE 'group1/subgroup2/sasa/%' ? хотя это и не очень эффективно |
| Автор: webaliser 15.12.2007, 17:53 |
| Эффективность?! не знаю, Я даже рассматривал вариант по генерированию кода непосредственно при создании элемента или изменения ключа ИД.?! Но это бред! |
| Автор: Vaulter 15.12.2007, 19:00 |
| http://www.google.com/search?q=Nested+Tree&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a |
| Автор: Feldmarschall 15.12.2007, 19:16 |
| Я тоже думаю, что лайком неэффективно. Самое простое - это 4 рекурсивных запроса, получающих парент. Быстро и просто. Точно такой же вопрос только что задавали в базах данных MySQL. |
| Автор: webaliser 15.12.2007, 20:19 |
| SelenIT, Жжешь, ща попробую... замерю и напишу ... а что значит известная или не известная вложенность?! Мне может прийти запрос рода http://domain/t1/t2/t3/t4/t5/t6/t7/t8/t9 - не исключено... и мне нужно будет написать чтото вроде Главная->Tab1->Tab2->Tab3->Tab4->Tab5->Tab6->Tab7->Tab8->Tab9 ...вот так! |
| Автор: Feldmarschall 15.12.2007, 20:22 |
| SelenIT, а оно надо? |
| Автор: webaliser 15.12.2007, 20:35 |
| Комрады, а у мускула есть ф-ция типа как на ПХП substr ??? |
| Автор: Feldmarschall 15.12.2007, 20:38 |
| есть, а что? |
| Автор: SelenIT 15.12.2007, 20:39 |
...почему "как", http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr © Добавлено через 5 минут и 59 секунд В данном случае она всегда известная - сколько "каталогов" в URI, столько же "шагов" в "хлебных крошках". А может быть модель, когда такой однозначной зависимости нет, страница с любым URI теоретически может быть потомком кого угодно - вот там однозначно рулит Nested Sets |
| Автор: Feldmarschall 15.12.2007, 20:56 |
| стоп. у него же комбинированная таблица - материализованная смежность: следовательно, даже джойны не нужны - строку на элементы разбиваша, запрос с or формироваша. |
| Автор: webaliser 15.12.2007, 22:23 |
| Feldmarschall, типа где (парентс=pages/group1 энд ИД=group2) ор (парентс=pages энд ИД=group1) ор (парентс=null энд ИД=pages) ?! Хороший вариант... |