Я настоятельно рекомендую вам прочитать эту статью о хранении иерархических данных в базе данных . Здесь обсуждаются два алгоритма, и в зависимости от ваших потребностей может подойти любой из них.
Модель списка смежности
Это то, что у вас сейчас есть. Каждый узел дерева хранит ссылку на своего родителя, и вы можете рекурсивно определить путь к узлу, выбрав каждый уровень дерева и выполнив итерации по узлам. Это просто реализовать, но недостатком является то, что для определения конкретного пути к узлу требуются рекурсивные запросы. Если ваше дерево подвергается множеству изменений (например, записи), это хороший способ, так как динамический поиск каждого узла хорошо работает с постоянно меняющимся деревом. Если он тяжел для чтения, у вас есть некоторые накладные расходы в рекурсии.
Модифицированный обход дерева предзаказа
Мой любимый, это очень аккуратный алгоритм. Вместо сохранения ссылки на родителя (что вы можете сделать в любом случае для удобства), вы сохраняете ссылку на «левый» и «правый» узлы для каждого данного узла. Весь путь к узлу может быть определен в одном запросе выбора или, наоборот, для всех дочерних узлов. Алгоритм сложнее реализовать, но он имеет преимущества в производительности для деревьев с интенсивным чтением. Недостаток заключается в том, что каждый раз, когда узел перемещается или добавляется, необходимо пересчитывать целые ветви дерева, поэтому он может не подходить для наборов данных с интенсивной записью.
В любом случае, надеюсь, что эта статья даст вам некоторые идеи. Это хорошо.