Один минус Списка соседства заключается в том, что он неэкономно решает задачу извлечения предков заданного узла в дереве. В методе Перечисления путей эта задача решается путем хранения строки предков как атрибута каждого узла.
Форму Перечисления путей можно наблюдать в иерархии каталогов. UNIX-путь, такой как /usr/local/lib/, является Перечислением путей файловой системы, где usr — родитель папки local, которая в свою очередь является родительским объектом для папки lib.
В таблице Comments вместо столбца parent_id определите столбец, именуемый как path, в виде длинной переменной VARCHAR. Строка, хранящаяся в этом столбце, является последовательностью предков текущей строки в порядке сверху вниз, как UNIX-путь. Можно даже выбрать слеш (/) в качестве символа разделителя.
Файл примера: Trees/soln/path-enum/create-table.sql
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
path VARCHAR(i000) ,
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)) ;
comment_id path author comment
1 1/ Фран В чем причина этой ошибки?
2 1/2/ Олли Полагаю, это указатель null.
3 1/2/3/ Фран Нет, я проверил это.
4 1/4/ Кукла Требуется проверить правильность входных данных.
5 1/4/5/ Олли Да, в этом ошибка.
6 l/4/б/ Фран Да, добавьте, пожалуйста, эту проверку.
7 1/4/6/7/ Кукла Проверка устраняет ошибку.
Можно запросить предков путем сравнения пути текущей строки с шаблоном, образованным из пути другой строки. Например, чтобы найти предков комментария № 7, чей путь — 1/4/6/7/, выполните следующий программный код:
Файл примера: Trees/soln/path-enum/ancestors.sql
SELECT *
FROM Comments AS с
WHERE 4/4/6/7/' LIKE c.path || '%';
Этим кодом сравниваются шаблоны, образованные из путей предков 1/4/6/%, 1/4/% И 1/%.
Можно запросить потомков, изменив на обратные аргументы предиката LIKE. Чтобы найти потомков комментария № 4, чей путь — 1/4/, используйте следующий программный код:
Файл пртлнера: Trees/soln/path-enum/descendants.sql SELECT *
FROM Comments AS с
WHERE с.path LIKE '1/4/' || '%';
Шаблон 1/4/% совпадаете путями потомков 1/4/5/, 1/4/6/ и 1/4/6/7/.
Если есть возможность легко выбрать подмножество дерева или цепочки предков вплоть до корня, легко можно выполнить много других запросов, таких как вычисление SUMO стоимостей узлов в поддереве или просто вычислить количество узлов. Например, чтобы посчитать комментарии по авторам в поддереве, начиная с комментария № 4, выполните следующий программный код:
Файл примера: Trees/soln/path-enum/count.sql
SELECT COUNT(*)
FROM Comments AS с
WHERE c.path LIKE 11/4/' || '%'
GROUP BY c.author;
Опубликовал vovan666
June 18 2013 12:25:01 ·
0 Комментариев ·
3455 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.