Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деревья Nested Sets, В одной таблице - хранить много деревьев 
:(
    Опции темы
AntonioBanderaz
Дата 21.9.2005, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Цитата(Wowa @ 20.9.2005, 23:45)
Adjacency List - и есть именно простейший метод хранения деревьях, который ПЕРВЫМ описан в статье, ссылку на которую я привел выше.
Всё ясно. Только обход долгий.

Цитата(Wowa @ 20.9.2005, 23:45)
Как это не связаны? По рисунку, который я выше прикрепил - видно, что если я в первой ветке выходящей с корня что-то изменю(например, добавлю еще один уровень), то во второй и третьей ветках выходящих с корня - должны быть пересчитаны left key и right key.
Дык это я тебе и писал... Я имею ввиду не связаны на прямую, т.е если какое дерево просто убрать, то остальные не "поломаются" smile
Ты боишься если какая ошибка может произойти, так можно при изменениях использовать трансакции, или тоже не подходит?


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Wowa
Дата 21.9.2005, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(AntonioBanderaz @ 20.9.2005, 23:02)
Ты боишься если какая ошибка может произойти, так можно при изменениях использовать трансакции, или тоже не подходит?

Можно... но для такой просто операции использовать трансакции - как-то странно. Итак должно чики-пики работать smile


Цитата(AntonioBanderaz @ 20.9.2005, 23:02)
Я имею ввиду не связаны на прямую, т.е если какое дерево просто убрать, то остальные не "поломаются"

Представь. 10 000 юзеров. У каждого в базе хранится по дереву с несколькими ветками. Какой-то юзер с первой ветки решает добавить себе подветку, теперь должны перестраиваться параметры веток у всех других юзеров.
Добавлено @ 00:08
Цитата(AntonioBanderaz @ 20.9.2005, 23:02)
Всё ясно. Только обход долгий.

Да, долгий вероятно. Зависит от ситуации. Но если уровней вложенности мало и веток немного, то спокойно можно даже всё дерево выбрать и быстренько в памяти выстроить нить из родителей. Ну или же рекурсией выбирать через запросы к базе..
PM WWW   Вверх
AntonioBanderaz
Дата 21.9.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Цитата(Wowa @ 21.9.2005, 00:06)
Представь. 10 000 юзеров. У каждого в базе хранится по дереву с несколькими ветками. Какой-то юзер с первой ветки решает добавить себе подветку, теперь должны перестраиваться параметры веток у всех других юзеров.


Да это будет долговато, даже если поля leftKey и RightKey сделать, извиняюсь за мой плохой английский, "проидексировать", короче в мускуле есть что-то на полобие "register " в С. Только точно не помню как это называется. Скорость увеличится, но думаю не очень на много...

Про nested можно сделать разряженное дерево, т.е. с запасом для каждого юзера. Т.е ограничить по кол-ву элементов, И все которые не заданы им, оставлять пустыми и их просто не выводить... А когда добовляет то менять только в области самого юзера.
Добавлено @ 00:20
Цитата(Wowa @ 21.9.2005, 00:06)
Да, долгий вероятно. Зависит от ситуации. Но если уровней вложенности мало и веток немного, то спокойно можно даже всё дерево выбрать и быстренько в памяти выстроить нить из родителей. Ну или же рекурсией выбирать через запросы к базе..

Я считаю нужно сделать двумя способами, и проверить скорость!! Так думаю правильней будет.


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Wowa
Дата 21.9.2005, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(AntonioBanderaz @ 20.9.2005, 23:15)
Про nested можно сделать разряженное дерево, т.е. с запасом для каждого юзера. Т.е ограничить по кол-ву элементов, И все которые не заданы им, оставлять пустыми и их просто не выводить... А когда добовляет то менять только в области самого юзера.

Можно, но не стандартными средствами класса. А писать свой или переделывать для этого существующий - долго.

Или у тебя есть что-то готовое для этого?
PM WWW   Вверх
AntonioBanderaz
Дата 21.9.2005, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Цитата(Wowa @ 21.9.2005, 00:24)
Или у тебя есть что-то готовое для этого?

Готового нет, только родил идею smile
Я могу посидеть завтра может что и накатаю. smile
Цитата(Wowa @ 21.9.2005, 00:24)
Можно, но не стандартными средствами класса. А писать свой или переделывать для этого существующий - долго.

На самом деле не так уж и долго, может часа 4 + отладка час/полтора. Вот то что сверху для юзеров можно за основу взять, а там в основном запросы и вывод в массив поменять надо, наверно ещё привязку к таблице пользователей надо убрать. (был написан за 1 час)


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Wowa
Дата 21.9.2005, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(AntonioBanderaz @ 20.9.2005, 23:30)
Вот то что сверху для юзеров можно за основу взять

Наверное лучше за основу взять этот: http://dev.e-taller.net/dbtree
Т.к. он более функционален
Добавлено @ 00:40
Цитата(AntonioBanderaz @ 20.9.2005, 23:15)
Про nested можно сделать разряженное дерево, т.е. с запасом для каждого юзера.

Интересно, какой запас надо делать. По идее - должно быть практически все равно какой запас делать. Можно по сотке оставлять..

PM WWW   Вверх
AntonioBanderaz
Дата 21.9.2005, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Цитата(Wowa @ 21.9.2005, 00:39)
Интересно, какой запас надо делать. По идее - должно быть практически все равно какой запас делать.

В принципе любой, ты сам определишь какой, т.е это вроде максимума элементов дерева...

Цитата(Wowa @ 21.9.2005, 00:06)
Да, долгий вероятно. Зависит от ситуации. Но если уровней вложенности мало и веток немного, то спокойно можно даже всё дерево выбрать и быстренько в памяти выстроить нить из родителей. Ну или же рекурсией выбирать через запросы к базе..



Вот блин делема, либо быстрый вывод и долгое изменение, либо быстрое изменение и долгий вывод...

как бы найти оптимальное... ???

Код

if((aloritm = LongOut.QuickModify) || (algoritm = LongModify.QuickOut)) 
        algoritm = чтож здесь поставить?

Добавлено @ 00:50
Цитата(AntonioBanderaz @ 21.9.2005, 00:49)
В принципе любой, ты сам определишь какой, т.е это вроде максимума элементов дерева...
Эт для пользователя.



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Wowa
Дата 21.9.2005, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



AntonioBanderaz вот тут есть обсуждение на эту тему: http://www.phpclub.ru/talk/showthread.php?s=&threadid=48194

Не все так просто. Как переносить при этом ветки с подветками?
PM WWW   Вверх
AntonioBanderaz
Дата 21.9.2005, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Интересненько... Да, оказалось не всё так просто...

Цитата(Wowa @ 21.9.2005, 00:57)
Не все так просто. Как переносить при этом ветки с подветками?

Вот это вообще не представляю... Ели только сначала удалять запас, перемещать, а потом весь запас дополнять, но это уже совсем через ЖЖЖ.
Добавлено @ 01:15
http://www.profy.net/forum/view_topic/35.html - вот тут почитай.


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AntonioBanderaz
  Дата 21.9.2005, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Нашёл подходящий тебе.
вот документация
Код

An object to abstact away from the flat data representation forced by relational databases when willing to represent
 hierarchical data. This object makes use of both, tree traversal and the adjacency methods.

Examples
I presume you have a table in your database with the following SQL parameters

CREATE TABLE tree (
id int(12) NOT NULL AUTO_INCREMENT,
parent int(12),
title varchar(255) NOT NULL default 'no title',
lft INTEGER UNSIGNED NOT NULL default '0',
rgt INTEGER UNSIGNED NOT NULL default '0',
PRIMARY KEY  (id),
KEY rgt (rgt),
KEY lft (lft),
KEY parent (parent)
);

Hence create an instance of this object:

$myTree = new traversedTree($db);

Then add some data using:

$myTree->add(); //creates the root node

$myTree->add(0); //adds a node as child of root node

$myTree->add(0); //adds another node as child of root node

Then fetch the data and display the data:

$tree = $myTree->getTree();

foreach($tree as $leaf){ echo str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;",$leaf['offset']) . $leaf['title'] . "<br>"; }


Добавлено @ 01:24
А вот и полная.
http://www.inses.ru/lj/tree/

Код

CREATE TABLE tree (
id int(12) NOT NULL AUTO_INCREMENT,
parent int(12),
title varchar(255) NOT NULL default 'no title',
lft INTEGER UNSIGNED NOT NULL default '0',
rgt INTEGER UNSIGNED NOT NULL default '0',
PRIMARY KEY  (id),
KEY rgt (rgt),
KEY lft (lft),
KEY parent (parent)
);


А как всё просто оказалось!!!! Блин -)) Даже обидно, что не додумался....

вот типо сам код smile

Это сообщение отредактировал(а) AntonioBanderaz - 21.9.2005, 01:28

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  treebrowser.zip 40,45 Kb


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AntonioBanderaz
Дата 21.9.2005, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



http://www.sitepoint.com/print/1105/ - тут тоже кое что интересное.


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Wowa
Дата 21.9.2005, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(AntonioBanderaz @ 21.9.2005, 00:21)
Нашёл подходящий тебе.
вот документация


А как он мне может помочь?
PM WWW   Вверх
AntonioBanderaz
Дата 21.9.2005, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



Ну это что-то среднее между Nested и списком. Короче будет оптимально его использовать для твоей задачи...
У тебя теперь есть три варианта которые Ты можешь потестить и выбрать самый оптимальный.

Посмотри на организацию таблицы.

Это сообщение отредактировал(а) AntonioBanderaz - 21.9.2005, 01:47


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Gold Dragon
Дата 21.9.2005, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



Не знаю на сколько это в тему, но вдруг. В своё время я мучился над генеологическим деревом и как присвоить уникальный номер человеку в этом дереве.

Ниже прикрепил рисунок простого дерева. Поясню.
- Есть уровни родства, их здесь 4
- Есть группы родства, в которые входят братья и сёстра
- В каждой группе есть определённый человек

И от сюда можно описать любого человека, например выделенного зелёным - 2.1.2. Во-первых получается уникальный номер. Во-вторых, легко можно найти этого человека в древе и все его связи не зависимо от сложности родства и самого древа.

Я понимаю, что это немного не то, но мало ли smile

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  tree.gif 11,39 Kb


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 21.9.2005, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 18



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

Вот собственно и задача...



--------------------
ГЫ... 
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0976 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.