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

righe di alberi sql complesse

Esistono diverse alternative per semplificare l'utilizzo delle informazioni gerarchiche in SQL:

  • Espressioni di tabelle comuni (secondo lo standard SQL-2003) supporta query SQL ricorsive rispetto al tipo di dati parent-id che stai utilizzando. Finora, MySQL non supporta questa funzione. PostgreSQL 8.4, Microsoft SQL Server e IBM DB2 sono esempi di marchi RDBMS che supportano la sintassi CTE. Oracle ha anche un'estensione proprietaria alla sintassi SQL che supporta le query ricorsive.

  • Set nidificati (la soluzione sinistra/destra menzionata da @phantombrain) è una soluzione dettagliata nel libro di Joe Celko "Trees and Hierarchies in SQL for Smarties" e anche in numerosi articoli e post di blog su Internet.

  • Enumerazione del percorso (aka Materialized Path) memorizza una stringa in ogni riga nella gerarchia per annotare il percorso degli antenati di quella riga. Combina questo con LIKE query per confrontare la stringa del percorso con i percorsi dei suoi antenati e dei suoi discendenti.

  • Tabella di chiusura (aka Transitive Closure Relation) usa una seconda tabella per memorizzare tutte le relazioni antenato-discendente, non solo il genitore immediato come nel progetto che stai usando. Molti tipi di query diventano più semplici una volta archiviati tutti i percorsi.

  • Soluzioni ibride esistono anche. Ad esempio, memorizza l'ID genitore immediato come stai facendo, ma anche la radice dell'albero. Ora puoi ottenere tutte le altre righe nella stessa gerarchia, recuperarle nel codice dell'applicazione e ordinare l'albero con strutture di dati convenzionali.