MySQL - Hierarchische Tabellen

von Jola | 0 | 10618 Aufrufe

Anzeige Hier werben

Die Besonderheit von hierarchischen Tabellen im Gegensatz zu anderen Tabellen ist, dassdie Enthaltenen Daten hierarchisch ausgegeben werden können. Diese Hierarchie entsteht durch einen Fremdschlüssel, der auf den eigenen Primärschlüssel verweist. Auf diese Weise lassen sich z.B. sehr gut Ordnerstrukturen darstellen.

Ich werde versuchen das Prinzip der hierarchischen Tabellen an einem kleinen Beispiel zu verdeutlichen. Nehmen Sie an Sie wollen Informationen oder Artikel zu verschiedenen Betriebssystemen speichern. Um diese aber zu Ordnen brauchen sie verschiedene Kategorien oder virtuelle Ordner.

Als Erstes erstellen sie eine Tabelle mit 3 Spalten:

 
sql
1
2
3
4
5
CREATE TABLE `Kategorie`(
`ID` INT(10) UNSIGNED NOT NULL PRIMARY KEY auto_increment,
`Name` VARCHAR(45) NOT NULL,
`ElternID` INT(10) UNSIGNED NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

Dann können sie z.B. folgenden Inhalt hinzufügen:

 
sql
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Opensource`,`0`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Windows`,`0`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Linux`,`1`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`SUSE`,`3`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Knoppix`,`3`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Win XP`,`2`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Vista`,`2`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Ubuntu`,`3`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Macintosh`,`0`);
INSERT INTO `Kategorie` (`Name`, `ElternID`) VALUE (`Win 2000`,`2`);

Nun haben sie so eine Tabelle:

ID Name ElternID
1 Opensource
0
2 Windows 0
3 Linux 1
4 SUSE 3
5 Knoppix 3
6 Win XP 2
7 Vista 2
8 Ubuntu 3
9 Macintosh 0
10 Win 2000 2

Bild zu MySQL - Hierarchische Tabellen

Wie man sieht werden alle Kategorien erstmal in die gleiche Tabelle eingetragen und werden einfach per auto_increment der Reihe nach mit einer ID versehen. Erst durch die Spalte „ElternID“ wird die Tabelle zur hirarchischen Tabelle. Der Fremdschlüssel „ElternID“ verweist auf eine andere Kategorie in derselben Tabelle und besagt, dass diese Kategorie die „Elternkategorie“ also eine übergeordnete Kategorie sein soll. Manche Kategorien haben die ElternID 0. Diese sind am höchsten in der Hierarchie der Tabelle und liegen sozusagen im Index. Das Bild rechts soll die hierarchische Struktur der Tabelle verdeutlichen.

Vor- und Nachteile

Diese Form der Tabelle ermöglicht ein besonders schlankes Tabellendesign. Alle Benötigten Informationen werden in nur einer Tabelle gespeichert, ohne dabei Normalisierungsregeln zu brechen.

Des Weiteren bieten hierarchische Tabellen theoretisch unbegrenzte Möglichkeiten für die Strukturierung der Kategorien. Es kann eine sehr breite Struktur, mit vielen Kategorien nebeneinander, oder eine sehr tiefe Struktur, mir vielen Kategorien untereinander, erzeug werden.

Die Handhabung dieser Tabellen ist auch sehr einfach, da nur eine Tabelle benutzt wird, und man keine JOINs oder Verweise zu anderen Tabellen braucht.

Ein Nachteil dieser Tabellenform ist, das es nicht möglich ist einer Kategorie mehrere Elternkategorien zugeben. Somit kann eine Kategorie nicht in mehreren verschiedenen Kategorien auftauchen. Das Kopieren einer Kategorie ist dadurch, im Gegensatz zum Verschieben, nur möglich, indem man die Kategorie auch wirklich in der Tabelle dubliziert, und unter einer neuen ID einträgt. Besonders wenn eine Kategorie mit weiteren Unterkategorien kopiert werden soll, ist das verhältnismäßig schwierig.

Noch ein Nachteil besteht darin, dass man nicht alle Unter- und Unter-unterkategorien mit einer einzigen Abfrage ausgeben lassen kann. Das ist nur mit mehreren Abfragen möglich und kann bei größerem Tabellenumfang zu einer höheren Serverbelastung führen

Alternativen

Es gibt verschiedene, alternative Tabellenformen mit denen man den genannten Nachteilen begegnen kann. Doch haben diese dann ihre Nachteile an anderer Stelle. Welche Forma am besten ist, muss je nach Anwendungsgebiet entschieden werden.

Um eine Kategorie mehreren Elternkategorien zuzuweisen, kann man man die Spalte ElternID in eine eigene Tabelle auslagern.

Kat_ID Kat_ElternID
1 0
2 0
3 1
3 2

So kann einer Kategorie mehrere Elternkategorien zugewiesen werden. (Diese Tabelle führt mit dem Beispiel oben zu einer unlogischen Struktur)

Wenn alle Unterkategorien mit einer einzigen Abfrage erfasst werden sollen, bietet sich der "Modified preorder tree traversal algorithm" an.
Bei dieser Methode wird jeder Kategorie ein Links- und ein Rechtswert nach einem bestimmten Muster zugewiesen. Anhand dieser Werte können dann alle Unterkategorien erfasst werden. Genauere Informationen gibt es bei den folgenden Links.
http://www.sitepoint.com/article/hierarchical-data-database/2/
http://fforw.de/post/Storing_hierarchical_data_in_a_database/

Über den Autor: Jola
ist zur Zeit in einer Ausbildung zum Fachinformatiker(AWE)
Profilseite betrachten