Artikel in DB-> Nested Sets

fungo

Erfahrenes Mitglied
Mein ihr es lohnt sich Artikel in einer DB mit Hilfe von Nested Sets abzuspeichern, anstatt es über den alten, manchmal kritischen Weg der Rekusionen bei auslesen zu machen, was ich mir dann erspare.
 
Nun nested sets is auf jedenfall der schnellere weg, was performance betrifft, nur leider sind die SQL queries halt ziemlisch kompliziert...

Parent model hatt gegenüber nestes sets einen geschwindigkeitsvorteil von faktor 300 oder so... müsst ich nachlesen...
path model is aber auch net viel besser als parent.. von daher...

Naja wie gesagt, musst du selbst entscheiden was dir wichtiger is... gute performance oder einfache SQL queries beim programmieren.
 
Original geschrieben von chibisuke
Nun nested sets is auf jedenfall der schnellere weg, was performance betrifft, nur leider sind die SQL queries halt ziemlisch kompliziert...

Parent model hatt gegenüber nestes sets einen geschwindigkeitsvorteil von faktor 300 oder so... müsst ich nachlesen...
path model is aber auch net viel besser als parent.. von daher...

Naja wie gesagt, musst du selbst entscheiden was dir wichtiger is... gute performance oder einfache SQL queries beim programmieren.

Tut mir leid, das ist nur halbrichtig!
Jedesmal, wenn man einen Artikel in die Datenbank schreibt verändern sich sämtliche Datensätze. Das ist langsam. Viel zu langsam!
Wenn aber nur selten geschrieben und viel gelesen wird sind NestedSets ungleich schneller!
 
path und parrent sind 2 weitere modelle für das speichern von tree strukturen in datensatzbasierten datenbanken..

Nested Sets eigenet sich ideal für foren, da der geschwindigkeitsvorteil beim lesen den nachteil beim schreiben bei weitem aufwiegt.

Path funktioniert so das ein eintrag existiert wo die verschachtelung anhand der datensatz ID geordnet wird...
z.B.
1 ist die wurzel
1-2 is der erste subtree
1-3 is n weiterer subtree
1-2-7 is ein zweig von 1-2 und so weiter...

und beim parrent modell ist in einem feld immer die ID des übergeordneten gespeichert, nur ist hier beim lesen eine extrem hohe rekursion und damit unnötiger traffic erforderlich, was sich nachteilig auf die performance auswirkt....


Im PHP magazin war vor einiger zeit ein artikel wo ein vergleich drin is...
zuerst wurden die nachfahren des knotens 1 ermittelt.
Parrent und Path is dabei glatt durchgefallen, zeitfaktor 31 bzw. 27 vom nested sets modell. (Im vergleich, 1.217 sek bei parrent, 0.039sek bei nested sets.

der 2. test, die vorfahren von knoten ermitteln. hier ist nested sets um den faktor 2,5 langsamer gewesen (Im vergleich, parrent hier der schnellste, 0.002 sek, nested sets 0.005 sek)

der 3. test soll alle knoten der ersten ebene und die anzahl der nachfahren ermitteln... und hier rasselt parrent entgültig raus...35.275sek, im vergleich nested sets. 0.002 sek

was das schreiben betrifftz so ist nested sets aufgrund der architektur geringfügig langsamer als parrent oder path, aber da sich alles mit einer query erledigen läst hatt man keine performence nachteil dadurch. Dazu kann man die querry assynchron absetzen und so verhindern das man auf ein ergebnis warten muss das nicht existiert.
 
aber mit nested sets bekommt man doch probleme, wenn zum beispiel zwei user gleichzeitig posten, dann sind doch die werte durcheinander oder?

Kannst du mir vielleicht mal ein Forenbeispiel zeigen oder kurz erläutern, ich hänge nämlich zur zeit ein wenig.
 
Original geschrieben von fungo
aber mit nested sets bekommt man doch probleme, wenn zum beispiel zwei user gleichzeitig posten, dann sind doch die werte durcheinander oder?

Kannst du mir vielleicht mal ein Forenbeispiel zeigen oder kurz erläutern, ich hänge nämlich zur zeit ein wenig.

Das ist richtig, wenn zwei Datenänderungen gleichzeitig vorgenommen werden kann das Chaos geben. Deshalb wird die Tabelle vorher meistens gelockt!
Forenbeispiel? Benutzt die NestedSet-Klasse von F.o.G., damit ist das ganze ein Kinderspiel! :)
 
Original geschrieben von fungo
aber mit nested sets bekommt man doch probleme, wenn zum beispiel zwei user gleichzeitig posten, dann sind doch die werte durcheinander oder?

Kannst du mir vielleicht mal ein Forenbeispiel zeigen oder kurz erläutern, ich hänge nämlich zur zeit ein wenig.

Nein es kommt nicht zu datenchaos und zwar deshalb weil die query normalweitese nacheinander abgearbeitet werden, aber wenn du auf nummer sicher gehen willst dann mach vorher ein LOCK TABLE und nacher ein UNLOCK TABLE und schon is das problem gelöst...

beispiele? guck dir mal die PEAR klasse zu nested sets an... http://pear.php.net/package/DB_NestedSet

das sollte dir eigendlich einen einblick geben wie sowas funktioniert...
 
blöde Frage, aber welche Klasse ist einfacher zu benutzen, die von F.O.G oder die PEAR ? :-

Aufbau der DB ist dann ein Tabelle mit Nested Set Struktur für die Topics und eine weitere für die Posts oder?
 
Zurück