Header Bild

tl;dr*

* too long; didn't read.
Hier ist die Kernbotschaft

Nahezu jede Anwendung, und sei sie noch so klein, benötigt heute an irgendeiner Stelle eine Datenbank. Wir setzen dabei auf PostgreSQL. Für flexible Datenauswertung schließen wir es an CubeJS an.

Datenbanken

Warum wir auf Postgres setzen...

Postgres und seine Helfer

Egal ob Blog-Posts, die Artikel eines Webshops, User-Accounts, statistische Erhebungen, Wetterdaten oder die Ergebnisse von Crawling-Kampagnen, PostgreSQL ist jeder Herausforderung gewachsen. “Postgres”, wie Fans es liebevoll nennen, ist ein professionelles Datenbank-System, das seit über 30 Jahren aktiv als Open-Source-Projekt weiterentwickelt wird. Unsere Kunden können es auf eigenen Servern betreiben, oder auf die vollständig verwalteten Postgres-Dienste von Cloudanbietern wie Amazon Web Services, Microsoft Azure und Google Cloud Platform vertrauen.

Aus diesen Gründen verwenden wir bei den Cloud Creators Postgres als Standard-Datenbank, unabhängig von der Projektgröße:

Mit JSONB auf NoSQL Datenbanken verzichten

Durch die Unterstützung von JSON und JSONB Datentypen vereint Postgres die Vorteile traditioneller relationaler Datenbanken mit der Flexibilität von oft gehypten NoSQL Datenbanken wie z. B. MongoDB. Das bedeutet, dass wir die bekannte Struktur Ihrer Daten nutzen können, um sie vor Programmier- oder Eingabefehlern zu Schützen aber gleichzeitig die Möglichkeit haben, Daten zu speichern, deren Struktur nicht von Anfang an bekannt ist.

Ein Beispiel: Ihre Nutzer verkaufen Produkte auf Ihrem Marktplatz. Zu jedem Produkt gehören notwendige Daten wie z. B. Preis, Name und wer es gerade im Warenkorb liegen hat. Solche Strukturen lassen sich gut als Tabellen und Beziehungen zwischen ihnen abbilden und sind der klassische Anwendungsfall für relationale Datenbanken. Anders sieht es beispielsweise bei der Artikelbeschreibung aus: für ein Buch sind Autor, Titel und Seitenzahl relevant, für Schuhe sind es vielleicht Größe, Farbe und Marke. Was aber wenn ein Kunde Kissenbezüge verkaufen möchte? Es ist unmöglich von Anfang an alle Produkte abzubilden. Für solche unstrukturierten Daten eignen sich NoSQL Datenbanken. Postgres verknüpft das Beste aus beiden Welten.

Funktionsumfang erweitern mit PLV8

Postgres liefert, wie die meisten Datenbanksysteme, viele Standard-Funktionen zur Datenauswertung mit und kann z. B. Summe, Durchschnitt und Standardabweichung berechnen. Manchmal reichen die eingebauten Funktionen aber einfach nicht aus. Für solche Fälle bieten Datenbanksysteme die Möglichkeit, benutzerdefinierte Funktionen (user defined functions, UDFs) zu erstellen. UDFs erledigen ihre Aufgabe direkt auf dem Datenbankserver und bieten sich insbesondere dann an, wenn sonst große Datenmengen an die Applikation übertragen werden müssten, um die Auswertung dort zu erledigen. Postgres besticht hier insbesondere durch die Erweiterung PLV8, die es ermöglicht benutzerdefinierte Funktionen in Javascript zu programmieren. Das hat den Vorteil, dass diese UDFs just-in-time compiliert werden und somit deutlich performanter laufen als interpretierte SQL-Funktionen. Gleichzeitig sind sie viel einfacher zu handhaben als direkt in C geschriebene Funktionen. Durch den Einsatz von PLV8 konnten wir z. B. die Funnel-Funktion von Focal Analytics von mehreren Minuten auf Millisekunden beschleunigen.

Teile und herrsche: Daten effizient vorhalten durch partitionierte Tabellen

Partitionierte Tabellen erlauben es, große Datenmengen, die eigentlich in einer riesigen Tabelle verwaltet werden, nach vorgegebenen Kriterien, z. B. nach Abteilung oder Zeitstempel getrennt abzuspeichern. Der Benutzer sieht dabei, wie gewohnt, eine einzige Tabelle mit allen Daten und profitiert trotzdem von den Vorteilen, die sich aus der internen Aufteilung durch Postgres ergeben. Beispielsweise können Daten, je nach Anwendungsfall, wesentlich schneller durchsucht werden, wenn sie geschickt aufgeteilt werden. Bei großen Datenmengen kann auch das Löschen einen enormen Aufwand bedeuten, wenn tausende oder hunderttausende Zeilen einzeln aus dem Datensatz entfernt werden müssen. Gelingt es die Daten so aufzuteilen, dass eine ganze Partition (z. B. ein Monat) auf einmal gelöscht werden kann, entfällt dieser Aufwand vollständig.

Partitionierte Tabellen sind ein wesentlicher Grund, weshalb die riesigen Datenmengen unsers Web-Analytics Produkts Focal Analytics überhaupt beherrschbar sind. Besonders interessant werden partitionierte Tabellen, wenn sie mit weitern Features von Postgres wie Table Spaces oder Foreign Data Wrappers kombiniert werden.

Speichermedien optimal nutzen mit Table Spaces

Postgres erlaubt die Zuweisung von Tabellen zu sog. Table Spaces, die vorgeben, wo ihre Daten physikalisch gespeichert werden. Dadurch wird es möglich, Daten, die nur selten benötigt werden, oder deren Zugriffszeit unkritisch ist auf günstigen Speichermedien wie rotierenden Festplatten abzuspeichern während Daten, die häufig und schnell zur Verfügung stehen müssen auf schnellen aber teuren SSDs gespeichert werden. Die Kombination mit partitionierten Tabellen ermöglicht dann, z. B. ein „Lifecycle“-Management Ihrer Daten, bei dem ältere Daten auf langsamere Datenträger verschoben werden.

Andere Datenquellen anzapfen mit Foreign Data Wrappers

Eine Vielzahl sog. Foreign Data Wrappers (FDWs) erlaubt es, externe Datenquellen wie z. B. MySQL oder Oracle Datenbanken an Ihre Postgres Datenbank anzuschließen. Besonders interessant ist die Anbindung anderer Postgres Datenbanken in Verbindung mit partitionierten Tabellen: Dadurch kann, für den Anwender transparent, die Datenhaltung horizontal auf mehrere Server verteilt werden (sharding).

Abfragen beschleunigen und Platz sparen mit partiellen Indizes

Indizes werden verwendet, um Abfragen auf bestimmten Tabellenspalten zu beschleunigen. Diese Beschleunigung erhält man allerdings nicht umsonst, sondern, grob gesagt, für den Preis der mehrfachen Datenspeicherung, in sortierter Weise. Bei Tabellen mit sehr vielen Zeilen, steigt der Speicherbedarf für den Index entsprechend stark an. Ist von vornherein klar, dass sich Abfragen nur auf einen kleinen Teil der Daten beziehen werden, ist es unnötig, alle Zeilen in den Index aufzunehmen. Für solche Fälle bietet Postgres sog. partielle Indizes, die sich auf Zeilen beschränken, die vorgegebene Filterbedingungen erfüllen. Ein zusätzlicher Gewinn ist dabei, dass die Filterspalte selbst nicht im Index abgespeichert werden muss.

Der Fall wird am Beispiel von Focal Analytics deutlich: Angenommen, wir haben eine Tabelle, die alle Maus-Klicks auf einer Website protokolliert und dazu die URL und das HTML-Element abspeichert, auf das geklickt wurde. Je nach Größe der Website erreichen wir hierbei schnell Millionen oder vielleicht Milliarden von Zeilen. Im Wesentlichen interessant sind allerdings nur Klicks auf den Knopf „Jetzt kaufen“ auf der Unterseite „/checkout“. Ein partieller Index mit diesen beiden Kriterien umfasst (leider) nur einen Bruchteil aller Datenzeilen und spart schnelle einige GB im Vergleich zum vollständigen Index. Trotzdem beschleunigt er die Frage „Wie viele Besucher klicken auf Kaufen?“ drastisch.

Volltextsuche mit tsvector und Generalized Inverted Index (GIN)

Die Standardlösung für Volltextsuchen ist sicher Elastic Search. Aber es muss nicht immer eine ausgewachsene Suchmaschine sein, um eine Volltextsuche auf ein paar tausend Dokumenten zu realisieren, wenn man ohnehin schon Postgres im Einsatz hat. Unsere Tests mit ca. einer halben Million Wikipedia Artikeln haben gezeigt, dass sich in Postgres auch mit Bordmitteln noch performant suchen lässt. Ein GIN Index auf einer tsvector Spalte leistet Erstaunliches. Aber wenn Ihre Anwendung es erfordert, verwenden wir selbstverständlich auch Elastic Search…

Pub/sub mit Triggern und Notifications

Manchmal müssen Daten vor oder nach dem Einfügen verändert oder weiterverarbeitet werden, sei es durch die Datenbank selbst oder durch externe Anwendungen. Ein eingefügtes Textdokument, samt Überschrift und Autorname können beispielsweise automatisch für die Volltextsuche gewichtet und in eine tsvector Spalte aufgenommen werden. Für derartige „Tricks“ lassen sich in Postgres sogenannte Trigger verwenden. Sollen Daten durch einen externen Dienst automatisch weiterverarbeitet oder angereichert werden, können Postgres Notifications hilfreich sein. Auf solche Nachrichten kann eine verbundene Anwendung hören und reagieren, ohne aktiv in Intervallen nach neuen Daten zu fragen. So lassen sich mit Postgres problemlos sog. „publish/subscribe“ (pub/sub) Abläufe realisieren.

Verwandt zu Triggern sind übrigens Postgres „Rules“, also Regeln, mit denen sich verrückte Dinge realisieren lassen, wie das korrekte Einfügen von Daten in Views, die Joins enthalten.

Geoinformationssysteme mit PostGIS

Mit der Erweiterung PostGIS unterstützt Postgres räumliche und geographische Objekte und wird zum Geoinformationssystem. Die Anwendungen sind schier grenzenlos. Bei Focal Analytics ermöglicht uns PostGIS, OpenData Wettervorhersagen in Postgres zu speichern und innerhalb von Millisekunden tausende Nutzer zu identifizieren, bei denen es morgen voraussichtlich regnen wird. Newsletter können dann entsprechend ausgerichtet werden.

Flexible Auswertungen durch CubeJS

Eines unserer Lieblingstools beim Aufbau von Datenanalyse-Stacks ist CubeJS. Es lässt sich an unterschiedliche Datenbanken anbinden und eignet sich insbesondere auch für die Kombination mit Postgres. CubeJS generiert aus den Fragen des Users die passenden Abfragen, kümmert sich darum die Abfragen mehrerer Nutzer nacheinander zu beantworten, ohne dabei die Datenbank zu überlasten und hält die Antworten auf sich häufig wiederholende Abfragen vor. Dadurch wird es für uns einfacher, unseren Nutzern Zugang zu ihren Daten zu gewähren und für unsere Nutzer wird es einfacher Erkenntnisse aus ihren Daten zu gewinnen.

Was möchten Sie aus Ihren Daten lernen? Kontaktieren Sie uns!

Sprechen wir über Ihr Projekt!

Profilbild von Dr. Ulrich Hörmann
Dr. Ulrich Hörmann Geschäftsführer
Schreiben Sie uns eine E-Mail
Rufen Sie uns an
* Pflichtfeld
Vielen Dank, für Ihre Nachricht!
Wir melden uns so bald wie möglich bei Ihnen.

Lesen Sie mehr