Решение Вложенные множества позволяет хранить информацию с каждым узлом, принадлежащим множеству его потомков, а не непосредственному родителю узла. Данная информация может быть представлена путем кодирования каждого узла в дереве с помощью двух номеров, которые можно назвать nsleft и nsright.
Файл npuMepa:_Trees/soln/nested-sets/create-table.sql
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
nsleft INTEGER NOT NULL,
nsright INTEGER NOT NULL,
bug_id BIGINT UNSIGNED NOT NULL,
author BIGINT UNSIGNED NOT NULL,
comment_date DATETIME NOT NULL,
comment TEXT NOT NULL,
FOREIGN KEY (bug_id) REFERENCES Bugs (bug_id), FOREIGN KEY (author) REFERENCES Accounts(account_id)
) ;
Каждому узлу задаются номера nsleft и nsright следующим способом: номер nsleft меньше, чем номера всех дочерних объектов узла, тогда как номер nsright больше, чем номера всех дочерних объектов данного узла. Эти номера не связаны со значениями параметра comment_id.
Простой способ присвоения этих значений состоит в выполнении первого глубокого прохода по дереву, присвоении номеров nsleft с приращением
С другой стороны, это во многом напоминает антипаттерн Блуждания без ориентиров.
по мере спуска по ветви дерева и присвоении номеров nsright по мере обратного подъема по ветви.
Возможно, модель легче наглядно представить по рис. 3.3, чем из приведенного выше описания.
comment_id Nsleft nsright author comment
1 1 14 Фран В чем причина этой ошибки?
2 2 5 Олли Полагаю, это указатель null.
3 3 4 Фран Нет, я проверил это.
4 6 13 Кукла Требуется проверить правильность входных данных.
5 7 8 Олли Да, в этом ошибка.
6 9 12 Фран Да, добавьте, пожалуйста, эту проверку.
7 10 11 Кукла Проверка устраняет ошибку.
После того как каждому узлу присвоены эти номера, их можно использовать для поиска предков и потомков любого заданного узла. Например, можно извлечь комментарий № 4 и его потомков путем поиска узлов, номера которых находятся между nsleft и nsright текущего узла.
Файл npMMepa:_Trees/soln/nested-sets/descendants.sql
SELECT с2.* FROM Comments AS cl JOIN Comments as c2
ON c2.nsleft BETWEEN cl.nsleft AND cl.nsright WHERE cl.comment_id = 4;
Можно извлечь комментарий № 6 и его предков путем поиска узлов, номера которых охватывают номера текущего узла. Например:
Файлпримера:_ Trees/soln/nested-sets/ancestors.sql
SELECT с2.* FROM Comments AS cl JOIN Comment AS c2
ON cl.nsleft BETWEEN c2.nsleft AND c2.nsright WHERE cl.comment_id = 6;
Опубликовал vovan666
June 18 2013 12:25:06 ·
0 Комментариев ·
4511 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.