![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 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 раз. это у меня не номенклатурные товары в списке страниц, а только модули. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
bars80080, как универсальный вариант - можно кэшировать такие запросы. Как прилетело что-то - результат анализа можно сохранить в табличку. Так как это "не номенклатурные товары в списке страниц, а только модули ", то табличка получится в перспективе - статическая.
А так я что-то не понимаю как устроена url-ификация сайта. Обычно оно что-то вроде /модуль/функция/параметр, а тут как - несколько модулей на странице? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
у меня вложенные модули. модуль1 отвечает за общий вид страницы. к примеру, для лицевой стороны он один, для админки - другой, а третий вообще вида не имеет, только подгружает какой-нибудь функционал. модуль2 это допустим форум или лента новостей. модуль3 - это открытая тема или личный кабинет. самое хорошее в такой структуре, что каждый модуль сам решает, что делать ему дальше. к примеру, он может взять остатки урла и поискать в базе определённым способов какие-нибудь статьи, или запросить данные со стороны. сам урл этого не решает. может быть. если конечно принять идею, что изменения будут очень редкими |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
тоесть, пока полностью не отработает "модуль1" анализировать остаток урл не имеет смысла?
итого - модуль1 определяет в точности что и как может в нем находится? То есть УЖЕ где-то в базе хранится вся структура сайта в деревянном списке? Зачем тогда указывать путь до веточки этого дерева в таком виде? Можно просто указать индекс ветки в урл. а поднявшись по всех родителям получить список "родительских" модулей. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| bars80080 |
|
||||||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
нет, к примеру, последний модуль может затребовать авторизацию, тогда смысла отрабатывать верхним модулям нет, найденные права последнего модуля выведут пользователя к форме авторизации. с другой стороны авторизованный пользователь может быть ограничен в правах настолько, что лучше сразу выбросить статус 404 и завершить работу. зачем лишний раз гонять систему?
не, деревянных списков вообще нет. просто часть урла /модуль1/модуль2 ведёт по цепочке модулей из таблицы pages, а другая часть цепочки /модуль3/модуль4 ведёт по цепочке раздела и названия новости из таблицы новостей
сквозные урлы? дело в том, что мне почти всегда нужны сестринские разделы. даже если я буду указывать site.ru/module/остальная_часть_урла_не_являющаяся_модулем то как будет выглядеть запрос? найти модуль, найти его родителей пошагово или по заранее сформированному полю с перечисленными id родителей, выбрать все записи с теми же родителями. по сути получается тоже самое |
||||||
|
|||||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 14 Всего: 386 |
а это тогда что?
хмм... то есть урл выглядит как /шаблон/зима/вариант3 + /новости/февраль/номер5 + ... и так далее, только в одну строку? Число параметров определяется "головным" модулем, который выковыривает оставшиеся параметры. Причем кусочек "/шаблон/зима/вариант3" находится в веточке дерева, хранящейся в таблице, как и /новости/февраль. И именно их и нужно быстро выковырять из базы? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 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 не совпадал |
|||
|
||||
| z-END |
|
|||
![]() прафесар™ ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3014 Регистрация: 13.3.2003 Где: Венья, Пиетари Репутация: нет Всего: 102 |
т.е .страницы могут быть вообще без URL? )))
-------------------- Каждый чилавек пасвоему праф...а памоему НЕТ! |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
почему бы и нет? пустая строка - тоже адрес. определяется так: ищется 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 только для построения дерева модулей |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |