There are more options than just the two you mention. There are:
- Adjacency List (the “parent_id” one almost everyone uses)
- Nested Sets
- Path Enumeration
- Closure Table (aka Adjacency Relation)
See my answer to “What is the most efficient/elegant way to parse a flat table into a tree?”
Or a couple of books:
- “Trees and Hierarchies in SQL for Smarties” by Joe Celko.
- “SQL Design Patterns” by Vadim Tropashko.