PHP + OOП - стоит ли это того?

NeBuLuS

Guest
Вопрос:

нужно "построить" иерархическое дерево. Все хранится в базе.

Есть класс node(вершина, у которой есть массив subnodes и массив leafs), есть класс tree(массив всех nodes с состоянием "открыто", методы для отрисовки и т.д.) - все в это идеале.

Так вот....как лучше делать:
вариант (1):
хранить все nodes(классы) в классе tree, а в каждом классе node в массиве subnodes хранить не данные по этим вершинам, а лишь ID этой вершины. То же самое с leafs. В дереве в массифе leafs хранить все данные по листьям, а в каждом классе node хранить лишь ID листа.

или вариант (2):
в классе tree не хранить информацию по вершинам(nodes), а хранить лишь указатель на root(корень) дерева. В каждом классе node в массиве subnodes хранить уже данные по всем подвершинам. Так же и с листьями.

По "объему памяти" вариант 2 конечно выигрывает. Но скажем для того чтобы отрисовать дерево, построить какой-нибудь путь и т.д. будет требоваться больше времени.

Вот что знающие люди посоветуют?!

P.S.: и еще вопрос на засыпку. Как лучше эти данные считать из базы:
1) select * from nodes (все скопом).
Больше к базе не обращаемся, поэтому можем "построить" дерево.

2) select id, parent_id from nodes(обзовем подобием "матрицей инциденций").
После того как построим дерево нужно еще будет обратиться и считать все оставшие данные по вершинам и занести эту информацию для каждой вершины.

3) или же сперва найти корень, потом считать данные для всех его подвершин, потом считать данные для всех подвершин каждой его подвершины и т.д.
Куча обращений. Сколько вершин столько и обращений.

Рассматривать хотелось бы все же случай не с 10 записями, а скажем с 1000 или даже более. В общем чтобы объем был ощутимым вполне.

Думаю 3 вариант будет самый тормознутый, поэтому его как бы выкидываем наверное сразу. Так вот вопрос еще вот какой....лучше считывать данные сразу все или же в два прохода(но тогда и два прохода для tree - потом же надо будет записать "оставшуюся" инвормацию для кадой вершины).
 

NeBuLuS

Guest
да...и еще вот что. У каждой вершины есть состояние: открыта/закрыта.

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

Так вот как бы еще запросик к базе хитрый замутить.
Можно было бы конечно черех "IN" попытаться, но скажем если будет 10000 открытых вершин, то это будет уже не очень хороший запрос.
SELECT * from nodes WHERE ID IN (1,2,3,4,5,11,245,34234,2100031,......) бред полнейшие. Т.е. получается что придется все же считывать по одной вершине(если она открыта), т.е. сколько открытых вершин, столько и запросов :(((

Есть идеи как все это соптимизировать?!
 

nail

Guest
По последнему вопросу: а почему бы свойство "открытости" не сохранять в базе ?

Если хочешь сильно соптимизировать скорость чтения дерева из базы, то найди в интернете статью "Деревья в SQL" - там предлагается эффективная модель.
 

pachanga

Новичок
Я решал подобную проблему, но только через рекурсивные SELECT, т.е. по варианту 3.
Поэтому тоже хотел бы услышать от людей, как можно было бы сделать правильнее, хотя работало и работает относительно быстро, тем более можно все эффективно кэшить.

Таблица(в общем варианте, хотя реально там еще полей 5, но они к реализации дерева не относятся) у меня следующего вида:
tree{id, parent}, корень дерева parent=-1

Статью читал, идеи очень хорошие, но пока до реализации руки не дошли.

Состояние открытости держал в cookie, и это гораздо правильнее, чем в самой базе: пользователь-то не один.

Э..э..тут какой-то offtop пошел, давайте новый thread! :) Эта проблема меня тоже гложет!
 

pachanga

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

[VS]

Guest
если утверждаешь что это открытая инфоция, то я назад верну.
 

NeBuLuS

Guest
дык я ведь спрашивал не только про SQL! Сперва я спрашивал про классы!!! Что выгодней:
1) в дереве держать массив со всеми вершинами(данные!!!!!)
, а кажоей вершине хранить массивы подвершин и листьев(ИНДЕКСЫ!!!!!! не данные)

2) или же в каждой вершине хранить массивы подвершин и листьев(ДАННЫЕ!!!!!!!!), в дереве ничего не хранить кроме корня(ну и пару дополнительных методов)!

Что выгодней?! В варианте 2 выгода по-памяти, но всякие пути строить - легче повеситься(обход дерева нужно будет делать). В варианте 1 тратится больше памяти, но зато легче работать с "матрицей инциденций", в общем легче с деревом работать.
 

Georgy

Guest
На самом деле тема передвинулась на "деревья", а мне интересно "что же лучше?".

Вопрос этот вертится уже недели две, так как есть сайт, написаный на ОО php с mysql и произодительность его очень низка, а переносимость достаточно сложна. Сейчас я уже начинаю думать, что процедурная реализация работала бы на много быстрее.

Меня интересует повышение эффективности ПО и Оптимизация работы оного, то бишь: Есть ли общепризнаные и опробованные средства оптимизации работы ОО ПО, котрое работает в связке с БД?

имхо может у меня руки кривые?:) .. дайте кто-нить линейку - померить...
 

[VS]

Guest
Если производительность именно "очень низкая" - значит очень плохо ОО модель писали.

Ответ на твой вопрос - зависит от задачи. Как именно ты используешь ООP для работы с DB?

Если для обертки mysql_... функций в DB::... функции - то как я уже много раз писал, в этом кроме потери времени ничего нет,
и к OOP это никак не относится. Использовать классы, это еще не значит использовать ООP.
 

pachanga

Новичок
Автор оригинала: Georgy
На самом деле тема передвинулась на "деревья", а мне интересно "что же лучше?".

Вопрос этот вертится уже недели две, так как есть сайт, написаный на ОО php с mysql и произодительность его очень низка, а переносимость достаточно сложна. Сейчас я уже начинаю думать, что процедурная реализация работала бы на много быстрее.

Меня интересует повышение эффективности ПО и Оптимизация работы оного, то бишь: Есть ли общепризнаные и опробованные средства оптимизации работы ОО ПО, котрое работает в связке с БД?

имхо может у меня руки кривые?:) .. дайте кто-нить линейку - померить...
Ради спортивного интереса сделай схожие процедуры и проведи замеры, очень интересно глянуть. Очень может быть, что не в OOP дело
 

pachanga

Новичок
Автор оригинала: [VS]

ставить альфу на сервер - ответ на сабж?
брр
Нет, ни в коем случае!
Это вообще, мол, если бы Zend был против ООП, то вряд ли в ZE2 были такие ООП нововведения!
 

Georgy

Guest
Автор оригинала: pacha

Ради спортивного интереса сделай схожие процедуры и проведи замеры, очень интересно глянуть. Очень может быть, что не в OOP дело
Я переписал сервер под процедуры - производительность повысилась, но не на много:((( всего лишь где-то на 5-10%
 
Сверху