Как найти id раздела по URL

kvf77

Red Devil
Как найти id раздела по URL

Нужна идея. Ситуация такая:
в базе хранятся в виде nested tree разделы сайта id, nested data, name, path (фрамент пути, например news).
Пользователь набрал скажем
/info/news/archive/
Как наиболее эффективно вычислить id раздела archive?
Я делаю так - нахожу по path id первого раздела (Info) а потом читаю всю ветку info и прохожу по ней по порядку самое последнее совпадение считается нужным разделом. Все работает... но до тех пор пока у нас не повится такое дерево:
info
  news
    archive
  notes
    archive
Тут понятное дело не срабатывает мой метод.
 

Ramzes

Новичок
попробуй хранить в таблице путь в md5 тогда, при запросе /info/news/archive/ просто сравниваешь хеши
 

neko

tеam neko
самое эффективное отказаться от nested sets
честно

тут куда более подходят redundant adjacency lists

-~{}~ 20.12.04 15:53:

Ramzes
крайне скверная идея
 

kvf77

Red Devil
to Ramzes:
гм... надо подумать.

to neko:
поясни что это такое? а то я в яндексе ваще ниче не нашел, а google что-то очень много выдал и в основном мусор
 

neko

tеam neko
Ramzes
потому что субд уже умеет это делать!
надо только дать ей колонку по которой построить индекс

kvf77
adjactency list + полный путь от корня
по последнему строиш индекс и там и ищеш
 

kvf77

Red Devil
гм... а чем тебе не понравились nested sets? они тебе чем помешали в таком случае? Помоему предлложенное тобой никак с ними не пересекается. Просто необходимо вместо куска пути хранить весь путь насколько я понимаю.
Что же всетки такое adjactency list?
 

Ramzes

Новичок
Автор оригинала: neko
потому что субд уже умеет это делать!
надо только дать ей колонку по которой построить индекс
ручаешься, что функция БД md5 даст тот же результат, что и php? (эдентичность строк)
 

neko

tеam neko
как все запущено...

kvf77
гугл

Ramzes
объясняю
субд умеет строить индексы и не надо ее рассматривать как файл
в данном случае это может быть btree или hash
без всяких оверкильных md5

-~{}~ 20.12.04 16:10:

(эдентичность строк)
это вообще песня...
нет там другой, несовместимый алгоритм
md5.5b
 

Popoff

popoff.donetsk.ua
возвращает массив, содержащий в себе идентификаторы всех элементов на пути к вершине:

PHP:
function text_file_path($sFile)
{
  if(!is_string($sFile)) return false;
  if(substr($sFile,-10)=='index.html')
    $sFile=substr($sFile,0,-10);
  if(substr($sFile,-5)=='.html')
    $sFile=substr($sFile,0,-5);
  if(substr($sFile,-1)=='/')
    $sFile=substr($sFile,0,-1);
  if(strlen($sFile)&&$sFile[0]=='/')
    $sFile=substr($sFile,1);

  if(!strlen($sFile)) return array(text_top_id());

  $p=explode('/',$sFile);

  $s='r0.i_id';
  $t='';
  $w='r0.i_id='.text_top_id();
  for($i=0;$i<count($p);$i++)
  {
    $c=$i+1;
    $s.=',r'.$c.".i_id";
    $t.=',TText as t'.$c.",TTextTree as r".$c;
    $w.=" and t".$c.".sFile='".addslashes($p[$i])."'
          and t".$c.".kText=r".$c.".i_id
          and r".$c.".i_left between r".$i.".i_left+1 and r".$i.".i_right
          and r".$c.".i_level=r".$i.".i_level+1";
  }
  $q="select ".$s." from TTextTree as r0".$t." where ".$w." limit 1";
  return mysql_query_single($q);
}
 

kvf77

Red Devil
to Popoff
поясни какие данные должны быть на входе.
к тому же не хватает функции text_top_id()
 

Popoff

popoff.donetsk.ua
На вход ты подаешь имя файла (строку) в виде:
/info/news/archive/
/info/news/archive
info/news/archive/
/info/news/archive/index.html
это все ссылка на один и тот же файл.

Функция text_top_id() возвращает идентификатор самого верхнего узла дерева.

Функция mysql_query_single выполняет скл-запрос и возвращает результат в виде массива полей из раздела select этого запроса. Считается, что в результате - ровно одна строка. Если в результате 0 строк, то возвращается ложь (файл не найден).

В таблице TText хранится описание вершины дерева (имя файла, содержимое и т.п.). В таблице TTextTree хранится собственно nested set.
 
Сверху