Open source PHP Klasse für Nested Sets in MySQL

Was ist eine Baumstruktur?

Gerichteter Baum

Eine Baumstuktur wird in der Informatik oftmals benötigt um Daten zu strukturieren. Zum Beispiel ist das gesamte Dateisystem als Baum darstellbar. Oder Hierachien in einem Unternehmen. MySQL ist jedoch dafür bekannt Daten in einer tabellarischen Form auszulesen und zu speichern. Nested Stets kommen eigentlich aus der Mengenlehre aber lassen sich als Baum hin- und herwandeln. Lediglich die visuelle Darstellung ist anders.

Nested Sets in einer Liste?

Damals habe ich mal einen ganz kurzen Blogeintrag geschrieben, mit deren Hilfe man Bäume in MySQL effektiv speichern kann. Ich habe dazu jetzt mal die Zeit gefunden um eine simple PHP-Klasse zu schreiben, welche die einfachsten bzw. gebräuchlichsten Methoden unterstüzt:

  • Baum laden
  • Element einfügen
  • Element löschen (inkl. Kind-Elemente)
  • istKnoten? (bzw. hat Kinder?)
  • als HTML anzeigen

DEMO      DOWNLOAD als ZIP

Klasse


DEMO      DOWNLOAD als ZIP

Demonstration


DEMO      DOWNLOAD als ZIP

SOUNDEX Algorithmus

Ich bin vor kurzem während einer MySQL-PHP-Programmier-Session auf den Soundex Algorithmus gestoßen. Dieser beschreibt eine phonetische Kategorisierung mit Hilfe einer Wertung einzelner Buchstaben.

Beispiele:
SELECT SOUNDEX('Hello'); -> 'H400'
SELECT SOUNDEX('Quadratically'); -> 'Q36324'

Das beste ist, das dieser Algorithmus bereits in MySQL implementiert ist und man somit eine umfangreichere Suche als mit der üblichen LIKE Funktion verwenden kann.

Beispiel einer sehr einfachen SOUNDEX-Suche:
SELECT * FROM table WHERE SOUNDEX(Name) LIKE CONCAT('%', SUBSTR(SOUNDEX('suchstring'), 1, 2), '%');

Wir wissen also jetzt schon was die SOUNDEX() Funktion macht. LIKE ist ein Vergleichsoperator, welcher überprüft ob ein String in einem anderen vorkommt.

Zum Beispiel bei einer ganz einfachen Suche:
SELECT * FROM table WHERE Name LIKE '%test%';
Das heißt in der Spalte Name muss das Wort „test“ vorkommen. Groß- und Kleinschreibung sind dabei egal.

CONCAT() fügt einfach mehrere Strings zu einem zusammen.
SELECT CONCAT('%', 'test', '%'); -> '%test%'

Und SUBSTR(string, start, stop) kürzt in unserem Fall einfach Strings.
SELECT SUBSTR('teststring', 1, 2); -> 'te'

Der wesentliche Vorteil aber bei dieser Suche ist, das auch Wörter gefunden werden, die ähnlich klingen. Die Genauigkeit kann mit dem stop-Parameter in der SUBSTR Funktion eingestellt werden.