Existuje několik alternativ, jak usnadnit práci s hierarchickými informacemi v SQL:
-
Běžné tabulkové výrazy (podle standardu SQL-2003) podporují rekurzivní dotazy SQL proti typu rodičovského id dat, která používáte. MySQL zatím tuto funkci nepodporuje. PostgreSQL 8.4, Microsoft SQL Server a IBM DB2 jsou příklady značek RDBMS, které podporují syntaxi CTE. Oracle má také proprietární rozšíření syntaxe SQL, které podporuje rekurzivní dotazy.
-
Vnořené sady (řešení vlevo/vpravo, které @phantombrain zmiňuje) je řešení podrobně popsané v knize Joea Celka "Stromy a hierarchie v SQL pro Smarties" a také v mnoha článcích a blogových příspěvcích na internetu.
-
Výčet cesty (aka Materialized Path) ukládá řetězec do každého řádku v hierarchii, aby zaznamenal cestu předků tohoto řádku. Zkombinujte to s
LIKE
dotazy k porovnání řetězce cesty s cestami jeho předků a cestami potomků. -
Uzavírací tabulka (aka Transitive Closure Relation) používá druhou tabulku k uložení všech vztahů předek-potomek, nejen bezprostředního rodiče jako v návrhu, který používáte. Mnoho typů dotazů se zjednoduší, jakmile budete mít všechny cesty uložené.
-
Hybridní řešení také existují. Například uložte ID bezprostředního rodiče tak, jak to děláte, ale také kořen stromu. Nyní můžete získat všechny ostatní řádky ve stejné hierarchii, načíst je do kódu aplikace a roztřídit strom pomocí konvenčních datových struktur.