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 - потом же надо будет записать "оставшуюся" инвормацию для кадой вершины).
нужно "построить" иерархическое дерево. Все хранится в базе.
Есть класс 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 - потом же надо будет записать "оставшуюся" инвормацию для кадой вершины).