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

Calcule la profundidad en un modelo padre-hijo en MySQL

Eso depende de la implementación real de su jerarquía en la base de datos. Si está utilizando el modelo de conjuntos anidados ( http://mikehillyer.com/articles/managing-hierarchical-data- en mysql/ ) puede recuperar la ruta principal a secundaria completa a través de una sola selección.

Actualizar :Ok, ya que va con el modelo de lista de adyacencia, sugiero almacenar el nivel de nodo en la tabla. No solo le dará la profundidad del nodo en una consulta, sino que también le permitirá recuperar la ruta completa a ese nodo en una consulta (aunque esa consulta tendría que generarse dinámicamente):

SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
  FROM nodes AS n1
  JOIN nodes AS n2 ON n2.parent_id = n1.id
  JOIN nodes AS n3 ON n3.parent_id = n2.id
  ...
  JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;

Dado que sabe que su nodo está en el nivel N, no hay necesidad de uniones a la izquierda y, dados los índices apropiados en id / parent_id, esto debería ser razonablemente rápido.
La desventaja de este enfoque es que tendrá que mantener el nivel del nodo actualizado durante los movimientos de nodos, pero eso debería ser razonablemente sencillo y rápido, ya que solo lo haría para el nodo en sí y sus elementos secundarios, no para la mayoría de la tabla como lo haría con conjuntos anidados.