Forum Webscript.Ru

Программирование => PHP => Тема начата: Алексей от 12 Июля 2005, 14:29:17

Название: Как сделать дерево?
Отправлено: Алексей от 12 Июля 2005, 14:29:17
Раздел 1
_Раздел 1.1
__Раздел 1.1.2
__Раздел 1.1.3
___Раздел 1.1.3.1

сабж. такого типа, неограниченной вложености?
Название: Как сделать дерево?
Отправлено: sarutobi от 12 Июля 2005, 14:56:54
Алексей
ЭЭЭ.... хранить? отобразить? что подразумевается по "сделать дерево?"
Название: Как сделать дерево?
Отправлено: Алексей от 12 Июля 2005, 16:18:10
sarutobi
создать структуру, таблицы в БД + соответствующее ПО к ней.
меня интересует, как обычно хранят ссылки на предков.
Название: Как сделать дерево?
Отправлено: Syrinx от 12 Июля 2005, 16:33:29
в бд можешь сделать дополнительное поле с id предка и хранить все дерево в виде таблицы. В хэше можно по-разному - в виде вложенного массива, например.
Название: Как сделать дерево?
Отправлено: Макс от 12 Июля 2005, 17:36:24
структура таблиц зависит от используемой СУБД.
Я конечно догадываюсь какая у тебя СУБД, но чтобы ты не расслаблялся и приучался формулировать свои вопросы не буду угадывать.

К тому же структура зависит от того какие действия тебе надо будет производить с деревом и отдельными его узлами.
Название: Как сделать дерево?
Отправлено: CGVictor от 12 Июля 2005, 19:42:24
Алексей
1) Читаем Макса. Проникаемся.
2) Ищем по форуму.
3)
Цитировать
Алексей:
как обычно хранят ссылки на предков

А как хранят ссылки не на предков?
Название: Как сделать дерево?
Отправлено: Алексей от 13 Июля 2005, 19:13:16
Макс
не думал, что субд тут играет определяющую роль.. MySql, как у всех.

Цитировать
К тому же структура зависит от того какие действия тебе надо будет производить с деревом и отдельными его узлами.
да просто выводить... сделать меню разделов.. ничего такого особенного.


Теоретически, я частично понимаю, как это делается всё - храним ид предка и всего то. Но как это реализовать...

Цитировать
Раздел 1
_Раздел 1.1
__Раздел 1.1.2
__Раздел 1.1.3
___Раздел 1.1.3.1


очевидно надо хранить ид родителей. как например хранить ид родителя 1.1.3.1? (вернее, как получать его??)
В виде строки? Потом парсить эту строку? Я видел такое у коллеги - он смs сделал, там ид родителей в ввиде строк хранились и именно в форме "число-точка-число-точка"...


После немногочисленых раздумий, я надумал такое:

id - auto increment, первичный ключ

Раздел 1 создаём: id=1, parent_id=0
Раздел 2 создаём: id=2, parent_id=0
Раздел 2.1 создаём: id=3, parent_id=2
Раздел 2.2 создаём: id=4, parent_id=2
Раздел 2.2.1 создаём: id=5, parent_id=4
Раздел 2.2.1.1 создаём: id=6, parent_id=5

вот так, как думаете, правильно будет? теперь я могу добавить к любой ветке любой раздел, могу удалить любой раздел... НО! Необходимо учесть, что нужно будет програмно управлять положением разделов в визуальном представлении страницы. Т.е. имея 2 подраздела с одинаковым родителем, но разными id

Цитировать
Раздел 2.1: id=3, parent_id=2
Раздел 2.2: id=4, parent_id=2


нужно будет поднять раздел 2.2 наверх, фактически сделать его разделом 2.1. Как тогда быть?

Тогда есть идея сделать дополнительное поле скажем с timestamp и разделу, который нужно будет "поднять", просто в поле обновить timestamp и отсортировать в порядке убывания по полю timestamp. Так я на ленте новостей делал...

Как вам такие идеи?
Название: Как сделать дерево?
Отправлено: Макс от 13 Июля 2005, 19:52:17
Цитировать
Алексей:
не думал, что субд тут играет определяющую роль..
некоторые субд имеют функциональность для работы с деревьями (например Oracle)

Я предпочитю Nested Sets. Но сортировку там нужно ручками делать.
Название: Как сделать дерево?
Отправлено: Алексей от 13 Июля 2005, 21:02:49
слабо представляю, что есть Nested Sets....

а что с моим вариантом?
Название: Как сделать дерево?
Отправлено: CGVictor от 14 Июля 2005, 02:00:32
Алексей
Хороший вариант. Неудачный для больших объемов данных. Но вполне работоспособный.
Да, для каждого элемента потребуется поле sort.

Поздравляю, ты изобрел велосипед.
В след. раз воспользуйся поисковыми системами.
Название: Как сделать дерево?
Отправлено: Алексей от 14 Июля 2005, 10:35:26
CGVictor
Почему неудачный?
Про поле sort можно поподробнее?
Почему велосипед?
Название: Как сделать дерево?
Отправлено: CGVictor от 14 Июля 2005, 11:35:05
Алексей
Цитировать
Алексей:
Почему неудачный?

К примеру: 5000 элементов. Представь ситуацию, когда у тебя 6 уровней "вниз" и тебе нужно выбрать только элементы определенного 6 уровня с флажком "включен".

Цитировать
Алексей:
Про поле sort можно поподробнее?

Каждый элемент содержит индекс сортировки. У меня обычно просто int.

Цитировать
Алексей:
Почему велосипед?

Потому что слишком просто. Refer to литература по программированию - деревьем существует масса, это самое простое и (наверно) самое старое.