Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ищется самый оптимальный алгоритм по выводу дерева 
:(
    Опции темы
webaliser
Дата 15.12.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цель вопроса: тайминги срабатывания кода или чем быстрее обрабатывается код - тем лучше!

Дано:
Если честно, речь идет о обработке $_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
Выход:
Код

<a href="http://domain/">Главная</a>
-&gt;<a href="http://domain/pages">Страницы</a>
-&gt;<a href="http://domain/pages/group1">Группа1</a>
-&gt;<a href="http://domain/pages/group1/group2">Группа2</a>
-&gt;<a href="http://domain/pages/group1/group2/page1">СТРАНИЦА1</a>

или вот так: Главная->Страницы->Группа1->Группа2->СТРАНИЦА1


Допускаются любые модификации структуры базы и способов хранения данных в полях.

ВСЕМ УЧАСТВУЮЩИМ:    Большое СПС!

...пожалуйста без  оффтопа и "посылания почитать букварь", алгоритм у меня есть, хочу добится быстрой обработки...
PM MAIL   Вверх
WolfON
Дата 15.12.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если прям текстом так и хранится  пусть в бд, то для выбора группы почему-бы не сделать `group` LIKE 'group1/subgroup2/sasa/%' ?
хотя это и не очень эффективно
PM MAIL ICQ   Вверх
webaliser
Дата 15.12.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Эффективность?! не знаю,

Я даже рассматривал вариант по генерированию кода непосредственно при создании элемента или изменения ключа ИД.?! Но это бред!
PM MAIL   Вверх
Vaulter
Дата 15.12.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 22





--------------------
PM MAIL WWW ICQ   Вверх
Feldmarschall
Дата 15.12.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Я тоже думаю, что лайком неэффективно.
Самое простое - это 4 рекурсивных запроса, получающих парент. Быстро и просто.

Точно такой же вопрос только что задавали в базах данных MySQL.
PM   Вверх
SelenIT
Дата 15.12.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 2
Всего: 401



Цитата(Feldmarschall @  15.12.2007,  19:16 Найти цитируемый пост)
Точно такой же вопрос только что задавали в базах данных MySQL.

Не точно такой же smile. Там была неизвестная вложенность, тут известная. Поэтому для решения в один запрос вместо LEFT JOIN-а мы вправе воспользоваться INNER-ом и получить еще большую скорость:
Код

SELECT t0.id, t0.name, t1.id, t1.name, t2.id, t2.name, t3.id, t3.name
FROM T t0
INNER JOIN T t1 ON t1.id = t0.parent
INNER JOIN T t2 ON t2.id = t1.parent
INNER JOIN T t3 ON t3.id = t2.parent
WHERE t3.id = 'pages' AND t2.id = 'group1' AND t3.id = 'group2' AND t0.id = 'page1'

Тогда полный путь (parents) оказывается, по сути, избыточным и ненужным.

А Nested Sets, имхо, в данной конкретной задаче вряд ли даст существенное упрощение. Разве что если просто выбрать всех предков конечной страницы (это как раз в Nested Sets делается в один запрос элементарно), а уже в скрипте сравнить их состав и порядок с соответствующими элементами URI, и в случае несовпадения - редиректить на Error 404... Правда, нужно помнить, что в Nested Sets не получится легко поменять порядок вывода ветвей, и для любых модификаций дерева (добавление/удаление/перемещение) придется тем или иным образом шерстить всю таблицу...

Это сообщение отредактировал(а) SelenIT - 15.12.2007, 20:22


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
webaliser
Дата 15.12.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



SelenIT, Жжешь, ща попробую... замерю и напишу  smile 

... а что значит известная или не известная вложенность?!

Мне может прийти запрос рода http://domain/t1/t2/t3/t4/t5/t6/t7/t8/t9 - не исключено... и мне нужно будет написать чтото вроде

Главная->Tab1->Tab2->Tab3->Tab4->Tab5->Tab6->Tab7->Tab8->Tab9

...вот так!

Это сообщение отредактировал(а) webaliser - 15.12.2007, 20:24
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



SelenIT, а оно надо?

PM   Вверх
webaliser
Дата 15.12.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Комрады, а у мускула есть ф-ция типа как на ПХП substr ???
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



есть, а что?
PM   Вверх
SelenIT
Дата 15.12.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 2
Всего: 401



Цитата(webaliser @  15.12.2007,  20:35 Найти цитируемый пост)
ф-ция типа как на ПХП substr ???

...почему "как", обидно даже © smile

Добавлено через 5 минут и 59 секунд
Цитата(webaliser @  15.12.2007,  20:19 Найти цитируемый пост)
а что значит известная или не известная вложенность?!

В данном случае она всегда известная - сколько "каталогов" в URI, столько же "шагов" в "хлебных крошках". А может быть модель, когда такой однозначной зависимости нет, страница с любым URI теоретически может быть потомком кого угодно - вот там однозначно рулит Nested Sets smile.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 20:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



стоп.
у него же комбинированная таблица - материализованная смежность:

Цитата(webaliser @  15.12.2007,  17:35 Найти цитируемый пост)
 - Парентс (все предки). В нашем случае: pages/group1/group2


следовательно, даже джойны не нужны - строку на элементы разбиваша, запрос с or формироваша.

PM   Вверх
webaliser
Дата 15.12.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Feldmarschall, типа где (парентс=pages/group1 энд ИД=group2) ор (парентс=pages энд ИД=group1) ор (парентс=null энд ИД=pages) ?! 

Хороший вариант...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

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


 




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


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

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