Il design dei set nidificati è decisamente difficile quando è necessario apportare frequenti aggiornamenti all'albero. Finisci per dover rinumerare grandi parti dell'albero.
Un suggerimento per mitigare questo è usare numeri a virgola mobile invece di numeri interi. Se inserisci un nuovo nodo nell'albero, è relativamente facile trovare alcuni numeri FLOAT tra i numeri del set nidificato del genitore del nuovo nodo. Alla fine potresti arrivare ai limiti della precisione di un numero in virgola mobile, ma poiché il tuo albero non è molto profondo, ciò non accadrà per molto tempo.
Un'altra tecnica di cui ho scritto la chiamo Tabella di chiusura . Questo metodo di archiviazione delle gerarchie rende molto più semplice inserire/aggiornare/eliminare nodi in un albero di grandi dimensioni senza dover aggiornare molto del tuo albero. E puoi ancora interrogare l'intero albero o qualsiasi sottoalbero in una singola query SQL non ricorsiva.
Per ulteriori informazioni sulla tabella di chiusura, vedere:
- Qual è il modo più efficiente/elegante per trasformare un tavolo piatto in un albero?
- Modelli per dati gerarchici con SQL e PHP
- Spostamento di sottoalberi nelle gerarchie di tabelle di chiusura
- SQL Antipatterns:evitare le insidie della programmazione di database
Re il tuo commento:
Adjacency List è semplice, ha un minimo di ridondanza e supporta le relazioni FK, cosa che i Nested Sets non fanno. L'elenco di adiacenza supporta l'esecuzione di query su un intero albero di profondità arbitraria se si utilizzano query ricorsive . Ma MySQL non supporta le query ricorsive.
Se hai bisogno di interrogare solo le relazioni genitore-figlio immediate (cioè un livello di profondità), o altrimenti interrogare solo alberi di profondità fissa, allora l'elenco di adiacenza va bene.