ANSI標準SQLではなく、そうではありません。まあ、それは厳密には当てはまりません。左外部結合を実行し、可能な最大深度をカバーするのに十分な大きさを置くことができますが、最大深度を拘束してその数の結合を含める場合を除き、常に機能するとは限りません。
行のセットが十分に小さい(たとえば1000未満)場合は、それらのすべてを取り出して把握するだけです。おそらく、単一の読取りトラバーサルよりも速いでしょう。
親トラバーサルをバッチすることができます。
SELECT t1.id id1, t1.parent parent1,
t2.id id2, t2.parent parent2,
t3.id id3, t3.parent parent3,
t4.id id4, t4.parent parent4,
t5.id id5, t5.parent parent5
FROM mytable t1
LEFT OUTER JOIN mytable t2 ON t1.parent = t2.id
LEFT OUTER JOIN mytable t3 ON t2.parent = t3.id
LEFT OUTER JOIN mytable t4 ON t3.parent = t4.id
LEFT OUTER JOIN mytable t5 ON t4.parent = t5.id
WHERE t1.id = 1234
のようなクエリがあり、必要な数に拡張します。最後に検索された親がヌルでない場合は、ツリーの先頭にいないので、クエリを再度実行します。この方法で、1-2往復に減らすことをお勧めします。
これ以外にも、IDのデータをエンコードする方法を見ることができます。これはお勧めしませんが、各ノードの子供数を100に制限すると、IDが10030711のノードに10 - > 03 - > 07 - > 11のパスがあると言うことができます。もちろん、max IDの長さ)、もちろんそれはハッキーです。
SQLの階層データには2つの基本モデルがあることにも注意してください。隣接リストと入れ子セット。あなたの方法(かなり一般的です)は隣接関係です。ネストされたセットは本当にこの状況では役に立ちませんし、挿入を行うのは複雑です。
残念ながら行の私のセットが合理的に大であっても常に成長しています。 –