Existem várias alternativas para facilitar o trabalho com informações hierárquicas no SQL:
-
Expressões de tabela comuns (de acordo com o padrão SQL-2003) oferecem suporte a consultas SQL recursivas em relação ao tipo de dados parent-id que você está usando. Até agora, o MySQL não suporta esse recurso. PostgreSQL 8.4, Microsoft SQL Server e IBM DB2 são exemplos de marcas de RDBMS que suportam a sintaxe CTE. O Oracle também possui uma extensão proprietária para a sintaxe SQL que suporta consultas recursivas.
-
Conjuntos aninhados (a solução esquerda/direita que @phantombrain menciona) é uma solução detalhada no livro de Joe Celko "Trees and Hierarchies in SQL for Smarties" e também em vários artigos e postagens de blog na internet.
-
Enumeração de caminho (também conhecido como Caminho Materializado) armazena uma string em cada linha na hierarquia para anotar o caminho dos ancestrais dessa linha. Combine isso comLIKE
consultas para comparar a string de caminho com os caminhos de seus ancestrais e os caminhos dos descendentes.
-
Tabela de encerramento (também conhecido como Transitive Closure Relation) usa uma segunda tabela para armazenar todos os relacionamentos ancestrais-descendentes, não apenas o pai imediato como no design que você está usando. Muitos tipos de consultas se tornam mais fáceis quando você tem todos os caminhos armazenados.
-
Soluções híbridas também existem. Por exemplo, armazene o id pai imediato enquanto você está fazendo, mas também a raiz da árvore. Agora você pode obter todas as outras linhas na mesma hierarquia, buscá-las no código do aplicativo e classificar a árvore com estruturas de dados convencionais.