Det finns flera alternativ för att göra hierarkisk information lättare att arbeta med i SQL:
-
Vanliga tabelluttryck (enligt SQL-2003-standarden) stödjer rekursiva SQL-frågor mot den förälder-id-typ av data som du använder. Än så länge har MySQL inte stöd för denna funktion. PostgreSQL 8.4, Microsoft SQL Server och IBM DB2 är exempel på RDBMS-varumärken som stöder CTE-syntax. Oracle har också ett egenutvecklat tillägg till SQL-syntax som stöder rekursiva frågor.
-
Inkapslade uppsättningar (vänster/höger-lösningen som @phantombrain nämner) är en lösning som beskrivs i Joe Celkos bok "Trees and Hierarchies in SQL for Smarties" och även i många artiklar och blogginlägg på internet.
-
Sökvägsuppräkning (aka Materialized Path) lagrar en sträng i varje rad i hierarkin för att notera sökvägen för förfäder till den raden. Kombinera detta med
LIKE
frågor för att jämföra sökvägssträngen med dess förfäders vägar och avkomlingars vägar. -
Stängningstabell (aka Transitive Closure Relation) använder en andra tabell för att lagra alla anfäder-ättling-relationer, inte bara den omedelbara föräldern som i designen du använder. Många typer av frågor blir enklare när du har lagrat alla sökvägar.
-
Hybridlösningar finns också. Lagra till exempel det omedelbara förälder-id:t som du gör, men också roten till trädet. Nu kan du få alla andra rader i samma hierarki, hämta dem till applikationskoden och sortera ut trädet med konventionella datastrukturer.