Como siempre:no hay mejor solución. Cada solución hace cosas diferentes más fáciles o más difíciles. La solución adecuada para usted depende de la operación que vaya a realizar más.
Enfoque ingenuo con parent-id:
Ventajas:
-
Fácil de implementar
-
Fácil de mover un subárbol grande a otro padre
-
Insertar es barato
-
Campos necesarios accesibles directamente en SQL
Contras:
-
Recuperar un árbol completo es recursivo y, por lo tanto, costoso
-
Encontrar todos los padres también es costoso (SQL no conoce recursiones...)
Recorrido de árbol de pedido anticipado modificado (guardando un punto de inicio y final):
Ventajas:
-
Recuperar un árbol completo es fácil y económico
-
Encontrar a todos los padres es barato
-
Campos necesarios accesibles directamente en SQL
-
Bonificación:también está guardando el orden de los nodos secundarios dentro de su nodo principal
Contras:
- La inserción/actualización puede ser muy costosa, ya que quizás deba actualizar muchos nodos
Guardar una ruta en cada Nodo:
Ventajas:
-
Encontrar a todos los padres es barato
-
Recuperar un árbol entero es barato
-
Insertar es barato
Contras:
-
Mover un árbol entero es caro
-
Dependiendo de la forma en que guarde la ruta, no podrá trabajar con ella directamente en SQL, por lo que siempre tendrá que buscarla y analizarla si desea cambiarla.
Mesa de cierre
Ventajas:
-
Fácil de implementar
-
Encontrar a todos los padres es barato
-
Insertar es barato
-
Recuperar árboles enteros es barato
Contras:
-
Necesita una mesa adicional
-
Ocupa mucho espacio en comparación con otros enfoques
-
Mover un subárbol es costoso
Preferiría uno de los dos últimos, dependiendo de la frecuencia con la que cambien los datos.
Consulte también:http://media.pragprog.com/titles/bksqla/trees. pdf