Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Calcular profundidade em um modelo pai-filho no MySQL


Isso depende da implementação real de sua hierarquia no banco de dados. Se você estiver usando o modelo de conjuntos aninhados ( http://mikehillyer.com/articles/managing-hierarchical-data- in-mysql/ ), você pode recuperar o caminho completo de pai para filho por meio de uma única seleção.

Atualizar :Ok, já que você está usando o modelo de lista de adjacência, sugiro armazenar o nível do nó na tabela. Ele não apenas fornecerá a profundidade do nó em uma consulta, mas também permitirá que você recupere todo o caminho para esse nó em uma consulta (embora essa consulta precise ser gerada dinamicamente):
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;

Como você sabe que seu nó está no nível N, não há necessidade de junções à esquerda e, dados os índices apropriados em id / parent_id, isso deve ser razoavelmente rápido.
A desvantagem dessa abordagem é que você terá que manter o nível do nó atualizado durante as movimentações do nó, mas isso deve ser razoavelmente simples e rápido, pois você só faria isso para o próprio nó e seus filhos - não para a maioria da tabela, como faria com conjuntos aninhados.