Дерево каталогов

pavlodaranet

Новичок
Дерево каталогов

Модеры, не прикрывайте сразу тему, не могу допереть.

Боюсь быть сразу посланным в FAQ и тп места :) , но все-таки рискну спросить.
В общем хочу сделать каталог фирм и чтобы выводился путь страницы (ссылки), к примеру:

Главная -> Каталог -> Авто -> Запчасти

Отталкиваться от дерева и рекурсии ? Или есть еще способы?
Каковы должны быть обязательными поля в БД?
 

phprus

Moderator
Команда форума
pavlodaranet
Отталкиваться от дерева и рекурсии ?
Отталкиваться надо от дерева, так как зная в каком узле мы находимся всегда можно определить путь от этого узла до корня и в случае дерева этот путь будет однозначным. Рекурсия - один из вариантов решения задачи, но это не единственный вариант.

Каковы должны быть обязательными поля в БД?
А вот это зависит от способа хранения дерева в БД. Вот тут уже можно и в FAQ или Google послать ;)
 

Zetruger

ivan.chistyakov.name
я не знаю как называются разные способы хранения дерева
но там где есть вторая таблица, которая хранит список всех родителей и родителей родителей вплоть до верхушки для каждого элемента

Главная -> Каталог -> Авто -> Запчасти

вот такой вывод делается просто одним SQL запросом


что то типа

таблица элементов
ID, PID, NAME
1 0 Главная
2 1 Каталог
3 2 Авто
4 3 Запчасти

таблица родителей элементов (заполняется рекурсивно, каждый раз при изменение структуры дерева)
ID, PID, LEVEL
2 1 1
3 1 1
3 2 2
4 1 1
4 2 2
4 3 3

select PID from where ID=4 order by LEVEL
 

флоппик

promotor fidei
Команда форума
Партнер клуба
еще стоит условие по LEVEL добавить. Что бы ты не проваливатся ниже.

это, кстати, похоже не извращенную форму Nested sets. Структуру БД менять тебе можно, или нет?
 

pavlodaranet

Новичок
В общем дошел до такого:

<?php
include ("blocks/bd.php"); //Соединяемся с базой

function get_path($select_string)
{
GLOBAL $path;
$db_s = mysql_query($select_string);
while($s = mysql_fetch_assoc($db_s))
{
/* print_r($s); */
$path[] = $s['Title'];
get_path("SELECT * FROM catalogs WHERE id='$s[ParentID]'");
}
}

$ID=2;
$path = array(); //обнулили
get_path("SELECT * from catalogs WHERE id = '$ID'"); // стартанули от текушего положения
$path = array_reverse($path);//возвращает эл-т массива развернутого в обратном порядке
print_r($path); // смотрим что получилось

Теперь надо как то привязать ссылки к значениям.

БД содержит 3 поля:

ID
ParentID
Title

Можно менять и добавлять поля :)

Но получается к примеру Главная - index.php Каталог - /katalog а вот дальше уже получается я могу делать адрес страницы с айдишником. Получается здесь нужны новые поля таблицы или как можно мыслить?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
нужны новые поля таблицы
Зачем тебе 2 таблицы, если в них хранятся дублирующие данные, да еще и во второй нет первичного ключа?
Объедини в одну. Потом можно будет одним запросом строить твои breadcumbs.

-~{}~ 05.12.08 17:48:

LEVEL нужен тебе.
 

Jenius

Новичок
Я использую Nested Sets. А URL страницы храню в базе данных. То есть у меня есть в таблице поле URL в котором и храню адрес страницы вида /comany/about/
Поэтому вывод дерева происходит одним запросом и не приходится при выводе кофигурировать адрес страницы.
 

no_santa

Снегур
если уровень вложенности ограничен + ожидается прирост посещаемости - если смысл сделать несколько таблиц, по уровням, либо отметить уровни прямо в таблице. NS тебе в данном случае не помощник, только как временное решение, до большой запарки.
 

Wicked

Новичок
если уровень вложенности ограничен + ожидается прирост посещаемости - если смысл сделать несколько таблиц, по уровням, либо отметить уровни прямо в таблице. NS тебе в данном случае не помощник, только как временное решение, до большой запарки.
Может мосье нам поведает, почему nested sets хуже справляются с высокой посещаемостью "каталога фирм", чем adjacensy lists? :) А то выглядит так, будто мосье не понимает, о чем говорит, и просто пукает в воздух.

По мне так как раз NS позволяют выбрать путь до вершины за _один_ _простой_ запрос.
 
Сверху