Existem mais opções do que apenas as duas que você mencionou. Existem:
- Lista de adjacências (a "parent_id" que quase todo mundo usa)
- Conjuntos aninhados
- Enumeração de caminho
- Tabela de fechamento (também conhecida como Relação de Adjacência)
Veja minha resposta para "Qual é a maneira mais eficiente/elegante de transformar uma tabela plana em uma árvore? "
Ou alguns livros:
- "Árvores e hierarquias no SQL para Smarties " por Joe Celko.
- "Padrões de design SQL " por Vadim Tropashko.