Nicht unbedingt ein Tool aber ein Verfahren im Bereich der Datenbanken, das stärkere Beachtung und Anwendung verdient:
Es ist relativ neu, wird wenig angewendet und verfügt über eine geringe Akzeptanz: Das Speichern von Datenstrukturen in einer Zeile einer Tabelle in Form eines JSON-kodierten Strings.
Relationale Datenbanken sind weit verbreitet und gut eingeführt. Sie haben jedoch eine gravierende Beschränkung: Die Struktur der Daten ist auf zwei Dimensionen beschränkt. Häufig ist es jedoch erforderlich, eine dritte Dimension hinein zu bringen, wenn eine Anzahl von gleichartigen Elementen in einem Datensatz gespeichert werden soll. Unerfahrene lösen das häufig, indem getrennte Felder mit einer Nummer als Suffix angelegt werden: element1, element2, element3, usw. Die Nachteile liegen auf der Hand:
Entweder man verschwendet Elemente, wenn man sehr viele anlegt.
Oder die, die man mal angelegt hat, reichen irgend wann nicht mehr aus.
Außerdem ist es nicht möglich, z. B. über die Elemente zu iterieren oder auf ein Element mit dem Index in einer Variablen zuzugreifen.
Die eingeführte Lösung besteht darin, dass man eine weitere unabhängige Tabelle mit diesen Elementen einführt. Hat den Vorteil, dass man auf die Elemente mit einem einfachen Select zugreifen kann, die Anzahl ermitteln, darüber iterieren etc. Jedoch den Nachteil, dass die Zugriffe komplizierter werden, wenn Verknüpfungen zwischen den Tabellen erforderlich sind, es sind Joins oder Subqueries erforderlich. Ebenso die Pflege: Will man von Hand die Elemente ermitteln, die zusammen gehören, wird es ebenfalls kompliziert. Objektiv betrachtet, muss man diese Lösung als Workaround betrachten, um die Beschränkung der Datenbank auf zwei Dimensionen zu umgehen.
Durch das Einführen der JSON-Kodierung von Arrays und komplexeren Strukturen ist jetzt eine elegante und einfache Lösung verfügbar. Diese können problemlos in einem Datensatz untergebracht werden ohne die Probleme, die man früher hatte. Mindestens MySQL und MariaDB unterstützen das ausdrücklich indem sie einen Datentyp JSON bereit stellen. Sollte das nicht der Fall sein, genügt ein Feld vom Datentyp String um die JSON-kodierte Struktur zu speichern.
dev.mysql.com
Compatibility data type that is an alias for LONGTEXT.
mariadb.com
Für die Arbeit damit steht eine Vielzahl von Funktionen zur Verfügung, so dass in den aller meisten Fälle auf das (De)kodieren mit PHP verzichtet werden kann.
Ein Beispiel habe ich in der Schublade: Eine Datenbank mit Schauspielern und Filmen, jeweils in einer Tabelle abgelegt. Eine n:m-Beziehung weil ein Schauspieler in mehreren Filmen mitgespielt hat und an einem Film mehrere Schauspieler beteiligt waren. Wenn ich richtig informiert bin, besteht die konventionelle Lösung darin, eine Verweistabelle einzuführen, die in beiden Richtungen über die IDs die Beziehung herstellt zwischen der Tabelle mit den Schauspielern und der mit den Filmen.
Beim Einsatz von JSON kann man diese Hilfstabelle einsparen, indem man die IDs der Filme beim Schauspieler in einem JSON-Array ablegt und ebenso in der entgegen gesetzten Richtung. Z. B. hat dann beim Schauspieler ein Feld movies den Inhalt [8,9,10]
Die Abfrage, um die Filme den Schauspielern zuzuordnen, konnte ich dann sehr einfach und intuitiv formulieren:
Code:
SELECT actor.actor, movie2.title, movie2.year, movie2.land
FROM actor LEFT JOIN movie2 ON JSON_CONTAINS(actor.movies, movie2.id, '$')
($ ist hier die Wurzel der Datenstruktur im JSON)
Mit der Verweistabelle wäre mir das nicht so leicht von der Hand gegangen und hätte mehr Gedankenarbeit und wahrscheinlich ein weiteres Join gebraucht.
Es bleibt zu hoffen, dass diese fortschrittliche und elegante Methode in Zukunft größere Anwendung und Akzeptanz findet.