Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Elementos anidados: ¿cómo expresar su jerarquía?

Estas en el tema de Elementos anidados: ¿cómo expresar su jerarquía? en el foro de Mysql en Foros del Web. Estoy armando una aplicación web en PHP y MySQL para organizar listas de tareas pendientes. Tengo una tabla MySQL donde cada fila representa una tarea. ...
  #1 (permalink)  
Antiguo 13/09/2011, 00:25
Avatar de DrFaust  
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Aires
Mensajes: 308
Antigüedad: 12 años, 7 meses
Puntos: 87
Elementos anidados: ¿cómo expresar su jerarquía?

Estoy armando una aplicación web en PHP y MySQL para organizar listas de tareas pendientes. Tengo una tabla MySQL donde cada fila representa una tarea.

Ahora bien, algunas tareas dependen de otras, que a su vez dependen de otras más. Por ejemplo, la tarea "hacer las compras" puede incluir las tareas "comprar comida" y "comprar artículos de limpieza", y cada una de ellas puede incluir sub-tareas como "comprar leche" y "comprar jabón".

Cada tarea (llamémosla "child") sólo puede depender de un único elemento superior (llamémoslo "parent"), así que estoy trabajando con un esquema de árbol común y corriente con una cantidad arbitraria de niveles.

Necesito saber cuántos children existen en total para un parent determinado, incluyendo elementos anidados. En otras palabras, la cantidad de sub-tareas que tiene una tarea determinada.

Mi primera opción fue averiguar en tiempo de ejecución cuántos children en total tiene el parent, utilizando bucles anidados, pero pienso que esto es muy poco eficiente.

Mi segunda opción fue mantener el mapa jerárquico de cada elemento en un campo de texto. Por ejemplo, si la tarea "comprar leche" depende de "comprar comida" (ID 99), y esta a su vez depende de "hacer las compras" (ID 77), que depende de "quehaceres importantes" (ID 55), el mapa jerárquico se ve así:

"55" "77" "99"

Así, puedo buscar fácilmente cuántos elementos incluyen la ID de un parent determinado en su mapa jerárquico.

Ahora bien, estoy seguro de que existen formas mil veces más eficientes de implementar algo así. No estoy seguro de qué tengo que buscar en Google para instruirme, así que les pido que me tiren un cable.

Desde ya, muchísimas gracias.
  #2 (permalink)  
Antiguo 13/09/2011, 01:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Elementos anidados: ¿cómo expresar su jerarquía?

DrFaust, mira aquí:
http://mysql.lamphost.net/tech-resou...ical-data.html
y verás el modo de trabajar con tablas jerárquicas
  #3 (permalink)  
Antiguo 13/09/2011, 01:45
Avatar de DrFaust  
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Aires
Mensajes: 308
Antigüedad: 12 años, 7 meses
Puntos: 87
Respuesta: Elementos anidados: ¿cómo expresar su jerarquía?

jurena, muchísimas gracias por el link. No sólo la información resultó muy útil, sino que me permitió encontrar más artículos sobre el tema ("mysql hierarchical data") en Google.

Al final resultó que por accidente implementé una de las soluciones más elegantes para el problema que tenía (aparentemente se llama "lineage model"), pero aprendí varias cosas sobre su implementación que no resultan obvias a primera vista. En particular, el linaje puede representarse así:

/000055/000077/000099/

La ventaja es que esa estructura puede además utilizarse para ordenar los elementos de una forma muy elegante, utilizando un simple ORDER BY:

/000055/
/000055/000077/
/000055/000077/000099/
/000055/000077/000100/
/000055/000078/
/000056/
/000056/000079/
/000056/000080/

Última edición por DrFaust; 13/09/2011 a las 02:08
  #4 (permalink)  
Antiguo 14/09/2011, 08:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Elementos anidados: ¿cómo expresar su jerarquía?

Gracias a ti, DrFaust,
pues yo desconocía ese "lineage model", y siempre es bueno tener otra opción.

Gracias a ti, pues.

Etiquetas: anidados, elementos, php, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:18.