Jannick hat geschrieben:SQL kann keine Rekursion, da gibt es auch keine DB-Struktur.
Voelliger quatsch. Du kannst entweder das Adjacency List Model oder das Nested Set Model verwenden, womit du hierarchien abbilden kannst. Rekursionen bekommst du mit self-joins hin. Adjacency List Model ist einfacher zu handhaben, Nested Set Model ist allerdings beim lesezugriff schneller und flexibler.
ich beziehe mich hier auf das nested set model, damit kannst du:
- von jeder stelle aus mit einer einfachgen abfrage den pfad zurueck zu root rausbekommen
- weisst bei jedem element wieviele nodes darin enthalten sind
- eine liste aller in x enthaltenen nodes auslesen
- weisst bei jedem eintrag ob es untergeordnete elemente hat oder nicht (letztes element im zweig)
- beliebig in alle richtungen erweiterbar ohne das du was an der db-struktur aendern musst
https://dev.mysql.com/tech-resources/ar ... -data.html => ctrl+f "The Nested Set Model".
die beispiele und abfragen auf der seite sind allerdings falsch, statt "GROUP BY node.name" sollte es immer "GROUP BY node.id" heissen sonst bekommst du probleme wenn ein name doppelt vergeben ist.
ich habs hier vor einiger zeit umgesetzt um plaetze in eine datenbank zu speichern. Plaetze koennen bei mir entweder Laender, Regionen, Stadte, Strassen oder Hausnummern sein.
Am besten an der sache ist natuerlich das man nur ein feld abfragen muss wenn man was sucht, und keine konstrukte wie "where country=test OR region=test OR city=test" bauen muss und trotzdem noch die abfrage einschraenken kann und z.b. nur plaetze aus Schweden, oder nur stadte, oder nur Stadte mit mehr als 10 strassen in betracht ziehen kann.
noch ein tipp:
wenn du mehr als 1000 zeilen in deiner DB hast solltest du werte wie "tiefe" (entfernung zu root) und pfad (textdarstellung des weges zu root : Welt::Italien::Rom) noch mit in deiner tabelle Cachen - ansosnten bekommst du schnell performance probleme wenn du ein grosses set hast und von mehreren hundert plaetzen nur die "Stadte" haben willst oder den erwaehnen pfad zu root brauchst.
Klingt toll, ist es auch nachdem man sich eine klasse oder mysql-funktionen geschrieben hat die es erlauben diese werte pflegeleicht in der db zu speichern, umzusortieren und zu loeschen
