sql >> Base de Datos >  >> RDS >> Mysql

Recuperando datos con una estructura jerárquica en MySQL

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 .