Existen varias alternativas para facilitar el trabajo con la información jerárquica en SQL:
-
Expresiones de tabla comunes (según el estándar SQL-2003) admite consultas SQL recursivas contra el tipo de datos de identificación principal que está utilizando. Hasta ahora, MySQL no admite esta función. PostgreSQL 8.4, Microsoft SQL Server e IBM DB2 son ejemplos de marcas RDBMS que admiten la sintaxis CTE. Oracle también tiene una extensión patentada para la sintaxis SQL que admite consultas recursivas.
-
Conjuntos anidados (la solución izquierda/derecha que menciona @phantombrain) es una solución detallada en el libro de Joe Celko "Trees and Hierarchies in SQL for Smarties" y también en numerosos artículos y publicaciones de blog en Internet.
-
Enumeración de ruta (también conocida como ruta materializada) almacena una cadena en cada fila de la jerarquía para anotar la ruta de los ancestros de esa fila. Combina esto con
LIKE
consultas para comparar la cadena de ruta con las rutas de sus antepasados y las rutas de sus descendientes. -
Mesa de cierre (también conocido como Relación de cierre transitivo) usa una segunda tabla para almacenar todas las relaciones de antepasado-descendiente, no solo el padre inmediato como en el diseño que está usando. Muchos tipos de consultas se vuelven más fáciles una vez que tienes todas las rutas almacenadas.
-
Soluciones híbridas también existen. Por ejemplo, almacene la identificación principal inmediata como lo está haciendo, pero también la raíz del árbol. Ahora puede obtener todas las demás filas en la misma jerarquía, obtenerlas en el código de la aplicación y ordenar el árbol con estructuras de datos convencionales.