Автор Тема: Как сделать дерево?  (Прочитано 6442 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как сделать дерево?
« : 12 Июля 2005, 14:29:17 »
Раздел 1
_Раздел 1.1
__Раздел 1.1.2
__Раздел 1.1.3
___Раздел 1.1.3.1

сабж. такого типа, неограниченной вложености?

Оффлайн sarutobi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 61
  • +0/-0
  • 0
    • Просмотр профиля
Как сделать дерево?
« Ответ #1 : 12 Июля 2005, 14:56:54 »
Алексей
ЭЭЭ.... хранить? отобразить? что подразумевается по "сделать дерево?"

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как сделать дерево?
« Ответ #2 : 12 Июля 2005, 16:18:10 »
sarutobi
создать структуру, таблицы в БД + соответствующее ПО к ней.
меня интересует, как обычно хранят ссылки на предков.

Оффлайн Syrinx

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 21
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как сделать дерево?
« Ответ #3 : 12 Июля 2005, 16:33:29 »
в бд можешь сделать дополнительное поле с id предка и хранить все дерево в виде таблицы. В хэше можно по-разному - в виде вложенного массива, например.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Как сделать дерево?
« Ответ #4 : 12 Июля 2005, 17:36:24 »
структура таблиц зависит от используемой СУБД.
Я конечно догадываюсь какая у тебя СУБД, но чтобы ты не расслаблялся и приучался формулировать свои вопросы не буду угадывать.

К тому же структура зависит от того какие действия тебе надо будет производить с деревом и отдельными его узлами.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Как сделать дерево?
« Ответ #5 : 12 Июля 2005, 19:42:24 »
Алексей
1) Читаем Макса. Проникаемся.
2) Ищем по форуму.
3)
Цитировать
Алексей:
как обычно хранят ссылки на предков

А как хранят ссылки не на предков?
LJ: Backslashed life (rss)

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как сделать дерево?
« Ответ #6 : 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:23:22 от Алексей »

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Как сделать дерево?
« Ответ #7 : 13 Июля 2005, 19:52:17 »
Цитировать
Алексей:
не думал, что субд тут играет определяющую роль..
некоторые субд имеют функциональность для работы с деревьями (например Oracle)

Я предпочитю Nested Sets. Но сортировку там нужно ручками делать.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как сделать дерево?
« Ответ #8 : 13 Июля 2005, 21:02:49 »
слабо представляю, что есть Nested Sets....

а что с моим вариантом?

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Как сделать дерево?
« Ответ #9 : 14 Июля 2005, 02:00:32 »
Алексей
Хороший вариант. Неудачный для больших объемов данных. Но вполне работоспособный.
Да, для каждого элемента потребуется поле sort.

Поздравляю, ты изобрел велосипед.
В след. раз воспользуйся поисковыми системами.
LJ: Backslashed life (rss)

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Как сделать дерево?
« Ответ #10 : 14 Июля 2005, 10:35:26 »
CGVictor
Почему неудачный?
Про поле sort можно поподробнее?
Почему велосипед?

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Как сделать дерево?
« Ответ #11 : 14 Июля 2005, 11:35:05 »
Алексей
Цитировать
Алексей:
Почему неудачный?

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

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

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

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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28