Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Sub-Tree Abfrage mit NestedSet Model (https://boardunity.de/sub-tree-abfrage-nestedset-model-t2938.html)

Nev 21.03.2005 09:48

Sub-Tree Abfrage mit NestedSet Model
 
Hi @ll

Ich verwende zum Speichern der Menu-Struktur NestedSet

Bis jetzt hab ich keine Probleme gehabt:
  • Einfügen
  • Bewegen
  • Gesamt Auslesen
  • Brotkrumen-Navigation
  • ...

Aber nun stehe ich vor einem grossen Problem!

Sagen wir, ich hab da ne Baumstruktur wie diese:

Code:

Stammverzeichnis
- Unterverzeichnis1
- - Unterunterverzeichnis1
- - - Datei 1
- - - Datei 2
- - - Datei 3
- - Unterunterverzeichnis2
- - - Datei 1
- - - Datei 2
- - - Datei 3
- - Unterunterverzeichnis3
- Unterverzeichnis2
- - Unterunterverzeichnis1
- - Unterunterverzeichnis2
- - Unterunterverzeichnis3
- - - Datei 1
- - - Datei 2
- - - Datei 3
- Unterverzeichnis3
- - Unterunterverzeichnis1
- - - Datei 1
- - - Datei 2
- - - Datei 3
- - Unterunterverzeichnis2
- - Unterunterverzeichnis3

Ich brauche jetzt aber, wie man es z.B. auch im Windows Explorer sehen kann, nicht den kompletten Verzeichnisbaum, sondern nur einen ganz bestimmten Teil, wie diesen hier:

Zb User ist auf Datei 2

Code:

Stammverzeichnis
- Unterverzeichnis1
- - Unterunterverzeichnis1
- - Unterunterverzeichnis2
- - - Datei 1
- - - Datei 2    <--
- - - Datei 3
- - Unterunterverzeichnis3
- Unterverzeichnis2
- Unterverzeichnis3

Wäre nett, wenn mir da jemand weiterhelfen könnte.

Gardan 21.03.2005 16:26

Ich sehe keinen Weg das zu bewerkstelligen :/

Nev 21.03.2005 16:33

Hi Gardan

Ich habe seit Do an einer Lösung gearbeitet und nix gefunden.
Durch Zufall hat ein Freund von mir (2ton3) einen Beitrag auf einen Beitrag (php4-forum.de) gefunden, der das Thema behandelt.

Der Lösungs Weg:
Von der gewählten ID, wird zuerst der direkte Weg zum Root ermittelt
und durch dieses Resultat kann dann ein Having-Klausel erstellt werden, die dann den Rest macht.

So kann man das Menu + Tree und BrotkrummenNavigation (YouAreHere // Vor-Sql) mit 2 Sqls abbilden.

Wenn gewünscht hänge ich die Front-End-Klasse an

Gardan 22.03.2005 01:57

Hmm mich würde mal interessieren wie schnell das ein gutes SQL Backend hin kriegt... insbesondere würde mich da die Komplexitätsklasse interessieren :)

Optimalerweise müsste man wohl auf left und right nen Index bauen, macht aber das Einfügen schon sehr teuer...

Nev 23.03.2005 02:43

Liste der Anhänge anzeigen (Anzahl: 1)
HI Garden

Sicher ist diese Art von Menü-Speicherung etwas aufwendiger als andere.

Aber wenn man sich das ganze genau überlegt, geht es nicht um die Speicherung, sondern um die Ausgabe.
Denn ich werde viel öfter das Menü Ausgeben müssen, als einen Menüpunkt hinzufügen oder sonst wie manipulieren.

Da nehme ich gerne die mehr Aktionen beim Bearbeiten in Kauf, als sie vorne zu haben.

Gardan 23.03.2005 14:56

Selbst die Ausgabe ist einigermaßen komplex meine ich :) Zumindest, für so kleine Menustrukturen lohnt es sich meiner Meinung nach nicht... schon eher vielleicht für Antworten in einem Topic, aber selbst da müssten es schon an die 100 sein damit es sich lohnt meine ich... weil zb bei 100 Stück da hab ich schnell mal id und parent id rausgeholt, in linearzeit O(n) die Struktur aufgebaut und kann dann selektiv die interessanten aus der Datenbank komplett rauspflücken...

Nev 23.03.2005 15:07

Hi @gain

Ich verwende das ganze für ein CMS
Generell gebe ich dir recht, wobei man immer Unterscheiden muss, welche Art von Navigation du hast.

Wenn du immer alle Menü-Punkt sichtbar hast, zB Ausklapp-Menü,
brauchst du genau 1 SQL für die Menü-erstellung

Wenn es ein Tree-Menü ist, welches die Haupt-Menü-Ebene und je nach Position in der Seite den Tree ausgibt, brauchst 2 Sql.

Der Aufwand steht sich in meinen Augen dafür.
In einem Forum würde ich es nicht verwenden, wobei möglich, da viel öfter ein Beitrag geschrieben wird, und so der Berechnungs-Aufwand (Linke und rechte ID) zu groß wäre.

Gardan 26.03.2005 03:08

Ich hab mal einiges drüber gelesen im www und ich würde dir raten zu erwägen einen zusätzlichen Depth-Wert zu speichern. Ansonsten ist die Struktur eigentlich ganz ok - nur eine Sache die mir fehlt: Wie lösch ich effizient mehrere Einträge auf einmal? :/

Nev 26.03.2005 09:02

HI Gardan

In meiner Stuktur wird das Level mitgespeichert, und muss nicht mehr berechnet werden.

Wie ich schon oben gesagt habe, ist das die Frontend-Klasse, da brauch ich nix manipulieren.

Wenn dich das Thema interessiert, lies dir den Artikel auf Develnet.org durch.
Auf Seite 4 (Manipulation der Baumstruktur) findest du die Möglichkeit, wie du löscht.

Gardan 26.03.2005 15:01

Ja, leider nur ein Blatt oder einen Teilbaum. Wenn ich aber eine beliebige Anzahl beliebiger Knoten löschen will wirds schwierig...

Nev 26.03.2005 15:08

Hi @gain

wird durch die verschiedenen Updates (Nachberechnung) schwer, würde sogar sagen, das das nur mit einer Schleife geht.

Darf ich wissen wofür du sowas brauchen würdest??

Gardan 26.03.2005 22:54

Wahrscheinlich wärs am einfachsten das ganze neu zu berechnen... muss ich mal suchen ob sich das einigermaßen schnell machen lässt...

Wofür? Nja ich bin immer noch sehr angetan von der Idee Topics auch Threaded darzustellen... trotz der großen visuellen und datenbanktechnischen Probleme :) Vielleicht is es auch gerade diese Herausforderung ;)

Jens* 02.04.2005 12:56

http://www.karlnelson.net/nestedlists/

keine Ahnung ob dir das hilft aber die Seite ist mir gerade beim surfen aufgefallen..

mfg
jens

Gardan 03.04.2005 01:29

Naja, wenn dann schon per XMLHttpRequest ;) Aber das Problem mit dem löschen vieler Einträge is immer noch da, genauso wie das Splitten in 2 getrennte Topics...

Nev 03.04.2005 10:01

@Gardan

Ich würde Nested Set nicht für ein Forum verwenden, dieses Model ist für Darstellungen gedacht die sich nicht sehr häufig ändern.

Bei einem Forum ist der Berechnungs-Aufwand zu groß

Gardan 03.04.2005 13:11

Andre Idee für Foren? Hab noch nix gefunden dazu leider... Preorder & Postorder zu speichern hätte den gleichen Effekt und die gleichen Nebenwirkungen :) Vielleicht reicht einfah Depth mit zu speichern... das würde immerhin schonmal vieles vereinfachen...

Nev 03.04.2005 23:38

Hi @gain

Ich überleg mir was, vielleicht fällt mir was nettes ein.

Bei Nested Set wirst um die neu berechnung ned hinweg kommen, egal ob du die Levels = Deeps mitspeicherst.
Dadurch wird nur die Ausgabe schneller, da sie ned mehr berechnet werden muss.

Gardan 04.04.2005 00:44

Jap, das is aber immerhin schonmal was weil dermaßen oft löscht man ja keine Postings...

Nev 04.04.2005 07:29

Hast du dir das Einfügen angeschaut??

Du rechnest alle Rechten Nachbarn nach.

Das kann ned gesund sein auf dauer *fg*

Gardan 04.04.2005 19:17

Nja... das ließe ich aber grade noch durchgehen :) Bloß das mit dem Löschen is der Killer... nur was gibts bessres? Google findet nix :)

Gardan 04.04.2005 20:03

Irgendwie scheints echt nix andres zu geben...
http://www.openwin.org/mike/presenta...erarchical.pdf


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25