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

¿Cuáles son las formas conocidas de almacenar una estructura de árbol en una base de datos relacional?

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