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

pavlodaranet

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

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

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

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

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

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

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

вот такой вывод делается просто одним 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
 
еще стоит условие по LEVEL добавить. Что бы ты не проваливатся ниже.

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

<?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 а вот дальше уже получается я могу делать адрес страницы с айдишником. Получается здесь нужны новые поля таблицы или как можно мыслить?
 
нужны новые поля таблицы
Зачем тебе 2 таблицы, если в них хранятся дублирующие данные, да еще и во второй нет первичного ключа?
Объедини в одну. Потом можно будет одним запросом строить твои breadcumbs.

-~{}~ 05.12.08 17:48:

LEVEL нужен тебе.
 
Я использую Nested Sets. А URL страницы храню в базе данных. То есть у меня есть в таблице поле URL в котором и храню адрес страницы вида /comany/about/
Поэтому вывод дерева происходит одним запросом и не приходится при выводе кофигурировать адрес страницы.
 
если уровень вложенности ограничен + ожидается прирост посещаемости - если смысл сделать несколько таблиц, по уровням, либо отметить уровни прямо в таблице. NS тебе в данном случае не помощник, только как временное решение, до большой запарки.
 
если уровень вложенности ограничен + ожидается прирост посещаемости - если смысл сделать несколько таблиц, по уровням, либо отметить уровни прямо в таблице. NS тебе в данном случае не помощник, только как временное решение, до большой запарки.
Может мосье нам поведает, почему nested sets хуже справляются с высокой посещаемостью "каталога фирм", чем adjacensy lists? :) А то выглядит так, будто мосье не понимает, о чем говорит, и просто пукает в воздух.

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