Skip to main content

Динамические деревья на РНР

Не в сети
Новенький
Зарегистрирован: 24.12.2005
Сообщения: 49
Баллы: 81
Динамические деревья на РНР

Строил ли кто нибудь динамическое дерево на РНР? Информация вытаскиваеца из mysql, там структура одной из таблиц по типу id, id_parent, levle, name ... то есть объектная база. Есть задача: построить дерево с неограниченной вложенностью. но есть одно НО. Когда очень много записей (около 100 тысяч), построение дерева затягивается на неопределенный срок. В рнр.ини таймаут можно ставить сколь угодно долгим, все равно процесс идет очень долго. Так вот, хотелось бы ветки дерева подгружать каким то способом, слабо пока представляю каким. Но таким, чтобы при нажатии допустим на "плюсик" загружалась какая то одна ветка. Т.е. первично необходимо построить только самые верхние ветки. А затем уже, подгружать каким то образом, при нажатии, другие ветки. Может быть стояла перед кем то подобная задача?

Не в сети
Гражданин
Зарегистрирован: 24.09.2005
Сообщения: 1108
Баллы: 1200
Динамические деревья на РНР

"}|{eka" пишет:

Строил ли кто нибудь динамическое дерево на РНР? Информация вытаскиваеца из mysql, там структура одной из таблиц по типу id, id_parent, levle, name ... то есть объектная база. Есть задача: построить дерево с неограниченной вложенностью. но есть одно НО. Когда очень много записей (около 100 тысяч), построение дерева затягивается на неопределенный срок. В рнр.ини таймаут можно ставить сколь угодно долгим, все равно процесс идет очень долго. Так вот, хотелось бы ветки дерева подгружать каким то способом, слабо пока представляю каким. Но таким, чтобы при нажатии допустим на "плюсик" загружалась какая то одна ветка. Т.е. первично необходимо построить только самые верхние ветки. А затем уже, подгружать каким то образом, при нажатии, другие ветки. Может быть стояла перед кем то подобная задача?

Че-то я вопрос не очень понял, но отвечу.
Я использую деревья только для построения виртуальной структуры в CMS. На выводе напоминает обычную файловую структуру. Но потребность в сотни тысяч узлов дерева как-то пока не встречал. Если у тебя какие-то проблемы с производительностью, то возможно недостаточно оптимизирована логинка, слишком много данных, слишком много запросов и т.д. Надо копать в этом направлении. Также следует обратить внимание, что MySQL мало подходит для огромного количества данных, тут лучше посмотреть в сторону Oracle. Тоже относится и к железу, ОС. Серверное железо, FreeBSD/Linux.

Вообще, деревья -- это структура, она должна быть отдельно от информации. Т.е. нельзя в одной таблице MySQL хранить и описание структуры дерева и информацию для каждого узла дерева.

Предпочитаю делать простую реализацию дерева: id->parent_id. Если надо, чтобы ветви дерева сохраняли порядок, то стоит обратить внимание на dbtree (класс PHP), он используется как раз для этого. Использование параметра level в структуре дерева облегчает построение слоев ветвей, но и добавляет некоторой лишней информации, усложняя динамичность дерева.

Не в сети
Новенький
Зарегистрирован: 24.12.2005
Сообщения: 49
Баллы: 81
Динамические деревья на РНР

"Vitaminych" пишет:

Че-то я вопрос не очень понял, но отвечу.
Я использую деревья только для построения виртуальной структуры в CMS. На выводе напоминает обычную файловую структуру. Но потребность в сотни тысяч узлов дерева как-то пока не встречал. Если у тебя какие-то проблемы с производительностью, то возможно недостаточно оптимизирована логинка, слишком много данных, слишком много запросов и т.д. Надо копать в этом направлении. Также следует обратить внимание, что MySQL мало подходит для огромного количества данных, тут лучше посмотреть в сторону Oracle. Тоже относится и к железу, ОС. Серверное железо, FreeBSD/Linux.

Вообще, деревья -- это структура, она должна быть отдельно от информации. Т.е. нельзя в одной таблице MySQL хранить и описание структуры дерева и информацию для каждого узла дерева.

Предпочитаю делать простую реализацию дерева: id->parent_id. Если надо, чтобы ветви дерева сохраняли порядок, то стоит обратить внимание на dbtree (класс PHP), он используется как раз для этого. Использование параметра level в структуре дерева облегчает построение слоев ветвей, но и добавляет некоторой лишней информации, усложняя динамичность дерева.

Поставлен в жесткие рамки, т.е. обговаривалось уже тыщу раз почему не оракл, поэтому только мускул. Сотни тысяч узлов там нет, есть сотня тысяч записей, а узлов от силы 20-30. Тоже склонен считать что тормозит именно из-за большого количества запросов из-за гадкой рекурсии. Читал где то что можно сделать выборку одним запросом и затем уже в массиве разгребать это все. Но пока с реализацией че то туговато.

Не в сети
Гражданин
Зарегистрирован: 24.09.2005
Сообщения: 1108
Баллы: 1200
Динамические деревья на РНР

"}|{eka" пишет:

Поставлен в жесткие рамки, т.е. обговаривалось уже тыщу раз почему не оракл, поэтому только мускул. Сотни тысяч узлов там нет, есть сотня тысяч записей, а узлов от силы 20-30. Тоже склонен считать что тормозит именно из-за большого количества запросов из-за гадкой рекурсии. Читал где то что можно сделать выборку одним запросом и затем уже в массиве разгребать это все. Но пока с реализацией че то туговато.

Ну есть дерево, есть тысячи документов, связанных с узлами этого дерева. Дальше что надо делать с деревом? Ты хочешь его вывести и построить, либо вывести документы из системы, согласно их структуре? Поставь задачу в общем.

Не в сети
Студент
Зарегистрирован: 14.08.2005
Сообщения: 237
Баллы: 299
Динамические деревья на РНР

"}|{eka" пишет:

Строил ли кто нибудь динамическое дерево на РНР? Информация вытаскиваеца из mysql, там структура одной из таблиц по типу id, id_parent, levle, name ... то есть объектная база. Есть задача: построить дерево с неограниченной вложенностью. но есть одно НО. Когда очень много записей (около 100 тысяч), построение дерева затягивается на неопределенный срок.

Вообще, не дело это, выбирать из базы и хранить в памяти количество записей, более чем на порядок превосходящее количество строк для отображения на странице.

Тебе нужно отобразить все 100 тысяч записей на одной странице? Тогда будет строить долго, никуда не денешься. Если в разы меньше - то думай, как оптимизировать запросы и структуры в памяти.

Не в сети
Новенький
Зарегистрирован: 24.12.2005
Сообщения: 49
Баллы: 81
Динамические деревья на РНР

"Влад" пишет:

Вообще, не дело это, выбирать из базы и хранить в памяти количество записей, более чем на порядок превосходящее количество строк для отображения на странице.

Тебе нужно отобразить все 100 тысяч записей на одной странице? Тогда будет строить долго, никуда не денешься. Если в разы меньше - то думай, как оптимизировать запросы и структуры в памяти.

В том то и дело, если строить все дерево, то строится оно очень долго, что в принципе неприемлемо, поэтому желательно выводить верхние ветки, а затем вглубь только по запросу (при нажатии на "плюсик" допустим).

"Vitaminych" пишет:

Ну есть дерево, есть тысячи документов, связанных с узлами этого дерева. Дальше что надо делать с деревом? Ты хочешь его вывести и построить, либо вывести документы из системы, согласно их структуре? Поставь задачу в общем.

Надо вывести и построить дерево

Не в сети
Студент
Зарегистрирован: 14.08.2005
Сообщения: 237
Баллы: 299
Динамические деревья на РНР

"}|{eka" пишет:

В том то и дело, если строить все дерево, то строится оно очень долго, что в принципе неприемлемо, поэтому желательно выводить верхние ветки, а затем вглубь только по запросу (при нажатии на "плюсик" допустим).

Почитай пару-тройку месяцев книжки по "чистому" программированию, не по PHP Smile

Аватар пользователя Aven
Не в сети
Гражданин
Зарегистрирован: 08.05.2007
Сообщения: 1318
Баллы: 1375
Динамические деревья на РНР

юзай "LIMIT начало,сколько"
например SELECT * FROM users LIMIT 100,10
выведет записи с 100-й по 110-ю

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".