Wenn man heutzutage eine Software-Applikation bauen will, hat man die Auswahl aus einem bunten Strauß an Technologien. Dabei kann man schnell in Fallen laufen, da nicht alle Technologien gut miteinander arbeiten. Da wird dann plötzlich der Aufwand sehr groß, den Datenfluss durch den Tech-Stack unter Kontrolle zu halten.
Ein Setup, das gut zusammenspielt, bzw. teilweise darauf ausgelegt ist, in diesem Tech-Stack zu leben, ist Folgendes:
- PostgreSQL für die Datenbank
- PostGraphile zur Erstellung der API
- GraphQL zur Abfrage der API
- TypeScript im Frontend (z. B. in Verbindung mit React)
Auf die drei Teile PostgreSQL, GraphQL und besonders PostGraphile wollen wir in diesem Artikel – und den folgenden Teilen der Blog-Serie – näher eingehen.
Was ist PostgreSQL und warum setzt man es ein?
PostgreSQL ist ein relationales Datenbanksystem, das auf SQL basiert und diese erweitert. Mittlerweile existiert PostgreSQL seit über 30 Jahren; es ist Open Source, wird konstant weiterentwickelt und läuft auf allen gängigen Betriebssystemen.
PostgreSQL bringt neben den bekannten Features, die viele SQL-basierte Systeme haben, einige Vorteile mit. Einer davon sind Custom Data Types. Neben den bekannten Typen, wie Integer, String, Array, JSON, usw. kann man eigene Data Types in der Datenbank anlegen, indem man zum Beispiel eigene Objektstrukturen definiert oder über Enums feststellt, welche Werte ein Typ haben darf.
Darüber hinaus gibt es viele Performance-Features. Die verschiedenen Index-Mechanismen und Tabellen-Partitionierung sind hier nur zwei Beispiele. Unter den Security-Features ist besonders die Row Level Security zu nennen, die für jede einzelne Zeile einer Datenbanktabelle festlegen kann, wer sie sehen (lesen) darf.
Neben den schon genannten Features unterstützt PostgreSQL auch Replizierung – was vor allem in einer Cluster-Architektur wertvoll ist –, Volltextsuche, NoSQL und JSONB. Und es ist über viele Extensions erweiterbar.
Nutzt man die Performance-Features von PostgreSQL, rennen die Datenbankabfragen auch auf großen Datenmengen sehr schnell.
Was ist GraphQL und warum setzt man es ein?
GraphQL ist eine Query Language und gleichzeitig ist es auch eine Runtime, in der Abfragen gegen ein API und existierende Daten ausgeführt werden. Mit GraphQL kann man die Daten und ihr API komplett in einem Schema beschreiben.
Mit GraphQL kann man sehr genau definieren, welche Daten, bzw. Datenstrukturen, man über die Schnittstelle holen will. So werden Ladezeiten reduziert, denn man lädt nur genau das, was man auch braucht. Gleichzeitig kann man Anfragen-sparsam arbeiten, da GraphQL die Beziehungen zwischen den Daten (zum Beispiel über Foreign Key Constrains in der Datenbank) versteht. Da die von GraphQL generierten Schemas stark typisiert sind, wird sichergestellt, dass nur korrekte Anfragen gegen die Schnittstelle gestellt werden. Wenn man verschiedene Datenquellen hat – zum Beispiel in einer Microservice-Architektur – folgen alle Schemas dem selben Aufbau, so dass sie zusammengefasst werden können, um eine einheitliche Schnittstelle für die Applikation zur Verfügung zu stellen. Die Schemas können aber auch angepasst und erweitert werden.
Auch GraphQL ist erweiterbar. Ein gutes Beispiel hierfür sind Tools, die aus den Schemas Typdeklarationen für ein TypeScript-Frontend erstellen. Damit ist sichergestellt, dass alle Datentypen über die diversen Schichten im System einheitlich und korrekt sind.
Was ist PostGraphile und warum setzt man es ein?
PostGraphile wird genutzt, um das schon erklärte GraphQL-API aus der PostgreSQL-Datenbank zu erstellen. PostGraphile erkennt automatisch Relationen in der Datenbank und fügt die entsprechenden CRUD-Funktionen (Create, Update, Delete) zum API hinzu. Es erweitert die Schnittstellen um Filter- und Sortierfunktionen und vieles mehr. Auch hilft PostGraphile bei der Performance von Datenbank-Zugriffen: Beispielsweise werden selbst komplexe GraphQL-Queries in ein einzelnes SQL-Query übersetzt, so dass PostgreSQL Optimierungen auf dem Query ausführen kann.
Gleichzeitig hat man volle Kontrolle über das generierte API. Will man bestimme Funktionen oder ganze Entitäten nicht in dem API haben, kann man sie mit sogenannten Smart Comments weglassen. Mit diesen smarten Annotationen an der Datenbank kann man aber auch noch einiges mehr machen … Weiterhin hat man die Möglichkeit, die Funktionen von PostGraphile – und somit auch das resultierende API – über Plugins zu erweitern.
PostGraphile ist also der performante und hoch individualisierbare Leim zwischen PostgreSQL und GraphQL.
Use Cases
Für ein PostgreSQL/GraphQL-Setup mit PostGraphile gibt es viele sinnvolle Anwendungsfälle.
Einer davon ist schnelles Prototyping: Man erstellt nur seine Tabellen und das Schema inklusive aller CRUD-Funktionen fällt automatisch aus der Tüte. Auch für eine Microservice-Architektur eignet sich das Setup gut, da man die verschiedenen Datenbanken der Services einfach in einem Schema und einem API zusammenfassen kann.
Da alle drei Technologien in diesem Setup auf Performance und Datensparsamkeit ausgelegt sind, ist es aber auch für andere Architektur-Ansätze geeignet: Insbesondere bei Mobile-First-Ansätzen ist es immens wichtig, dass so wenig Daten wie möglich so schnell wie möglich an den User ausgeliefert werden, damit man lange Ladezeiten vermeiden kann.
Nützliche Links
Und zum Schluss noch ein paar nützliche Links:
Und falls ihr direkt Lust habt, das Setup einmal auszuprobieren, gibt es im Docker Hub ein Image zum Spielen. Oder ihr baut euch ein Docker-Image selbst auf: PostGraphile.org erklärt euch, wie es geht.
Ausblick
Dies ist der erste Teil einer Blog-Serie. Sie wird folgende Themen genauer beleuchten:
- tieferes Verständnis von GraphQL
- tieferes Verständnis von PostGraphile
- PostGraphile erweitern über Smart Tags, Computed Fields und Plugins
- PostGraphile Security mit PostgreSQL-RLS
- PostGraphile Subscriptions
Wenn dieser kurze Einführungspost also Lust auf mehr gemacht hat, dann haltet Ausschau nach den nächsten Teilen in der Serie.
Schreibe einen Kommentar