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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсивная выборка 
:(
    Опции темы
bars80080
Дата 10.2.2011, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



есть в БД таблица страниц, структура примерно такая: id int, parent int, url varchar(128), ...
урл запроса http://site.ru/module1/module2/module3/  разбивается на части module1, module2, module3

далее начинаются рекурсивные запросы:

выбрать все строки с parent=0
проверить, совпадает ли module1 с url
если нет, проверить, есть ли url равный пустой строке
если нет, то выбрать модуль с меткой по-умолчанию, либо самый старый

возвращаемся в начало, где подсовываем для сравнения parent = id выбранной строки. и если в предыдущий раз module1 == url, значит сравниваем с module2


всё хорошо работает, за исключением того, что получается несколько запросов. хотелось бы упростить это и желательно до одного запроса. однако, учитывая, что мне желательно иметь все сестринские строки (с тем же parent, что и совпавшая строка) для построения меню, то получается надо делать выборку всего.

соответственно вопрос, что лучше: оставить несколько запросов или выбрать всё, а дальше уже крутиться на пхп?

строк на данный момент не много - сейчас около 50, ну может вырастет в 2-5 раз. это у меня не номенклатурные товары в списке страниц, а только модули.
PM MAIL WWW   Вверх
ksnk
Дата 10.2.2011, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



bars80080, как универсальный вариант - можно кэшировать такие запросы. Как прилетело что-то - результат анализа можно сохранить в табличку. Так как это "не номенклатурные товары в списке страниц, а только модули ", то табличка получится в перспективе - статическая.

А так я что-то не понимаю как устроена url-ификация сайта. Обычно оно что-то вроде /модуль/функция/параметр, а тут как - несколько модулей на странице?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 10.2.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(ksnk @  10.2.2011,  19:56 Найти цитируемый пост)
а тут как - несколько модулей на странице? 

у меня вложенные модули. модуль1 отвечает за общий вид страницы. к примеру, для лицевой стороны он один, для админки - другой, а третий вообще вида не имеет, только подгружает какой-нибудь функционал. модуль2 это допустим форум или лента новостей. модуль3 - это открытая тема или личный кабинет.

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



Цитата(ksnk @  10.2.2011,  19:56 Найти цитируемый пост)
как универсальный вариант - можно кэшировать такие запросы

может быть. если конечно принять идею, что изменения будут очень редкими
PM MAIL WWW   Вверх
ksnk
Дата 10.2.2011, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



тоесть, пока полностью не отработает "модуль1" анализировать остаток урл не имеет смысла? 

Цитата(bars80080 @  10.2.2011,  20:30 Найти цитируемый пост)
выбрать все строки с parent=0
проверить, совпадает ли module1 с url
...
возвращаемся в начало, где подсовываем для сравнения parent = id выбранной строки. и если в предыдущий раз module1 == url, значит сравниваем с module2

итого - модуль1 определяет в точности что и как может в нем находится? То есть УЖЕ где-то в базе хранится вся структура сайта в деревянном списке? Зачем тогда указывать путь до веточки этого дерева в таком виде? Можно просто указать индекс ветки в урл. а поднявшись по всех родителям получить список "родительских" модулей.




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 11.2.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(ksnk @  10.2.2011,  22:53 Найти цитируемый пост)
тоесть, пока полностью не отработает "модуль1" анализировать остаток урл не имеет смысла? 

нет, 
к примеру, последний модуль может затребовать авторизацию, тогда смысла отрабатывать верхним модулям нет, найденные права последнего модуля выведут пользователя к форме авторизации.
с другой стороны авторизованный пользователь может быть ограничен в правах настолько, что лучше сразу выбросить статус 404 и завершить работу. зачем лишний раз гонять систему?


Цитата(ksnk @  10.2.2011,  22:53 Найти цитируемый пост)
То есть УЖЕ где-то в базе хранится вся структура сайта в деревянном списке?

не, деревянных списков вообще нет. просто часть урла /модуль1/модуль2 ведёт по цепочке модулей из таблицы pages, а другая часть цепочки /модуль3/модуль4 ведёт по цепочке раздела и названия новости из таблицы новостей


Цитата(ksnk @  10.2.2011,  22:53 Найти цитируемый пост)
а поднявшись по всех родителям получить список "родительских" модулей.

сквозные урлы? дело в том, что мне почти всегда нужны сестринские разделы. даже если я буду указывать 
site.ru/module/остальная_часть_урла_не_являющаяся_модулем
то как будет выглядеть запрос? найти модуль, найти его родителей пошагово или по заранее сформированному полю с перечисленными id родителей,  выбрать все записи с теми же родителями.
по сути получается тоже самое
PM MAIL WWW   Вверх
ksnk
Дата 11.2.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(bars80080 @  11.2.2011,  10:22 Найти цитируемый пост)
не, деревянных списков вообще нет. 

а это тогда что?
Цитата

есть в БД таблица страниц, структура примерно такая: id int, parent int, url varchar(128),


хмм... то есть урл выглядит как 
/шаблон/зима/вариант3 + 
/новости/февраль/номер5 + 
... 
и так далее, только в одну строку? Число параметров определяется "головным" модулем, который выковыривает оставшиеся параметры.

Причем кусочек "/шаблон/зима/вариант3" находится в веточке дерева, хранящейся в таблице, как и /новости/февраль. И именно их и нужно быстро выковырять из базы? 






--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 11.2.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



id int, parent int, url varchar(128

url это кусочек урла между двумя слэшами, то есть это "шаблон", либо "зима", либо "вариант3", либо ""

Добавлено через 6 минут и 9 секунд
они насаживаются, как дерево

к примеру, site.ru/corporate/news/direktor-vydal-zarplatu/

а в таблице ей может соответствовать такой набор строк:

id | parent | title | url
2 | 0 | лицевая сторона сайта |
7 | 2 | компания |
18 | 7 | корпоративный отдел | corporate
24 | 18 | новости | news

а кусочек direktor-vydal-zarplatu - это поле chpu в таблице corporate_news

причём, как видно, при такой структуре строк с url == news может быть несколько. главное, чтобы у них при этом parent не совпадал
PM MAIL WWW   Вверх
z-END
Дата 11.2.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



т.е .страницы могут быть вообще без URL? )))


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
bars80080
Дата 11.2.2011, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



Цитата(z-END @  11.2.2011,  19:34 Найти цитируемый пост)
т.е .страницы могут быть вообще без URL?

почему бы и нет? пустая строка - тоже адрес.
определяется так: ищется 

parent=0 and url=corporate

, если не находится, то берётся

parent=0 and url=''

если нашлось, в нашем примере (2 | 0 | лицевая сторона сайта | ), то дальше

ищется parent=2 and url=corporate
затем parent=2 and url='' - нашлось (7 | 2 | компания | )
затем parent=7 and url=corporate - нашлось (18 | 7 | корпоративный отдел | corporate)
затем parent=18 and url=news

и так далее

только сейчас я сразу выбираю строки с нужным parent, а затем на пхп ищу совпадения по url=module, и дальше с пустой строкой и т.п.
но всё равно получается запросов 3-5 только для построения дерева модулей
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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