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

Raggiungere la gerarchia, la relazione genitore/figlio in modo efficace e semplice

Sfortunatamente, se non puoi modificare il modello di dati e stai utilizzando MySQL, sei bloccato in una situazione in cui hai bisogno di query ricorsive e stai utilizzando un DBMS che non supporta le query ricorsive.

Quassnoi ha scritto un'interessante serie di articoli sul blog, mostrando le tecniche per interrogare i dati gerarchici. Le sue soluzioni sono abbastanza intelligenti, ma molto complesse.http:// spiegareextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL è un altro RDBMS open source, che supporta le query ricorsive , in modo da poter recuperare un intero albero memorizzato nel modo in cui lo mostri. Ma se non puoi cambiare il modello di dati, suppongo che non puoi passare a un RDBMS diverso.

Esistono diversi modelli di dati alternativi che rendono molto più facile recuperare alberi arbitrariamente profondi:

  • Tabella di chiusura
  • Set nidificati, noti anche come traversata dell'albero dei preordini modificati
  • Enumerazione del percorso, nota anche come percorso materializzato

Li tratterò nella mia presentazione Modelli per dati gerarchici con SQL e PHP e nel mio libro SQL Antipatterns:evitare le insidie ​​della programmazione di database .

Infine, c'è un'altra soluzione che ho visto usata nel codice per Slashdot , per le gerarchie dei commenti:memorizzano "parent_id" come in Adjacency List, ma memorizzano anche una colonna "root_id". Ogni membro di un dato albero ha lo stesso valore per root_id, che è il nodo antenato più alto nel suo albero. Quindi è facile recuperare un intero albero in una query:

SELECT * FROM site WHERE root_id = 123;

Quindi la tua applicazione recupera tutti i nodi dal database in un array e devi scrivere il codice per eseguire il loop su questo array, inserendo i nodi in una struttura di dati ad albero in memoria. Questa è una buona soluzione se hai molti alberi separati e ogni albero ha relativamente poche voci. Va bene per il caso di Slashdot.