Hay más opciones además de las dos que mencionas. Hay:
- Lista de adyacencia (la "parent_id" que usa casi todo el mundo)
- Conjuntos anidados
- Enumeración de rutas
- Tabla de cierre (también conocida como relación de adyacencia)
Vea mi respuesta a "¿Cuál es la forma más eficiente/elegante de convertir una mesa plana en un árbol? "
O un par de libros:
- "Árboles y jerarquías en SQL para Smarties " por Joe Celko.
- "Patrones de diseño de SQL " por Vadim Tropashko.