Stosuję strukturę kategorii nested sets. Przykładowe drzewo:
Kod
Programy
   Freeware
   Pirackie
      Polskie
      Zagraniczne
   Shareware
Filmy
   Akcji
   Historyczne

Struktura tabeli cats w bazie danych:
Kod
ID | name | parent_id | type | left | right

Przy wyświetlaniu wszystkich kategorii wszystko jest dobrze. Kod: http://pastebin.com/d1cb5723
Gdy trzeba ukryć niektóre kategorie, cała struktura chwieje się - piekło. Przykłady w praktyce:
  • Formularz do edycji artykułów -> trzeba wyświetlić do wyboru tylko kategorie o type ARTYKUŁY, czyli `type` = 5
  • Użytkownik ma uprawnienia tylko do wybranych kategorii
Rozwiązaniem może być dodatkowe pole depth, ale wolałbym uniknąć dodawania dodatkowego pola do struktury tabeli.

Zastanawiam się, czy nie przejść np. na materialized path lub inny schemat, bo chyba więcej problemów być nie może. W nested sets zmiana położenia kategorii w drzewie wiąże się ze skomplikowanymi zapytaniami lub przebudową całego drzewa (na szczęście ten problem już rozwiązałem).