Список смежности (Adjacency list)
Самый простой и распространённый способ хранить дерево в SQL: у каждой строки есть parent_id, указывающий на родителя. Легко понять и менять, но выборка поддеревьев требует рекурсивных запросов.
Таблица ссылается сама на себя: parent_id — внешний ключ на первичный ключ той же таблицы, у корней он равен NULL. Плюс: добавлять и переносить узлы тривиально (меняется один parent_id), модель естественна и нормализована. Цена: чтобы получить всех потомков или предков, нужно несколько запросов (по одному на уровень) или рекурсивный CTE (WITH RECURSIVE), который на глубоких деревьях может тормозить.
Это классическая модель, с которой начинают; если чтение поддеревьев становится узким местом, переходят на материализованный путь, вложенные множества или таблицу замыканий. Большинство ORM поддерживают её напрямую. Выбор по умолчанию для умеренных иерархий: категории, ветки комментариев, оргструктуры.