no necesariamente debes utilizar una segunda tabla...
con una sola, y empleando recursividad puedes igualmente conseguirlo
las categorías principales no tienen valor alguno en la columna "categoría", mientras que las sub-categorías si tienen un valor aquí...
Cita: SELECT * FROM categorias WHERE categoria IN(NULL, 0)
SELECT * FROM categorias WHERE categoria = 1