私は隣接リストモデルを使用して、(非常に動的な)ツリー構造を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