Zastanów się czy podkategorii będziesz miał nieskończenie wiele (czy to będzie drzewko) czy będziesz miał tylko kat. nadrzędną i do niej jakieś kategorie podrzędne bez złożonych struktur.
Jeśli będzie to drzewko kategorii do tego tworzone dynamicznie i nie wiadomo jaka będzie to ilość podkategorii to mówimy tu o czymś bardzo ciekawym co ostatnio robiłem w kilku projektach

Mój pomysł to:
$categories = array('id' => 1, 'parent_id' => 1, 'name' => 'rodzina', 'descript' => 'jakiś opis rodzinki'); 1
=> array('id' => 1, 'parent_id' => 1, 'name' => 'rodzina', 'descript' => 'jakiś opis rodzinki', 'categories' => array()),2
=> array('id' => 2, 'parent_id' => 2, 'name' => 'zwierzeta_w_domu', 'descript' => 'jakiś opis teściów', 'categories' => array()));
$categories[1]['categories'] = array( 3
=> array('id' => 3, 'parent_id' => 1, 'name' => 'babcia', 'descript' => 'jakiś opis babci', 'categories' => array()),4
=> array('id' => 4, 'parent_id' => 1, 'name' => 'tata', 'descript' => 'jakiś opis taty', 'categories' => array()));
$categories[2]['categories'] = array( 5
=> array('id' => 6, 'parent_id' => 2, 'name' => 'tesciowa', 'descript' => 'jakiś opis teściowej', 'categories' => array()),6
=> array('id' => 5, 'parent_id' => 2, 'name' => 'tesc', 'descript' => 'jakiś opis teścia', 'categories' => array()))
i tak dalej robisz sobie złożoną strukturę kategorii i podrzędnych im podkategorii.
Najłatwiej to zrobić w BD ale jak można zauważyć aby pobrać całe drzewko rekurencyjnie każdą z podkategorii trza by zapytaniem ładować co zabija server.
Ja to włożyłem do XML i hula jak złoto

Do szukania używam xpach(); ale szukam tylko po id, wiec tobie by wypadało zrobić dla XML relację w bazie po ID i tam wkładać opisy dla podkategorii - wtedy zwykły opis like('%babcia%') i wyciąga ci wszystkie ID, a jak chcesz pobrać drzewko to nie siepiesz zapytań do bazy tylko normalnie robisz rekurencyjnie tablicę wielowymiarową z XML