Welcome to PHPClub
В эти выходные на LinuxFest v.12! Поляна от PHPClubа Мастер-классы по Javascript, AJAX/COMET, jQuery!
Боишься нашего дизайна?
поиск:
   
 Начало | Настройки | Расширенный поиск | РегистрацияПосмотреть новые сообщения 
  
PHP Club форумы: > PHP и базы данных > PHP & Mysql > Архитектура таблицы разделов сайта
Страниц (3): [1] 2 3 » |  

Автор
Тема ОТВЕТИТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург
Архитектура таблицы разделов сайта

Как удобнее (оптимальнее в плане скорости) хранить данные о разделах сайта. Разделов ожидается не более 50.

Работа с разделами проста: скрипт парсит урл и сверяет по таблице url разделов пока не пройдет весь урл. Если путь не верный - 404, если верный то смотрим в таблице как обработчик и параметры стоят у последнего раздела и запускаем обработчик.

Как организовать такую проверку на практике. Или есть более правильная схема?

Old Post 31.07.05 14:22 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SelenIT
IT-лунатик :)

На форуме с: Sep 2004
Cообщений: 1796
Город:

Иван Шумков
если я правильно понял, речь идет о виртуальных путях ЧПУ?

Old Post 31.07.05 16:26 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

SelenIT
Да, вы правильно поняли.

-~{}~ 31.07.05 20:15:

Вот что у меня пришло в голову:
id - ид раздела
parent_id - ид родителя
title - название раздела
url - его урл (либо писать сюда весь путь к разделу?)
handler - обработчик
source_id - ид данных

Если писать урл только конкретного раздела, то надо рекурсивной функцией бежать по всей цепочки урлов до конца, таким образом проверяя есть ли такой раздел.

Либо, если указывать полный путь в урл то можно один запросом это проверять, но тогда сложнее реализовать редактирование/создание разделов.

Если есть документ определяем хендлер и ид данных, и передаем управление ему. Он же знает из какой таблицы брать данные по иду.

Или все это маразм?
Как реализуются такие вещи?

Old Post 31.07.05 16:58 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
mani13
Активист PHPClub

На форуме с: Jun 2004
Cообщений: 316
Город: Moscow, Russia

pid - page id - идентификатор страницы
[title] - заголовок страницы
url - полный урл страницы
handler - обработчик

в простом варианте так
искать:
1. посмотрели базовый урл, нет такого - отрезали часть, записали в параметры
2. посмотрели базовый урл, нет такого - 404 Not Found

а source_id -- это что за id данных?

всё - ИМХО

Old Post 31.07.05 18:52 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

mani13
 
1. посмотрели базовый урл, нет такого - отрезали часть, записали в параметры
2. посмотрели базовый урл, нет такого - 404 Not Found


Не понял, можно пожалуйста подробнее.

Old Post 31.07.05 19:52 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
mani13
Активист PHPClub

На форуме с: Jun 2004
Cообщений: 316
Город: Moscow, Russia

Иван Шумков
1.
есть, например,
/news/sport и /news/net, отображающие категории новостей, и есть /news, отображающая все новости
добавляем в БД запись
/news/ | news.php

а при загрузке страницы
если в базе есть полностью, то берём полностью
если нет, то отрезаем часть(/news/sport -> /news), а sport записываем в первый параметр, повторяем операцию

ИТОГО: удобно для чего-нибудь с параметрами(дата, ид топика и проч.), так как параметры откинутся + можно под определённые условия создать отдельный обработчик(например, захотелось добавить /news/tv со своим супер-пупер форматом)
но, ИМХО, не совсем красиво получается, если нет страницы(например, /shop), так как просто отобразится главная страница

2. писать полные урлы и искать именно их полностью
то есть
/news/sport/ | news.php
/news/net/ | news.php
/news/ | news.php
только там уже придётся в news.php писать что-то, что будет само определять есть ли категория либо заводить по обработчику на категорию, что не очень хорошо при изменении одного...
ИТОГО: со страницами всё нормально - нет, так нет...
но, если есть динамический контент(например, просмотр каждой новости отдельно), надо заводить в базу все эти новости, а их может быть очень много....

Old Post 31.07.05 20:11 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
crocodile2u
http://vbolshov.org.ru

На форуме с: Feb 2004
Cообщений: 1810
Город: Obninsk, Russia

Иван Шумков
 
Если писать урл только конкретного раздела, то надо рекурсивной функцией бежать по всей цепочки урлов до конца, таким образом проверяя есть ли такой раздел.


Зачем рекурсивной функцией?
Допустим, есть URL: /news/sport/smth
Выбираем из базы:
SQL:


SELECT *
FROM menu
WHERE url
IN (
'news', 'sport', 'smth'
)


Дальше остается только немного обработать результаты выборки.

Old Post 01.08.05 07:32 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SelenIT
IT-лунатик :)

На форуме с: Sep 2004
Cообщений: 1796
Город:

Используя подход, описанный здесь, можно по идее выбрать и проверить вообще все сразу одним запросом, наподобие такого:
SQL:


SELECT t02.id
FROM tree t00
LEFT JOIN tree t01 ON ( t01.parent_id = t00.id )
LEFT JOIN tree t02 ON ( t02.parent_id = t01.id )
WHERE t00.url = 'news' AND t01.url = 'sport' AND t02.url = 'smth'


По идее, с правильными индексами работает такая вещь быстро, так что на 50-100 записях проблем вообще не предвидится.

P.S. До вчерашнего дня я сам склонялся к хранению псевдоурлов целиком, но теперь крепко задумался и уже ни в чем не уверен...

Old Post 01.08.05 08:07 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

SelenIT
А чем ваш вариант лучше варианта crocodile2u?

Old Post 01.08.05 12:20 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SelenIT
IT-лунатик :)

На форуме с: Sep 2004
Cообщений: 1796
Город:

Во-первых, этот вариант не такой уж и мой , во-вторых, результат такого запроса не надо обрабатывать, он уже говорит сам за себя (если цепочке /news/sport/smth соответствует какой-то раздел - будет сразу найден его id, если не соответствует - результат будет пустым). Правда, это все в предположении, что все элементы URLа кодируют раздел.

Old Post 01.08.05 12:47 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

SelenIT
А что если не все?
Например в урле /main/news/2005/, main и news - разделы, а 2005 параметр? Тогда не совсем ваш запрос не помойму не подходит

Old Post 01.08.05 13:24 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SelenIT
IT-лунатик :)

На форуме с: Sep 2004
Cообщений: 1796
Город:

Навскидку для такого случая пойдет такой запрос:
SQL:


SELECT IF (
t02.id IS NOT NULL , t02.id,
IF (
t01.id IS NOT NULL , t01.id, t00.id
)
)
FROM tree t00
LEFT JOIN tree t01 ON ( t01.parent_id = t00.id AND t01.url = 'sport' )
LEFT JOIN tree t02 ON ( t02.parent_id = t01.id AND t02.url = '2005' )
WHERE t00.url = 'news'


Old Post 01.08.05 13:51 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

SelenIT
Мы же изначально не знаем что 2005! Это может быть раздел!

-~{}~ 01.08.05 17:34:

Я пытался сказать, что мы изначально (при определении обработчика) не знаем, что у нас в урле параметр, а что раздел.

Old Post 01.08.05 14:28 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
mani13
Активист PHPClub

На форуме с: Jun 2004
Cообщений: 316
Город: Moscow, Russia

SQL:


SELECT t00.id AS t00id, t01.id AS t01id, t02.id AS t02id
FROM tree t00
LEFT JOIN tree t01 ON ( t01.parent_id = t00.id && t01.url = 'news' )
LEFT JOIN tree t02 ON ( t02.parent_id = t01.id && t02.url = '2005' )
WHERE t00.url = 'main' && t00.parent_id = 0


что-то вроде этого...
а далее проверяем
code:
if (!empty set) { if (t02id is null) { if (t01id is null) { $id = t00id } else $id = t01id } else $id = t02id } else $id = 0

p.s.: это почти то же самое, что написал SelenIT

Отредактировано mani13 01.08.05 в 14:58
Old Post 01.08.05 14:49 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

mani13
Ни как не могу сгенерить sql и условия проверки.

Попробую на словах:
1. Есть урл main/news/2005
2. Получаем массив $array = array('main', 'news', '2005');
3. Как сгенерить sql?
4. Как сгенерить проверку?
[/php]

Old Post 01.08.05 15:55 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SelenIT
IT-лунатик :)

На форуме с: Sep 2004
Cообщений: 1796
Город:

Иван Шумков
Каковы критерии "раздела" и параметров? Если есть какие-то априорные признаки параметра (например, содержание только цифр или специальный префикс) - то по-моему нужно учесть их при парсинге урла (например, в регулярке) и запросу скармливать только заведомо "непараметрическую" часть. Если же единственный признак "раздела" - наличие в базе, то приведенные примеры запросов в состоянии справиться с проверкой по этому критерию.

А вообще - целесообразно ли делить подобным образом и так условное ЧПУ? Не проще ли для заведомо конечного набора "почти статических" параметров (типа тех же календарных интервалов) предусмотреть "разделы" (это нетрудно автоматизировать), а "явно динамические" и неактуальные для поисковиков (типа SID-ов) вообще не конвертировать в ЧПУ?

Old Post 01.08.05 16:06 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

SelenIT
 
Не проще ли для заведомо конечного набора "почти статических" параметров


Это не очень гибко.

Я понял что подобный запрос мне подходит. Только пока никак не могу его сгенерировать.

Old Post 01.08.05 16:15 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
mani13
Активист PHPClub

На форуме с: Jun 2004
Cообщений: 316
Город: Moscow, Russia

Иван Шумков
3. for ($i=1;$i<count($array);++$i) add join
4. for ($i=count($array)-1;$i>0;--$i) check - break

Old Post 01.08.05 16:31 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
SelenIT
IT-лунатик :)

На форуме с: Sep 2004
Cообщений: 1796
Город:

Вариант генерации запроса, не требующего дальнейшего разбора:

$sql1 
't0.id';
$sql2 " FROM $tablename t0 ";
for(
$i=1$c=count($array); $i<$c$i++) {
   
$sql1 "IF (t$i.id IS NOT NULL, t$i.id, " $sql1 ")";
   
$sql2 .= "LEFT JOIN $tablename t$i ON (t$i.parent_id = t".($i-1).".id AND t$i.url = '" mysql_real_escape_string($array[$i]) . "') ";
}
$sql "SELECT " $sql1 $sql2 " WHERE t0.parent_id = 0 AND t0.url = '" mysql_real_escape_string($array[0]) . "'";

Old Post 01.08.05 16:37 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Иван Шумков
Новичок

На форуме с: Jun 2005
Cообщений: 27
Город: Россия, Санкт-Петербург

SelenIT

Спасибо большое. Все замечательно. Если результат запроса пустить через mysql_fetch_array, то на выходе имеем:
Array
(
[0] => 4
[IF (t1.id IS NOT NULL, t1.id, t0.id)] => 4
)
Первый - это id, а вот зачем второй элемент я не знаю. Это не ошибка?

Old Post 01.08.05 17:24 URL сообщения | инфо об авторе | жалоба | IP: Записан | редактировать | ОТВЕТИТЬ и ЦИТИРОВАТЬ
Время GMT. Текущее время 23:15. Подписаться на Тему | Версия для Печати
Страниц (3): [1] 2 3 » |  

PHP Club форумы: > PHP и базы данных > PHP & Mysql > Архитектура таблицы разделов сайта
 
Оценить:
 
 
 
 

 © 1997-2010 PHPClubTeam      

Powered by vBulletin Copyright © 2000-2010 Jelsoft Enterprises Limited.