Buone panoramiche
In generale, stai prendendo una decisione tra tempi di lettura rapidi (ad esempio, set nidificato) o tempi di scrittura rapidi (elenco di adiacenza). Di solito, si finisce con una combinazione delle opzioni di seguito che meglio si adattano alle proprie esigenze. Di seguito vengono fornite alcune letture approfondite:
- Ancora un confronto tra Intervalli nidificati e Elenco adiacenza : il miglior confronto tra Elenco adiacenza, Percorso materializzato, Set nidificato e Intervallo nidificato che ho trovato.
- Modelli per dati gerarchici : diapositive con buone spiegazioni di compromessi e esempi di utilizzo
- Rappresentare le gerarchie in MySQL : in particolare un'ottima panoramica di Nested Set
- Dati gerarchici negli RDBMS : set di collegamenti più completo e ben organizzato che ho visto, ma non molto in termini di spiegazione
Opzioni
Quelli di cui sono a conoscenza e caratteristiche generali:
- Elenco di adiacenza :
- Colonne: ID, ParentID
- Facile da implementare.
- Spostamenti, inserimenti ed eliminazioni di nodi economici.
- Costoso per trovare il livello, gli antenati e i discendenti, il percorso
- Evita N + 1 tramite espressioni di tabella comuni nei database che le supportano
- Set nidificato (aka Traversal Tree Preorder modificato )
- Colonne: sinistra, destra
- Antenati economici, discendenti
- Spostamenti
O(n/2)
, inserimenti, eliminazioni molto costosi a causa della codifica volatile
- Bridge Table (aka Closure Table / w trigger )
- Utilizza una tabella di join separata con: antenato, discendente, profondità (opzionale)
- Antenati e discendenti economici
- Scrive i costi
O(log n)
(dimensioni della sottostruttura) per inserimenti, aggiornamenti, eliminazioni - Codifica normalizzata: buona per statistiche RDBMS e pianificatore di query nei join
- Richiede più righe per nodo
- Colonna di lignaggio (aka Path Materialized , Path Enumeration)
- Colonna: lignaggio (ad es. / Genitore / figlio / nipote / ecc ...)
- Discendenti economici tramite query prefisso (ad es.
LEFT(lineage, #) = '/enumerated/path'
) - Scrive i costi
O(log n)
(dimensioni della sottostruttura) per inserimenti, aggiornamenti, eliminazioni - Non relazionale: si basa sul tipo di dati array o sul formato stringa serializzato
- Intervalli nidificati
- Come set nidificato, ma con real / float / decimal in modo che la codifica non sia volatile (spostamento / inserimento / eliminazione economico)
- Ha problemi di rappresentazione / precisione decimale / float / decimale
- La variante di codifica Matrix aggiunge la codifica degli antenati (percorso materializzato) per "libero", ma con una maggiore delicatezza dell'algebra lineare.
- Tavolo piatto
- Un elenco di adiacenza modificato che aggiunge una colonna Level e Rank (ad es. Ordinamento) a ciascun record.
- Economico per iterare / impaginare
- Spostamento ed eliminazione costosi
- Buon uso: discussione discussione - forum / commenti sul blog
- Più colonne di lignaggio
- Colonne: una per ogni livello di lignaggio, si riferisce a tutti i genitori fino alla radice, i livelli inferiori dal livello dell'elemento sono impostati su NULL
- Antenati economici, discendenti, livello
- Inserimento economico, cancellazione, spostamento delle foglie
- Inserimento, eliminazione, spostamento costosi dei nodi interni
- Difficile limite alla profondità della gerarchia
Note specifiche sul database
MySQL
Oracolo
- Utilizzare CONNECT BY per attraversare gli elenchi di adiacenza
PostgreSQL
- Tipo di dati ltree per percorso materializzato
server SQL
- Riepilogo generale
- Il 2008 offre HierarchyId il tipo di dati sembra aiutare con l'approccio Colonna Lignea ed espandere la profondità che può essere rappresentata.
Closure Tables
sono superiori aAdjacency List
,Path Enumeration
eNested Sets
in termini di facilità d'uso (e sto cercando di indovinare le prestazioni pure).