Навигация по каталогу в БД

predator

web designer
Навигация по каталогу в БД

Надо выводить навигацию по разделам в виде сл. дерева ссылок:
родитель1
-родитель1
-родитель2
--лист1
--лист2
-родитель3
-родитель4
родитель2
родитель3
родитель4
Листья и родители этого дерева - статьи не более 64Кб (в поле типа TEXT)

Это как я понял надо(и удобнее всего) реализовать через рекурсию. Исходя из этого появляются вопросы:
1. Листья и Дерево делать в одной таблице или для каждого уровня вложености по таблице?
2. Желательно что-бы каждая строка навигации являла собой ссылку на данный раздел (родители это тоже разделы но более общего характера чам листья). Это видимо реализуется передачей через $_GET['...'] информации в условие WHERE?
3. На каждую ссылку будет выводится полноценная статья (в том числе и на родитель)

[ЦВЕТОМ=red]Опережая шквал ссылок[/ЦВЕТОМ] :D на доки хочу сообщить:
1. По форуму уже прошёлся
2. Статью - Деревья в SQL прочитал но там очень много неизвесных терминов. Смысл уловил но до конкретики не дошёл
3. Joe Celko. Trees in SQL не читал [хватило перевода :rolleyes: ]
4. Посмотрел пример phpDatabase 2.1 от Maxim Poltarak <[email protected]> Понял ещё меньше т.к. запрос составляется в процессе работы скрипта.

Помогите разобратся, пожалуйста!! :cool:

ЗЫ:
Число уровней вложенности заранее извесно. Пока думаю около четырёх уровней. Ещё хорошо-бы структуру базы сделать как можно более оптимизированной для поиска
 

ForJest

- свежая кровь
Смотри простой способ - хранить полный путь от родителя корня к листу в каждой записи.
Напимер tree = "1 2 5 10", где числа - это id родителей.
Поддерево выбираешь с помощью
Where tree like '$tree%'.
Explode - получаешь путь.
Не забываем в $tree писать пробел "1 2 5 " чтоб исключить ситуацию "1 2 554".
 

predator

web designer
Ясно. Тогда новые вопросы есть:
1. А если мне надо не конкретный лист $tree = "1 2 5 10 ", а список разделов 3-его уровня то надо искать с переменной $tree = "1 2 5 "?
2. Как я понимаю столбец с путём - это переменный столбец типа VARCHAR?
3. А зачем Explode? Для генерации переменных в url? И какого вида они интересно будут - типа таких ...?peremennaya=1|2|5...
 

ForJest

- свежая кровь
Не - понимаешь конкретный лист ты всегда можешь получить по ID.
$tree нужен только чтоб выбрать все низлежащие уровни ветки.
а Explode для хлебных крошек удобно
т.е. ссылок типа
Корень > Дедушка > Папа> Листик
(PHPClub > Основные форумы > PHP & Mysql > Навигация по каталогу в БД)
Передавать достаточно ID ветки - ты всегда можешь получить $tree этой ветки и добавить пробел для поиска.
 

predator

web designer
1. Что ты подразумеваешь под "ID ветки"?
2. Добавка пробела выдаст мне список низлежащих рубрик/листьев ?
Ну вроде что-то начинает вырисовыватся :)
 

ForJest

- свежая кровь
Catalog
(id int not null,
id_parent not null, #не знаю зачем, но вдруг пригодится? %))
tree varchar(200),
info TEXT
)
Ну называю я primary key обычно id, понимаешь.
id ветки - это id записи нужного уровня.
 

predator

web designer
ага...
это при каждой новой генерации странички надо лезть в базу по ID и хватать TREE? [Если это не листик ?:*)]

Автор оригинала: ForJest
Ну называю я primary key обычно id, понимаешь.
хмм, да и я тож :D
 

ForJest

- свежая кровь
Не знаю. Я тебе просто высказал общие идеи хранения дерева в простой СУБД типа MySQL. Короче это главное с чем можно затупить если вдумываться. Остальное - обвязка.
А листик отличается от узла только тем что у него нет подчиненных записей.
 

rembo

Новичок
А почему не достаточно в данном случае такой конструкции?
1. ID int primary key - самой ветки
2. PARENT - int родительской ветки
3. Текст статьи
....
И все а потом сколько хочешь и как хочешь гуляй по этому дереву используя самую обыкновенную рекурсию.
 

ForJest

- свежая кровь
rembo ну не знаю что тебе ответить. Может быть достаточно. Но выполнять кучу запросов для обхода дерева, по-моему не фишка.
Или что ты имеешь ввиду данным случаем? Что записей будет <100 И вложенность небольшая?
 

Mikkka

Guest
деревом релизованном с помощью id - parent_id на мой взгляд проще управлять, хотя оно и более тормозное.
 

predator

web designer
Автор оригинала: ForJest
Не - понимаешь конкретный лист ты всегда можешь получить по ID.
$tree нужен только чтоб выбрать все низлежащие уровни ветки.
стооп. тут до меня дошло... ведь с помощью Where tree like '$tree%' выбирается действительно _все_ низлежвщие уровни, а мне нужно выбрать только те которые ниже (того чей id получили из $_GET[]) на _один_ уровень. Это нужно для генерации навигации (представьте себе DHTML-меню или дерево папок в Explorer'e где развёрнута только одна ветвь причём не полностью).

Может кто-нить на пальцах Nested Sets объяснит?
Это я уже читал Как мне проще организовать базу
 

rembo

Новичок
В принципе если дело в производительности можно вытянуть все дерево в виде ID, PARENT в массив или в тоже самое дерево и работать уже с ним а потом уже когда дело доходит до статьи вытягивать ее из базы отдельно. В идеальном случае два-три селекта.
 
Сверху