То, что вы пытаетесь сделать, это создать топологическую сортировку. Для оптимального выполнения этой процедуры опубликовано несколько методов, и это будет зависеть от вашей схемы и предпочтительного метода.
В вашем случае это звучит так, как будто у вас нет родителя с несколькими родителями.
Но то, как я справился с этим программно, - это начать с листовых узлов (то есть без дочерних узлов) и подняться на дерево.
Во время подъема сохраняйте коллекцию встреченных вами узлов. Если вы когда-либо повторяете встречу, тогда существует цикл, и топологическая сортировка невозможна.
Вы не получите бесконечный цикл, но, безусловно, возможно, что ваша топология будет иметь более 1000 узлов ... поэтому рекурсия может быть невозможна для вас.
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш вопрос о "лучшем дизайне" .... Если возможно, может быть полезно сохранить идентификатор корневого узла.
То есть: дано родителю, ребенку, внуку, правнуку, великому великому .... внуку
Каждая строка будет содержать не только непосредственный идентификатор родителя, но также корневой узел Родительский идентификатор ... или какой-либо "заведомо исправный" корневой узел
Если вы сделаете это, вы можете ускорить методы топологической сортировки, поднявшись только до корневого узла, и включив в него только наборы, имеющие одинаковый корневой узел.