Hallo!
Ich überlege gerade, wie ich hierarchische Daten am besten speichere, und wie ich am besten darauf zugreife.
Ich habe Daten vergleichbar mit denen von e-class:
http://eclass.de/hauptseite.phtml?nav=suchen&lang=germ&nav2=hsuche&hsuche_x=x&e1=19&e1des=Informations-%2C+Kommunikations-%2C+und+Medientechnik&e2=01&e2des=Hardware+(Informationstechnik)&pe=01~System+(Informationstechnik)
Die Daten sind außerdem überschaubar, das heißt maximal 10 MB, zumeist unter 1 MB.
Das heißt z.B. ich habe folgende Daten
Hardware (Informationstechnik)
System (Informationstechnik)
Mainframe
Cluster-Rechner
Server
Workstation
Personal Computer
Terminal
Notebook
Zubehör für Hardware und Peripheriegeräte
Laufwerk
Diskettenlaufwerk
CD-Laufwerk
CD-Brenner
DVD-Laufwerk
DVD-Brenner
Bandlaufwerk
Festplatte
Software
Server-Software
Datensicherung
Groupware
Firewall
Intranet-Lösung
Ich muss diese Hiearchie speichern und wiederherstellen können, jede Kategorie braucht eine feste, eindeutige ID, und jetzt kommt das doofe: Die Reihenfolge der Unterkategorien in einer Kategorie muss veränderbar sein. Die Anzahl der Hierachie-Ebenen soll nicht begrenzt sein. Der Baum soll genau so aufgeklappt werden wie im eclass-Beispiel oben, das heißt es gibt immer nur einen "offenen Pfad", nicht wie im Windows-Explorer, wo alle Kategorien(Verzeichnisse) so lange offen bleiben, bis man sie wieder schließt.
Als Programmiersprache verwende ich PHP (was auch sonst ;-)).
Daten in XML-Format zu speichern und mit PHP(4) zu parsen finde ich bei der Größe nicht wirklich sinnvoll. 2. Möglichkeit wäre die Daten wie in Henryks Forum-Artikel in einer relationalen DB zu speichern, und die Daten ggfs. rekursiv zu durchlaufen.
Auf der anderen Seite ist in PHP ja die mit Abstand schnellste Zugriffs-Methode die Verwendung von Arrays - zumindest in dieser Größenordnung. Dazu kommt, dass man Arrays recht einfach im Shared Memory ablegen kann. Prinzipiell würde ja folgende Struktur ausreichen:
Hardware
System
Mainframe
Cluster-Rechner
Server
Ließe sich mit Hilfe von 2 Arrays z.B. so abbilden:
array (
1 => array (
2 => array (
3 => array(),
4 => array(),
5 => array()));
array (
1 => 'Hardware',
2 => 'System',
3 => 'Mainframe',
4 => 'Cluster-Rechner',
5 => 'Server'
);
Das wäre auch alles schön und gut, man könnte die Schlüssel ja als feste IDs verwenden, nur kann man dann nicht so ohne weiteres Elemente verschieben. Sagen wir mal, es soll nicht
Hardware
System
Mainframe
Cluster-Rechner
Server
sondern
Hardware
System
Server
Mainframe
Cluster-Rechner
angezeigt werden, dann weiß ich nicht wie ich das machen soll, wenn der Schlüssel "5" dem "Server" fest zugeordnet sein soll (sonst wäre es mit array_splice() kein großes Problem).
Dann stellt sich auch die Frage, wie man effizient einen Teilbaum für eine gegebene Unterkategorie erstellt. Sagen wir mal
Hardware
System
Mainframe
Cluster-Rechner
Server
wäre ein Teilbaum von dem gesamten E-Class Baum, und ich wollte auf einer Webseite jetzt eben nur den Pfad zur ID "4", also "Cluster-Rechner" anzeigen.
Da man jetzt nicht weiß auf welcher Ebene sich "4" befindet, muss man der Reihe nach(linear) alle Ebenen abklappern... das wäre ja absoluter Overkill, oder? Also braucht es hier noch ein Array in dem hierfür nützliche Informationen gespeichert werden, also am besten einfach eine Liste mit Parent IDs:
das heißt für das Beispiel:
$index = array (
1 => 0,
2 => 1,
3 => 2,
4 => 2,
5 => 2
);
$find = 4;
Daraus lässt sich sehr schnell ermitteln über welchen Pfad man zur gesuchten Kategorie kommt.
while ($find > 0) {
$find = $index[$find];
$pfad[] = $find;
}
Prinzipiell bräuchte ich dann den ersten Array auch gar nicht mehr, weil dieser hier ja alle notwendigen Informationen enthält, hm.
Das Problem welches ich leider nicht vernünftig gelöst bekomme ist wie ich jetzt die Reihenfolge der Unterkategorien innerhalb einer Kategorie ändern kann. Hat da vielleicht jemand eine Idee wie man das "ordentlich" machen könnte?
Viele Grüße,
Andreas