Lista de adjacência adjacency list
A forma mais simples e comum de armazenar uma árvore em SQL: cada linha tem um parent_id apontando para o pai. Fácil de entender e atualizar, mas buscar subárvores inteiras exige consultas recursivas.
Mecânica: uma tabela autorreferenciada em que parent_id é uma chave estrangeira para a própria chave primária da tabela; nós raiz têm NULL. Vantagem: é trivial adicionar ou mover nós (basta trocar um parent_id), de forma natural e normalizada. Preço: buscar todos os descendentes ou ancestrais exige várias consultas (uma por nível) ou uma CTE recursiva (WITH RECURSIVE) — que pode ficar lenta em árvores profundas. É o modelo clássico por onde se começa; se as leituras de subárvore virarem um gargalo, migra-se para materialized path, nested set ou closure table. A maioria dos ORMs já dá suporte direto. É a escolha padrão para hierarquias moderadas (categorias, threads de comentários, árvores organizacionais). Relacionado a consulta recursiva e materialized path.