MySQL carece de consultas recursivas, que son parte de SQL estándar. Muchas otras marcas de bases de datos admiten esta función, incluido PostgreSQL (consulte http://www.postgresql.org/docs/8.4/static/queries-with.html ).
Hay varias técnicas para manejar datos jerárquicos en MySQL.
- Lo más simple sería agregar una columna para anotar la jerarquía a la que pertenece una foto determinada. Luego puede buscar las fotos que pertenecen a la misma jerarquía, recuperarlas todas en su aplicación y descubrir las que necesita allí. Esto es un desperdicio en términos de ancho de banda, requiere que escriba más código de aplicación y no es bueno si sus árboles tienen muchos nodos.
También hay algunas técnicas inteligentes para almacenar datos jerárquicos para que pueda consultarlos:
-
Enumeración de ruta almacena la lista de antepasados con cada nodo. Por ejemplo, la foto 5 en su ejemplo almacenaría "0-2-4-5". Puede buscar antepasados buscando nodos cuya ruta concatenada con "%" coincida con la ruta de 5 con
LIKE
predicado. -
Conjuntos anidados es una técnica compleja pero inteligente popularizada por Joe Celko en sus artículos y en su libro "Trees and Hierarchical in SQL for Smarties". También hay numerosos blogs y artículos en línea al respecto. Es fácil consultar árboles, pero difícil consultar hijos o padres inmediatos y difícil insertar o eliminar nodos.
-
Mesa de cierre implica almacenar cada relación de antepasado/descendiente en una tabla separada. Es fácil consultar árboles, fácil de insertar y eliminar, y fácil de consultar padres o hijos inmediatos si agrega una longitud de ruta columna.
Puede ver más información comparando estos métodos en mi presentación Practical Object -Modelos Orientados en SQL o mi próximo libro Antipatrones SQL:Cómo evitar las trampas de la programación de bases de datos .