Forum Webscript.Ru
Программирование => PHP => Тема начата: Алексей от 12 Июля 2005, 14:29:17
-
Раздел 1
_Раздел 1.1
__Раздел 1.1.2
__Раздел 1.1.3
___Раздел 1.1.3.1
сабж. такого типа, неограниченной вложености?
-
Алексей
ЭЭЭ.... хранить? отобразить? что подразумевается по "сделать дерево?"
-
sarutobi
создать структуру, таблицы в БД + соответствующее ПО к ней.
меня интересует, как обычно хранят ссылки на предков.
-
в бд можешь сделать дополнительное поле с id предка и хранить все дерево в виде таблицы. В хэше можно по-разному - в виде вложенного массива, например.
-
структура таблиц зависит от используемой СУБД.
Я конечно догадываюсь какая у тебя СУБД, но чтобы ты не расслаблялся и приучался формулировать свои вопросы не буду угадывать.
К тому же структура зависит от того какие действия тебе надо будет производить с деревом и отдельными его узлами.
-
Алексей
1) Читаем Макса. Проникаемся.
2) Ищем по форуму.
3)
Алексей:
как обычно хранят ссылки на предков
А как хранят ссылки не на предков?
-
Макс
не думал, что субд тут играет определяющую роль.. 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. Так я на ленте новостей делал...
Как вам такие идеи?
-
Алексей:
не думал, что субд тут играет определяющую роль..
некоторые субд имеют функциональность для работы с деревьями (например Oracle)
Я предпочитю Nested Sets. Но сортировку там нужно ручками делать.
-
слабо представляю, что есть Nested Sets....
а что с моим вариантом?
-
Алексей
Хороший вариант. Неудачный для больших объемов данных. Но вполне работоспособный.
Да, для каждого элемента потребуется поле sort.
Поздравляю, ты изобрел велосипед.
В след. раз воспользуйся поисковыми системами.
-
CGVictor
Почему неудачный?
Про поле sort можно поподробнее?
Почему велосипед?
-
Алексей
Алексей:
Почему неудачный?
К примеру: 5000 элементов. Представь ситуацию, когда у тебя 6 уровней "вниз" и тебе нужно выбрать только элементы определенного 6 уровня с флажком "включен".
Алексей:
Про поле sort можно поподробнее?
Каждый элемент содержит индекс сортировки. У меня обычно просто int.
Алексей:
Почему велосипед?
Потому что слишком просто. Refer to литература по программированию - деревьем существует масса, это самое простое и (наверно) самое старое.