Multi-Level Menüstruktur

Multi-Level Menüstruktur

am 04.10.2006 12:16:31 von mmollay

Hi Mysql-Meister,

Ich habe eine Menüstruktur in einer Db gespeichert.


Bsp.:
Menütext1 ($id =3D 1, $id_parend =3D 0)
Menütext2 ($id =3D 1, $id_parend =3D 0)
|--Menütext3 ($id =3D 2, $id_parend =3D 1)
|--Menütext4 ($id =3D 3, $id_parend =3D 1)
|--Menütext5 ($id =3D 4, $id_parend =3D 1)
| |--Menütext5 ($id =3D 5, $id_parend =3D 4)
| '--Menütext5 ($id =3D 6, $id_parend =3D 4)
'--Menütext5 ($id =3D 7, $id_parend =3D 1)


Nun war es bislang so, dass ich eine Funktion geschrieben habe, die
sich selbst solange aufgerufen hat, bis alles Ebenen und Felder durch
waren.
Das funktioniert ja auch soweit, allerdings habe ich mir überlegt ob
das nicht mit einer einfachen mysql-Abfrage zu realisieren ist?!

Danke für einen Hinweis und Eure Hilfe!!

mm°^°

Re: Multi-Level Menüstruktur

am 04.10.2006 13:40:59 von Wolfgang Kueter

mmollay wrote:

> [Rekursive Queries]
> Das funktioniert ja auch soweit, allerdings habe ich mir überlegt ob
> das nicht mit einer einfachen mysql-Abfrage zu realisieren ist?!

Beschäftige Dich mit 'nested sets'

http://kris.koehntopp.de/artikel/sql-self-references/
http://www.develnet.org/39.html
http://www.php-resource.de/tutorials/read/21/1/
http://www.klempert.de/nested_sets/

Wolfgang

Re: Multi-Level Menüstruktur

am 04.10.2006 16:13:39 von Martin Kaffanke

Am Wed, 04 Oct 2006 13:40:59 +0200 schrieb Wolfgang Kueter:

> mmollay wrote:
>
>> [Rekursive Queries]
>> Das funktioniert ja auch soweit, allerdings habe ich mir überlegt ob
>> das nicht mit einer einfachen mysql-Abfrage zu realisieren ist?!
>
> Beschäftige Dich mit 'nested sets'

Das hab ich mal gemacht, aber ich weiß nicht, ist nicht wirklich einfach
zu maintainen. Dadurch wird die Tabelle leider eine so geschlossene
Einheit, dass man keine einfachen Inserts und deletes mehr machen kann, es
müssen immer die lefts und rights angepasst werden.

Bei einem neuen Projekt würde ich das nicht mehr machen.

lg,
Martin

Re: Multi-Level Menüstruktur

am 04.10.2006 16:32:24 von Dominik Echterbruch

Martin Kaffanke wrote:
>>
>>>[Rekursive Queries]
>>>Das funktioniert ja auch soweit, allerdings habe ich mir überlegt ob
>>>das nicht mit einer einfachen mysql-Abfrage zu realisieren ist?!
>>
>>Beschäftige Dich mit 'nested sets'
>
> Das hab ich mal gemacht, aber ich weiß nicht, ist nicht wirklich einfach
> zu maintainen. Dadurch wird die Tabelle leider eine so geschlossene
> Einheit, dass man keine einfachen Inserts und deletes mehr machen kann, es
> müssen immer die lefts und rights angepasst werden.

Für solche Aufgaben kann man einfache Funktionen bauen, die sich genau
darum kümmern. Und wenn man Nested Sets mal _verstanden_ hat, sind sie
auch nicht mehr kompliziert.

Und ganz nebenbei: Es ist vollkommen wurscht, wie kompliziert dir das
vorkommt. Wenn es die passende (aka. schnelle und saubere) Lösung für
dein Problem ist, solltest du deine eigenen Gefühle aus dem Spiel lassen
und es der DB und deiner Anwendung nicht unnötig schwer machen.

Ein Hinweis am Rande noch: Nested Sets sind nicht immer die beste Lösung
für Bäume, aber sehr oft. Sie lohnen sich in dem Moment, wo etwa doppelt
so häufig gelesen, wie geschrieben wird (wobei schreiben hier eine
Änderung der Struktur impliziert; normale Updates sind bei der
Betrachtung zu ignorieren).
Ideal sind sie also, für Foren, Artikelstammdaten und dergleichen.


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Multi-Level Menüstruktur

am 04.10.2006 19:49:34 von Martin Kaffanke

Am Wed, 04 Oct 2006 16:32:24 +0200 schrieb Dominik Echterbruch:

> Für solche Aufgaben kann man einfache Funktionen bauen, die sich genau
> darum kümmern. Und wenn man Nested Sets mal _verstanden_ hat, sind sie
> auch nicht mehr kompliziert.

So hab ich das auch gemacht. Allerdings habe ich mir angewöhnt immer
einen SQL Client auch am laufen zu haben, zur Zeit der mysql-query-browser
(gnome). Dort kann man bei Nested sets nicht so einfach mal ein DELETE
from Menu where ID=42 machen, weil man sich damit das Dings kaput macht.

Vielleicht kann man sich aber sowas mit stored procedures bauen, da weiß
ich nicht wie weit das mysql unterstützt.

> Und ganz nebenbei: Es ist vollkommen wurscht, wie kompliziert dir das
> vorkommt. Wenn es die passende (aka. schnelle und saubere) Lösung für
> dein Problem ist, solltest du deine eigenen Gefühle aus dem Spiel lassen
> und es der DB und deiner Anwendung nicht unnötig schwer machen.

Naja, ich habe mir einfach eine Klasse geschrieben die dann halt eine add
und delete methode hat, sowie move methoden um Einträge einfach zu
verschieben. Dennoch bleibt die Tabelle für meinen SQL Client irgendwie
Tabu, weil ich dort nicht auswendig die SQL Queries habe, um mal ein
fälschlicher weise eingefügtes Item mal schnell zu löschen, ohne wieder
eine Funktion in der Applikation schreiben zu müssen.

> Ein Hinweis am Rande noch: Nested Sets sind nicht immer die beste Lösung
> für Bäume, aber sehr oft. Sie lohnen sich in dem Moment, wo etwa doppelt
> so häufig gelesen, wie geschrieben wird

Diesen Anforderungen zufolge wäre ein Menü einer Webseite, welches vom
Admin verändert werden kann eine sehr gutes Beispiel. Dennoch würde ich
nächstes mal doch lieber auf eine Struktur ala:

ID
ParentID
Position

zurückgreifen, weil hier ein einfaches delete usw. ausreicht. (Die
Position für die leichte Wartung in 10er schritten, weil man hier einfach
was einfügen kann, dem ORDER BY ist dies egal und die Applikation wirds
beim nächsten Admin-Eintrag über die Webseite wieder richtig stellen.)

lg,
Martin

Re: Multi-Level Menüstruktur

am 04.10.2006 21:16:20 von Dominik Echterbruch

Martin Kaffanke wrote:
>
>>Für solche Aufgaben kann man einfache Funktionen bauen, die sich genau
>>darum kümmern. Und wenn man Nested Sets mal _verstanden_ hat, sind sie
>>auch nicht mehr kompliziert.
>
> So hab ich das auch gemacht. Allerdings habe ich mir angewöhnt immer
> einen SQL Client auch am laufen zu haben, zur Zeit der mysql-query-browser

Das ist immer eine gute Idee :)

> Vielleicht kann man sich aber sowas mit stored procedures bauen, da weiß
> ich nicht wie weit das mysql unterstützt.

Mittlerweile ganz ordentlich.

>>Ein Hinweis am Rande noch: Nested Sets sind nicht immer die beste Lösung
>>für Bäume, aber sehr oft. Sie lohnen sich in dem Moment, wo etwa doppelt
>>so häufig gelesen, wie geschrieben wird
>
> Diesen Anforderungen zufolge wäre ein Menü einer Webseite, welches vom
> Admin verändert werden kann eine sehr gutes Beispiel. Dennoch würde ich

Stimmt genau.

> nächstes mal doch lieber auf eine Struktur ala:
>
> ID
> ParentID
> Position
>
> zurückgreifen, weil hier ein einfaches delete usw. ausreicht. (Die
> Position für die leichte Wartung in 10er schritten, weil man hier einfach
> was einfügen kann, dem ORDER BY ist dies egal und die Applikation wirds
> beim nächsten Admin-Eintrag über die Webseite wieder richtig stellen.)

Wenn es aber doch eine Adminoberfläche gibt: Warum nutzt du sie nicht?


Grüße,
Dominik
--
http://www.vlights.com/
vLights.com - Das Portal für virtuelle Kerzen

Re: Multi-Level Menüstruktur

am 05.10.2006 03:28:10 von Thomas Rachel

Martin Kaffanke wrote:

> So hab ich das auch gemacht. Allerdings habe ich mir angewöhnt immer
> einen SQL Client auch am laufen zu haben, zur Zeit der
> mysql-query-browser (gnome).

> Dort kann man bei Nested sets nicht so einfach mal ein DELETE
> from Menu where ID=42 machen, weil man sich damit das Dings kaput
> macht.

ACK. Aber in diesem Fall könnte man sich etwa einen "erweiterten Client"
heranziehen, der auch Funktionen kennt. Insbesondere denke ich dabei an
den Python-Kommandozeilenargument. Da könnte man sich etwa aeine
Funktion in einem Modul definieren und den Funktionsaufruf dann direkt
von der Kommandozeile aus tätigen.


Thomas
--
Du willst ganz, ganz sicher keine Gruppe, in der die Buchstaben S,
E und X in genau dieser Reihenfolge im Namen enthalten sind.
Sven Paulus in de.alt.admin zum Vorschlag de.soc.homosexuell