2015-07-26 21 views
11

Ci sono two ways to work with hierarchy data in MySQL:Adjacency List Modello vs Nested Set Model per i dati gerarchici di MySQL?

  1. lista di adiacenza Modello
  2. Nested Set Modello

Uno dei problemi principali del lista di adiacenza modello è che abbiamo bisogno di eseguire una query per ogni nodo per ottenere il percorso della gerarchia.

Nel Nested Set Modello questo problema non esiste, ma per ogni nodo aggiunto è necessario dare un UPDATE MySQL su tutti gli altri lasciati e destra valore.

I miei dati gerarchici non sono dati statici, come le categorie di prodotti dell'e-commerce. Sono la registrazione costante degli utenti in sequenza gerarchica.

Nella mia applicazione, mentre ci sono molte costanti di registrazione degli utenti, devo anche ottenere il percorso gerarchico fino a raggiungere il primo nodo nella gerarchia.

Analizzando la mia situazione, quale delle due alternative sarebbe la migliore per la mia applicazione?

risposta

16

Il modello di set nidificato non è attualmente utilizzato comunemente nei database, poiché è più complesso del modello di lista di adiacenza, dato che richiede la gestione di due "puntatori" anziché di uno singolo. In realtà, il modello di set nidificato è stato introdotto nei database quando era complesso o impossibile eseguire query ricorsive che attraversavano una gerarchia.

Dal 1999, SQL standard includono il cosiddetto ricorsivo Common Table Expressions, o CTE ricorsiva, che rende più semplice (e standardizzato!) Per effettuare le query che attraversano percorso ricorsiva all'interno di una gerarchia con qualsiasi numero di livelli.

Tutti i principali sistemi DBMS ora includono questa funzione, con un'eccezione in particolare: MySQL. Ma in MySQL è possibile superare questo problema con l'uso di stored procedure. Vedere, ad esempio, this post on StackOverflow o this post on dba.stackexchange.

Così, in sintesi, questi sono i miei consigli:

  1. Se è ancora possibile decidere quale DBMS uso, prendere in seria considerazione alcune alternative: per esempio, se si vuole attaccare con un database open source, utilizzare PostgreSQL , usa il modello di lista di adiacenza e vai con CTE ricorsive per le tue domande.
  2. Se non è possibile modificare il DBMS, è comunque necessario attenersi al modello di lista di adiacenza e utilizzare le stored procedure come quelle citate nei riferimenti.

UPDATE

Questa situazione sta cambiando con MySQL 8, che è attualmente in sviluppo e che will integrate Recursive CTEs, in modo che da tale versione del set modello nidificato sarà più semplice da usare.

+0

Per quello che vale, MySQL 8, attualmente in fase di sviluppo, avrà il supporto per le query CTE ricorsive. –

+0

@BillKarwin, grazie mille per l'informazione, ho aggiornato la risposta. – Renzo