![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Хочу использовать алгоритм Nested Sets для построения дерева с неогр. вложеностью. Но система многопользовательская и каждый пользователь должен иметь возможность построить подобное дерево. Создавать на каждого юзера по таблице - не решение. Поэтому нужно хранить все деревья в одной таблице.
Если мысли, как это сделать? Кто ничего не знает об этом алгоритме, можно коротко почитать тут: http://www.izone.kiev.ua/web/php/23.htm (вторая часть статьи) |
|||
|
||||
| Bikutoru |
|
||||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: 2 Всего: 22 |
fk_user - какая-то характеристика пользователя. Если он(пользователь) должен быть зарегистрированным, то его id - самое оно, если же нет, то можно использовать идентификатор сессии. Добавлено @ 13:35 Можно и еще упростить - сделать таблицу
а из multiuser_tree fk_user выбросить. Тогда всё сводится к выборке корня и "хождению" по multiuser_tree. Если же пользователи уже описаны, то достаточно добавить в таблицу с их описанием один столбец. Это сообщение отредактировал(а) Bikutoru - 13.9.2005, 13:30 -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
||||
|
|||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: 2 Всего: 22 |
Уппс. Это же не Nested Sets...
-------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
| AntonioBanderaz |
|
|||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 18 |
Да ничего сложного, делать узлом в руте как-бы пользователя, а все подузлы и листья, ет всё его, вывод такого дерева можно выполнить запросом...
где $tbl - таблица $id - ну это элемент, для которого выводятся все дети, поддерево короче. Добавлено @ 14:57 Забыл, если nflag = 1 - значит есть потомки. Это сообщение отредактировал(а) AntonioBanderaz - 13.9.2005, 14:58 -------------------- ГЫ... |
|||
|
||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: 2 Всего: 22 |
Кстати, нашёл очень хорошую статью об этом деле. Здесь
Это сообщение отредактировал(а) Bikutoru - 13.9.2005, 18:40 -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Да, я тоже об этом думал... Но не знаю, насколько это хорошо, если пользователей несколько десятков тысяч будет. И каждый будет иметь в своем дереве примерно по 15 элементов, который в среднем на двух или трех уровнях вложенности располагаться будут. |
|||
|
||||
| AntonioBanderaz |
|
|||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 18 |
А думаешь при другой расстановке у тебя будет меньше елементов, как я понял, это для выборочного отображения форумов на сайте... =)) В принципе алгоритм хороший, только по изменениях какого-либо элемента придётся пересчитывать всё, что следует за ним, а вот это уже не есть гуд ( для базы в 10000 элементов ещё нормально, а 10000*15 - не пробовал, посмотри потести скорость)
А вот это всё равно, какая у них вложеность, хоть 1999-ая создай дополнительное поле level, это будет быстрее работать, чем делать пересчёт по всем границам ветвей. У меня такие поля в БД. ID | cat_left | cat_right | cat_level [name .... description] Из них рабочие первые четыре, остальные информационные... -------------------- ГЫ... |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
нет, совсем не для этого...
Если у меня есть три корневых раздела, и я добавляю во второй корневой раздел еще одну ветку. Будут ли затронуты как-то первый и третий разделы? Ничего там пересчитываться не будет? |
||||
|
|||||
| AntonioBanderaz |
|
||||||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 18 |
Только третий и общий корень, поле right. Да у третьего, ко всем полям, имею ввиду right и left, будет прибавлена 2. Я тут накотал классик для себя, думаю тебе это подойдёт. Класс DB нужен для работы с базой данных:
А это уже для работы с деревьями для пользователя.
Там могут быть маленькие ошибки, и не сделал обработку ошибок. Таблица и названия полей зашиты в запросы, надо в коде менять.. Во втором классе DB - ссылка на экземпляр первого класса. Надеюсь пригодится... =))) Это сообщение отредактировал(а) AntonioBanderaz - 14.9.2005, 02:42 -------------------- ГЫ... |
||||||
|
|||||||
| AntonioBanderaz |
|
|||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 18 |
Да кстате у всего должен быть общий корень, один, а не три или больше...
-------------------- ГЫ... |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Нет. Я подумал и решил, что так не годится. Для каждого юзера нужно обязательно отдельное дерево не связанное с другими. Т.к. иначе, если вдруг дерево запорится у кого-то, то может быть такое, что и у других что-то поломается. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Если делать так, чтобы с корня выходило много веток и у каждого юзера было бы по своей ветке. То сюдя из этого:
![]() насколько я понял, если какой-то юзер что-то добавит в своей ветке, то должны будут пересчитаться ключи у всех веток других юзеров, если они "правее". Что совершенно недопустимо и глупо при большом кол-ве юзеров. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Я решил все-таки использовать метод Adjacency List, т.к. уровней вложенности всего 3-4 будет.
|
|||
|
||||
| AntonioBanderaz |
|
||||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 18 |
Ну это врятли, деревья по сути между собой не связяны, если только оболочкой (root'ом);
Напиши по-подробней про него. -------------------- ГЫ... |
||||
|
|||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Как это не связаны? По рисунку, который я выше прикрепил - видно, что если я в первой ветке выходящей с корня что-то изменю(например, добавлю еще один уровень), то во второй и третьей ветках выходящих с корня - должны быть пересчитаны left key и right key.
Adjacency List - и есть именно простейший метод хранения деревьях, который ПЕРВЫМ описан в статье, ссылку на которую я привел выше. |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |