私はリレーショナルデータベースにテーブルを持っています。このテーブルでは、Materialized pathというテクニックを使用してツリーをエンコードしますリネージュ列と呼ばれます)。つまり、ツリー内の各ノードについて、テーブルに行があり、各行に対して、ancestry
という名前の文字列があります。ここでは、ルートノードからこの行で表されるノードまでのパスを格納します。ツリーをエンコードするマテリアライズドパスを使用するテーブルから深度優先順(再帰/ ltreeなし)
は、それが可能であり、そうならば - に行きがけでorderdテーブル内の行を選択する方法、つまり、彼らは木depth-firstを訪問してしまうために、結果セットに表示されます。私はMySQLを使用しているので、は再帰的クエリがなく、ltree拡張子はではありません。
例えば、木は、それがテーブルだし、行きがけ順て選択:
1 SELECT * FROM nodes SELECT * FROM nodes ORDER BY ?depth_first_visit_order?
| \ id | ancestry id | ancestry
2 3 ------------- -------------
| | \ 1 | NULL 1 | NULL NOTE: I don't care about the
4 5 6 2 | 1 2 | 1 order of siblings!
| 3 | 1 4 | 1/2
7 4 | 1/2 3 | 1
5 | 1/3 5 | 1/3
6 | 1/3 7 | 1/3/5
7 | 1/3/5 6 | 1/3
注:私は、マテリアライズドパスのエンコーディングを介してこれを行うには、明示的に興味を持っています!
関連:これはあなたの「祖先」の最後の数で
select *,
Substring(ancestry,LEN(ancestry) - Charindex('/',Reverse(ancestry))+2, LEN(ancestry)) as END_CHAR
from nodes
order by END_CHAR desc
を注文しますWhat are the options for storing hierarchical data in a relational database?
同様のhttp://stackoverflow.com/questions/2797720/sorting-tree-with-a-materialized-path – clyfe