MySQL - Hierarchische Tabellen, Version 7

Alte Version

Dies ist eine alte Version des Inhalts in unserem Archiv. Besuchen Sie die aktuelle Version dieser Seite.

Diese Version wurde von Jola am 13. May 2008 um 19:23 Uhr erstellt.
Bemerkung des Bearbeiters: link verbessert

Änderungen gegenüber vorheriger Version anzeigen


Die Besonderheit von hierarchischen Tabellen im Gegensatz zu anderen Tabellen ist, dass sie, wie der Name schon sagt eine hierarchiche Struktur haben. Diese entsteht dadurch, dass der Fremdschlüssel auf den eigenen Primärschlüssel verweist. Auf diese Weise lassen sich z.B. sehr gut Ordnerstrukturen erstellen.

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:

 
HTML
1
2
3
4
5
CREATE TABLE `Kategorie`(
`ID` INT(11) NOT NULL PRIMARY KEY auto_increment,
`Name` VARCHAR(45) NOT NULL,
`ElternID` INT(11) 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_incerement 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 kein 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, nicht möglich.

Noch ein Nachteil besteht darin, dass man nicht alle Unter- und Unter-unterkategorien mit einer einzigen Abfrage ausgeben lassen kann.

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/