Общие > Базы данных
Обсуждение статьи ДЕРЕВО КАТАЛОГОВ NESTED SETS (ВЛОЖЕННЫЕ МНОЖЕСТВА) И УПРАВЛЕНИЕ ИМ
CLiI{er:
Статья на редкость интересная. Не в том смысле, что интересные фрагменты встречаются редко.
Порадовали конкретные SQL-запросы для выполнения конкретных задач.
Скажите, а кто-либо использует эту схему для своих сайтов?
Интересует, как nested sets можно сравнить со схемой, которая применяется для GForge (http://gforge.org/):
id_topic
Номер узла, auto_increment, наш primary key.
sort_order
Порядок сортировки, +/- 10.
id_parent
Вышестоящий узел.
id_parent_root
Вышестоящий узел второго уровня вложенности. Если для данного узла такого уровня нет - тогда 0.
cnt_subtopic
Количество узлов внутри данного узла. Для вывода на экран "тема такая-то (10)"
ids_fullpath
Полный путь узла, разделенный каким-нибудь простым способом. Например запись " 10 :: 23 :: 45 " означает "45-й узел внутри 23-го, 23-й внутри 10-го, 10-й - самый главный и он же в id_parent_root)
Выбор фрагмента ветки любого уровня производится с помощью запроса:
SELECT ids_fullpath FROM table
WHERE ids_fullpath LIKE "% 23 %"
Пример полученного списка:
10 :: 23
10 :: 23 :: 45
10 :: 23 :: 45 :: 50
Выбор всей ветки:
SELECT ids_fullpath FROM table
WHERE id_parent_root = "10"
Обновление и добавление несложное - одна php-функция просто добавляет строку
без ids_fullpath, другая - рекурсивная, пересчитывает ids_fullpath
для только что вставленного id_topic и, если потребуется, для всей ветки, начиная c последнего узла (45),
заканчивая первым, root (10).
Содержимое таблицы:
--- Код: ---
id_topic id_parent id_parent_root cnt_subtopic ids_fullpath
10 0 0 3 10
23 10 10 2 10 :: 23
45 23 10 1 10 :: 23 :: 45
50 45 10 0 10 :: 23 :: 45 :: 50
--- Конец кода ---
Примерно такая схема применяется сегодня на sourceforge.net, freshmeat.net.
Только там базы PostgreSQL, поэтому значение для поля cnt_subtopic
вычисляется автоматически при обновлении дерева с помощью хранимой процедуры.
Phoinix:
CLiI{er
--- Цитировать ---Скажите, а кто-либо использует эту схему для своих сайтов?
--- Конец цитаты ---
Странный вопрос, тем более что я внизу написал даже на каких... ;)
А по сравнению:
--- Цитировать ---Обновление и добавление несложное - одна php-функция просто добавляет строку
без ids_fullpath, другая - рекурсивная, пересчитывает ids_fullpath
для только что вставленного id_topic и, если потребуется, для всей ветки, начиная c последнего узла (45),
заканчивая первым, root (10).
--- Конец цитаты ---
При использовании Nested Set - достаточно одного запроса при обновлении (перемещении), и трех, при добавлении:
UPDATE дерева
INSERT узла
Впрочем это все написано и так в статье...
То же самое с выбором фрагмента ветки, хотя, у тебя это тоже один запрос, но использовать LIKE - несколько медленно
А если хочется выбрать и родительскую ветку и подчиненные узлы сразу?
CLiI{er:
--- Цитировать ---Phoinix:
я внизу написал даже на каких...
--- Конец цитаты ---
Это сайты автора статьи. Разница между рекламными ссылками и применением предложенной схемы другими разработчиками в производстве сайтов всё же существует. О применении я и хотел услышать. И, если возможно, узнать, какие коммерческие продукты используют nested sets (я просто не в курсе).
Гость:
Может я че-то не понимаю .. но что-то мне кажеться что этf система постороение дерева не быстрее обычной .. где ID и Parent_ID ...
Phoinix:
Гость
--- Цитировать ---что эта система постороение дерева не быстрее обычной
--- Конец цитаты ---
Может я тоже что-то не понимаю, но при чем тут построение дерева и скорость?
Навигация
Перейти к полной версии