деревовидные связи

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

деревовидные связи

Непрочитанное сообщение ProFTP » 2009-02-05 0:16:37

постараюсь обяснить понятно!

есть сейчас:

Код: Выделить всё

раздел
  -- под раздел
     -- под-под раздел
нужно чтобы это было построенно программно сколько угодно подразделов!

Код: Выделить всё

раздел
  -- под раздел
     -- под-под раздел
         -- под-под-под раздел
            -- под-под-под-под раздел
как составить таблицы и как разделы эти вывести вывести из таблиц?

это не это http://gsbelarus.com/gs/modules.php?nam ... le&sid=314 ?


UPD:


вот нашел еще
http://www.realcoding.net/article/view/2771
http://www.opennet.ru/base/dev/mysql_tree.txt.html
http://www.phpclub.ru/detail/article/2002-06-03
http://www.google.com.ua/search?hl=uk&q ... 0%BA&meta=

геморойно там как-то смотрится
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-02-05 2:04:38

нашел такую штутк, думаю подойдет

http://search.cpan.org/~bjeps/DBIx-Tree-1.9/Tree.pm
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Volodymyr
лейтенант
Сообщения: 614
Зарегистрирован: 2008-06-17 16:04:56
Откуда: Ukraine, Lviv
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение Volodymyr » 2009-02-05 12:39:42

А причем тут MySQL? Задача по программированию.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-02-05 13:11:42

мускул тоже может, это делается вроде на внешних ключах, но они есть только в innoDB. Правда не рекомендуюется использовать внешние ключи поскольку сильно мускул грузят

Аватара пользователя
Volodymyr
лейтенант
Сообщения: 614
Зарегистрирован: 2008-06-17 16:04:56
Откуда: Ukraine, Lviv
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение Volodymyr » 2009-02-05 14:53:00

zg писал(а):но они есть только в innoDB. Правда не рекомендуюется использовать внешние ключи поскольку сильно мускул грузят
Дерево не задача SQL в таком случае тем более. MySQL тут для хранения данных.

P.S. http://phpclub.ru/detail/article/db_tree

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-02-05 15:41:48

Volodymyr писал(а):Дерево не задача SQL
где-то видел реализацию... надо ман покапать

Аватара пользователя
Volodymyr
лейтенант
Сообщения: 614
Зарегистрирован: 2008-06-17 16:04:56
Откуда: Ukraine, Lviv
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение Volodymyr » 2009-02-05 16:15:35

zg писал(а):
Volodymyr писал(а):Дерево не задача SQL
где-то видел реализацию... надо ман покапать
Если найдешь, поделись, тема интересная.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-03 13:44:17

Volodymyr писал(а):
zg писал(а):
Volodymyr писал(а):Дерево не задача SQL
где-то видел реализацию... надо ман покапать
Если найдешь, поделись, тема интересная.
ну вот есть только не для муси, а для Firebird, Yaffil, Borland, Interbase. http://gsbelarus.com/gs/modules.php?nam ... le&sid=314


а как управлять с помошью HTML форм этим деревом? если я захожу переметсить какой-то раздел, т окак это сделать красиво, может с JS как-то?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-03 14:35:11

ProFTP писал(а): может с JS как-то?
нет ничего невозможного :smile:

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-03 14:38:36

а как упралвять?

просто родителей вынести и под родителей?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-03 14:42:35

ProFTP писал(а):а как упралвять?
просто родителей вынести и под родителей?
дак попробуй :smile: руки ведь не отвалятся, чего зазря слова разговаривать.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-03 14:47:09

та прост окажется что оно глупо будет выглядеть

почему этот форум не деревовидный?

если бы посмотреть на прогармму деревовидную, или кто как делал?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-03 15:01:36

ProFTP писал(а):если бы посмотреть на прогармму деревовидную, или кто как делал?
я делал, выглядит классно и вполне себе ничего работает

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-03 15:11:21

а если я хочу раздел поставить в другую ветку, то мне надо всех родиетелей вывести?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-03 15:27:17

ProFTP писал(а):а если я хочу раздел поставить в другую ветку, то мне надо всех родиетелей вывести?
начни делать и в процессе поймёшь как и чего. Все по разному мыслят, может так оказаться, что иерархические списки тебе и не понадобятся.

MAK
ст. сержант
Сообщения: 344
Зарегистрирован: 2008-09-17 2:23:21

Re: деревовидные связи

Непрочитанное сообщение MAK » 2009-04-03 18:53:36

Есть стандартный метод хранения дерева, где каждый элемент хранит id родителя. Для отрисовки такого дерева нужна рекурсия(то-есть по одному запросу в базу для каждой ветки).
Но в бытность я нашел еще один метод хранения - тут для всех действий(выбор пути, выбор ветки, добавление/удаление элемента) необходим только один запрос.
Как хорошо вставлять ссылки в код. )) Могу дать код.
http://www.sitepoint.com/print/1105/
Вот тут кстати и сравнивается первый метод и второй.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-03 19:16:34

MAK писал(а):Но в бытность я нашел еще один метод хранения - тут для всех действий(выбор пути, выбор ветки, добавление/удаление элемента) необходим только один запрос.
для удаления добавления два, но особенно понравилось

Код: Выделить всё

   while ($row = mysql_fetch_array($result)) { 
       // recursive execution of this function for each 
       // child of this node 
       // $right is the current right value, which is 
       // incremented by the rebuild_tree function 
       $right = rebuild_tree($row['title'], $right); 
   }
способ интересный, правда, проверить целостность такой таблицы весьма сложно.

MAK
ст. сержант
Сообщения: 344
Зарегистрирован: 2008-09-17 2:23:21

Re: деревовидные связи

Непрочитанное сообщение MAK » 2009-04-03 21:05:00

zg писал(а):для удаления добавления два
Да, ошибся. ) Давно это было. А сейчас даже не удосужился пролистать статью, вспомнить.
Последний раз работал с ним 2 года назад.
Если быть точным, то этот способ позволяет двумя запросами(в обоих случаях первый - получить левый и правый индексы) отрисовать дерево и путь.
А вот для модификации его, нужно сделать больше телодвижений.
То-есть он применим там, где это дерево чаще будет показываться, чем модифицироваться.
zg писал(а):но особенно понравилось
А rebuild_tree() - это ж только для переколбашивания дерева из первой схемы во вторую.

Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

Re: деревовидные связи

Непрочитанное сообщение Gloft » 2009-04-15 15:03:25

все давно придумано
http://www.getinfo.ru/article610.html

к NESTED SETS есть php библиотека если нет времини или самому писать влом

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-15 15:18:22

Gloft писал(а):все давно придумано
так кто спорит то, новых идей нет и никогда не было, всё решает реализация.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-30 0:58:30

подскажите как вывести всех родителей какого-то id?

в принципе можно рекурсию сделать, но запросов может быть штук 10 (написано что это не совсем правильно)


как тут сделать JEFT JOIN и if else ?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-30 4:54:41

ProFTP писал(а):подскажите как вывести всех родителей какого-то id?
смотря как у тебя реализовано хранение.
ProFTP писал(а):как тут сделать JEFT JOIN и if else ?
тут, это где?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-30 5:39:29

через parrent_id, связывается с id, то есть parrent_id получается родитель
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: деревовидные связи

Непрочитанное сообщение ProFTP » 2009-04-30 6:02:19

в крайнем случае можно, через ORM пройтись, сделать рекурсию, запросов возможно будет штук 20, но при обрабоке этих объектных запросов, ORM сделает 2-3 запроса SQL
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: деревовидные связи

Непрочитанное сообщение zg » 2009-04-30 13:10:18

ProFTP писал(а): запросов возможно будет штук 20
это много
ProFTP писал(а):через parrent_id, связывается с id, то есть parrent_id получается родитель
только рекурсивно или тупо выбрать все записи и построить из них дерево