MySQL-Bäume und PHP

iAZ

Mitglied
Hallo,
ich habe eine Tabelle mit Kategorien:
Table cat:
Code:
CREATE TABLE cat (
  id int(10) unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL default '',
  PRIMARY KEY  (id)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

mit den Inhalten:
Code:
INSERT INTO cat VALUES (1, 'Obst');
INSERT INTO cat VALUES (2, 'Gemüse');
INSERT INTO cat VALUES (3, 'Streuobs');
INSERT INTO cat VALUES (4, 'Gewürze');
INSERT INTO cat VALUES (5, 'Tomate');
INSERT INTO cat VALUES (6, 'Apfel');
INSERT INTO cat VALUES (7, 'Birne');
INSERT INTO cat VALUES (8, 'Gurke');
INSERT INTO cat VALUES (9, 'Majoran');
INSERT INTO cat VALUES (8, 'Safran');

Dann eine Tabelle cat_cat:
Code:
CREATE TABLE cat (
  id int(10) unsigned NOT NULL auto_increment,
  cat_id int(10) unsigned NOT NULL ,
  over_id int(10) unsigned NOT NULL ,
  PRIMARY KEY  (id)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

mit den Inhalten:
Code:
INSERT INTO cat VALUES (1, 1, 0);
INSERT INTO cat VALUES (2, 2, 0);
INSERT INTO cat VALUES (3, 3, 1);
INSERT INTO cat VALUES (4, 4, 0);
INSERT INTO cat VALUES (5, 5, 2);
INSERT INTO cat VALUES (6, 6, 3);
INSERT INTO cat VALUES (7, 7, 3);

Und so weiter......

Dann sieht das wie ein Baum aus:
  • Obst
    • Streuobst
      • Apfel
      • Birne
  • Gemüse
    • Tomate
    • Gurke
  • Gewürze
    • Majoran
    • Safran
,
weil ja die erste mit der 2. Tabelle verknüpft sind, und Apfel & Birne Unterkategorien von Streuobst sind und Streuobst eine Unterkategorie von Obst usw... (Siehe Tabelle cat_cat [over_id]=id der Überkategorie.)

Jetzt die Frage:
wie gebe ich das mit Php in ein mehrdimensionales Array ein und gebe es wie ein Baum aus. (die Kategorien können unendlich tief gehen)

Kann mir jemand bitte das kurz und verständlich erklären?
Danke,
AZ
 
Man könnte hier die ganze Tabelle auslesen und eine rekursive Funktion laufen lassen für jede Zeile. Da dies eine enorme Serverlast ausmacht, möchte ich vorab fragen: Wie oft ändert sich deine Tabelle?
 
Hallo,

um eine Baumstruktur in einer Datenbank mit beliebiger Tiefe abzubilden, rate ich dringend zu einem Nested-Sets Datenbankmodell. Eine sehr gute Einführung und die benötigten Query-Statements findest du hier:
http://www.klempert.de/nested_sets/

Ausgehend davon kannst du alle Einträge selektieren, sortiert nach "LFT"
Weiterhin musst du die ebene des LFT ermitteln, wie dies geht erfährst du ebenfalls in dem Link.

In der Schleife der Ausgabe fängst du nun bei Level 0 an (zusatzvariable). Bei jeder Ausgabe überprüfst du nun
$prepend = (($atk_level > $prev_level) ? '<ul>' : '');
$append = (($akt_level < $prev_level) ? '</ul>' : '');

Die Ausgabe in der Schleife lautet dann
$string = $append.DBWERT.$prepend;

Vor und nach der Schleife wird natürlich <ul></ul> gesetzt. Das ganze dann noch schön Code/Layouttechnisch trennen und et viola, ein sehr gutes auf unendlich ebenen ausbaubares Baummodell ist aufgebaut ;)
 
um eine Baumstruktur in einer Datenbank mit beliebiger Tiefe abzubilden, rate ich dringend zu einem Nested-Sets Datenbankmodell.

Das Wörtchen "dringend" solltest du in dicke Klammern setzen oder gar streichen. Meine Frage wie oft sich deine Tabelle ändert steht noch aus und anhand dessen muss man sich eine geeignete Struktur suchen.

NestedSets sind nur für Bäume geeignet die sich so gut wie nie ändern, da jede kleine Änderung (Einfügen, Löschen, Verschieben von Knoten) im Schnitt die Hälfte der gesamten Tabelle ändert. Bei Bäumen die sich häufig ändern, oder die recht komplex sind benötigt so etwas natürlich viel Zeit und deine Seite würde sehr langsam werden.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: iAZ
Also die Tabelle dürfte sich recht oft ändern, weil ich das für eine Foto-Seite mit vielen Kategorien mache....
 
Die Häufigkeit der Änderungen spielt in der Tat eine Rolle und ich hätte nachfragen müssen, true!

Auch bei dem Kommentar bzgl. der Kategorisierung von Fotos:
Hier ist zumeist nur EINMAL ein größerer Aufwand notwendig alle Kategorien anzulegen. Wohl kaum wird es dazu kommen, dass auf täglicher Basis die Kategorien geändert werden?

Die Zuweisung von Foto->Kategorie geschieht ja ohnehin in einer seperaten Tabelle abgebildet.


Bäume, welche sich nicht auf Forensysteme bzw. komplexe Kommentarsysteme (häufiges ändern/bearbeiten) beziehen, lassen sich zu bestimmt 95% am besten mit Nested Sets abbilden.
 
Ok ich werde es wahrscheinlich mit Nested Sets machen. fals ich irgendwelche Hilfe brauche melde ich mich nochmal.
 
Zurück