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

Quali sono i modi noti per memorizzare una struttura ad albero in un DB relazionale?

Come sempre:non esiste una soluzione migliore. Ogni soluzione rende le cose diverse più facili o più difficili. La soluzione giusta per te dipende dall'operazione che farai di più.

Approccio ingenuo con ID genitore:

Pro:

  • Facile da implementare

  • È facile spostare un grande sottoalbero su un altro genitore

  • L'inserimento è economico

  • Campi necessari direttamente accessibili in SQL

Contro:

  • Recuperare un intero albero è ricorsivo e quindi costoso

  • Anche trovare tutti i genitori è costoso ( SQL non conosce le ricorsioni... )

Attraversamento dell'albero del preordine modificato (salvataggio di un punto iniziale e finale) :

Pro:

  • Recuperare un intero albero è facile ed economico

  • Trovare tutti i genitori è economico

  • Campi necessari direttamente accessibili in SQL

  • Bonus:stai salvando anche l'ordine dei childnodes all'interno del parentnode

Contro:

  • L'inserimento/l'aggiornamento può essere molto costoso, poiché forse dovrai aggiornare molti nodi

Salvataggio di un percorso in ciascun nodo:

Pro:

  • Trovare tutti i genitori è economico

  • Recuperare un intero albero è economico

  • L'inserimento è economico

Contro:

  • Spostare un intero albero è costoso

  • A seconda del modo in cui salvi il percorso, non sarai in grado di lavorarci direttamente in SQL, quindi dovrai sempre recuperarlo e analizzarlo, se vuoi cambiarlo.

Tabella di chiusura

Pro:

  • Facile da implementare

  • Trovare tutti i genitori è economico

  • L'inserimento è economico

  • Recuperare alberi interi è economico

Contro:

  • Ha bisogno di un tavolo aggiuntivo

  • Occupa molto spazio rispetto ad altri approcci

  • Spostare un sottoalbero è costoso

Preferirei uno degli ultimi due, a seconda della frequenza con cui i dati cambiano.

Vedi anche:http://media.pragprog.com/titles/bksqla/trees. pdf