Я не знаю, подойдет ли это вашей проблеме, но один из способов сохранить иерархии в базах данных, с быстрыми функциями «дай мне все от этого узла и ниже», - это сохранить «путь».
Например, для дерева, которое выглядит так:
+-- b
|
a --+ +-- d
| |
+-- c --+
|
+-- e
вы бы сохранили строки следующим образом, предполагая, что буква в вышеприведенном дереве является "id" каждой строки:
id path
a a
b a*b
c a*c
d a*c*d
e a*c*e
Чтобы найти всех потомков определенного узла, вы должны выполнить запрос «STARTSWITH» для столбца пути, т.е. все узлы с путем, который начинается с a*c*
Чтобы выяснить, является ли конкретный узел потомком другого узла, вы увидите, начинается ли самый длинный путь с самого короткого пути.
Так, например:
- e является потомком, поскольку
a*c*e
начинается с a
- d является потомком c, так как
a*c*d
начинается с a*c
Будет ли это полезно в вашем случае?