Я использую модель списка смежности для хранения (очень динамической) древовидной структуры в базе данных MySQL. Мне нужен способ выбрать всех потомков данного узла, желательно с помощью одного вызова хранимой процедуры. Я знаю, что модель вложенных наборов сделает это легко, но это сделает другие вещи очень трудными, так что, к сожалению, это не вариант для меня. Вот что у меня до сих пор:Выбор всех потомков узла дерева
DELIMITER //
CREATE PROCEDURE get_descendants(node_id INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS descendants;
CREATE TEMPORARY TABLE descendants (id INT, name VARCHAR(100), parent_id INT);
INSERT INTO descendants
SELECT *
FROM nodes
WHERE parent_id <=> node_id;
-- ...?
END//
DELIMITER ;
Идея заключается в том, чтобы сверлить вниз и добавления детей в таблицу потомков, пока не достигнет листьев. Затем я могу получить доступ к временной таблице вне процедуры ... Надеюсь. (Это действительно отстой, что я не могу вернуть результирующий набор из сохраненной функции.)
Мне нужно как-то перебрать результаты и выдать новый оператор SELECT для каждой строки. Я читал, что курсоры могут помочь здесь, но я не понимаю, как это сделать. Кажется, что с помощью курсоров вам нужно выбрать все впереди, а затем повторить.
Вложенные наборы - это не единственный вариант. Столы для закрытия также заслуживают внимания. – eggyal
На самом деле, я только что открыл закрытые столы сегодня днем! Они кажутся многообещающими, но они не очень хорошо обрабатывают операции перемещения. http://www.mysqlperformanceblog.com/2011/02/14/moving-subtrees-in-closure-table/ В этом смысле они вроде как вложенные наборы. Я буду учиться. – Metaphile
Выбор подходящей структуры данных для ваших нужд - это понимание того, как часто вам нужно выполнять различные типы операций - так как каждое решение разворачивает время против пространства по-разному. Если ваш график довольно статичен, и вам часто нужно проверять пути через него, то список смежности, вероятно, не самый лучший выбор; однако это может быть идеальным решением, если график очень динамичен, и вам редко приходится проверять больше, чем непосредственно соседние соседи любого данного узла. – eggyal