Существует несколько способов сохранить древовидную структуру в реляционной базе данных. Чаще всего используются родительские указатели и вложенные множества .
Первый имеет очень простую структуру данных, а именно указатель на соответствующий родительский элемент каждого объекта), и, следовательно, его легко реализовать. С другой стороны, это не так легко сделать некоторые запросы, поскольку дерево не может быть полностью пройдено. Вам потребуется самостоятельное соединение для каждого слоя.
Вложенный набор проще запрашивать (когда вы поняли, как он работает), но его сложнее обновить. Многие записи требуют дополнительных обновлений для других объектов в дереве, что может затруднить переходное сохранение.
Третий вариант - это материализованный путь 1010 *, который я лично считаю хорошим компромиссом между первыми двумя.
Тем не менее, если вы хотите хранить деревья произвольного размера (например, для разделов, подразделов, подразделов, ...), вам следует использовать одну из упомянутых реализаций дерева. Если у вас очень ограниченная максимальная глубина (например, максимум 3 слоя), вы можете избежать создания явной структуры данных. Но так как вещи всегда становятся более сложными, чем изначально, я бы посоветовал вам использовать реальную реализацию дерева.