Mysql
 sql >> Database >  >> RDS >> Mysql

Calcola la profondità in un modello genitore-figlio in MySQL

Ciò dipende dall'effettiva implementazione della tua gerarchia nel database. Se si utilizza il modello di insiemi nidificati ( http://mikehillyer.com/articles/managing-hierarchical-data- in-mysql/ ) puoi recuperare il percorso completo da genitore a figlio tramite una singola selezione.

Aggiorna :Ok, dal momento che stai utilizzando il modello di elenco di adiacenza, suggerisco di memorizzare il livello del nodo nella tabella. Non solo ti darà la profondità del nodo in una query, ma ti consentirà anche di recuperare l'intero percorso di quel nodo in una query (sebbene quella query dovrebbe essere generata 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;

Dato che sai che il tuo nodo è al livello N, non c'è bisogno di join sinistro e, dati gli indici appropriati su id / parent_id, questo dovrebbe essere ragionevolmente veloce.
Lo svantaggio di questo approccio è che dovrai mantenere il livello del nodo aggiornato durante gli spostamenti dei nodi, ma dovrebbe essere ragionevolmente semplice e veloce poiché lo faresti solo per il nodo stesso e i suoi figli, non per la maggior parte della tabella come faresti con gli insiemi nidificati.