Coderblock

Datenbanken für Einsteiger: SQL, Postgres und Supabase erklärt

Erfahre, wie relationale Datenbanken Informationen organisieren, wie SQL funktioniert und warum Postgres und Supabase in modernen Web-Apps häufig gemeinsam eingesetzt werden. Die Lektion behandelt außerdem Schema-Design, Sicherheit und praktische Datenbank-Workflows in Coderblock.

10 min

Warum Web-Apps Datenbanken brauchen

Eine Anwendung kann eine Oberfläche anzeigen, Daten erfassen oder eine Aktion ausführen. Doch was passiert, wenn sie sich etwas merken muss?

Eine Buchungsplattform muss sich Kunden, Dienstleistungen und Termine merken. Ein Onlineshop muss Produkte, Bestellungen und Lagerbestände verwalten. Eine SaaS-Plattform muss wissen, welche Benutzer ein Konto besitzen, welche Projekte sie erstellt haben und über welche Berechtigungen sie verfügen.

Genau dafür gibt es Datenbanken.

Eine Datenbank ist der Ort, an dem eine Anwendung die benötigten Informationen strukturiert und dauerhaft speichert. Ohne Datenbank würden viele Daten möglicherweise nur vorübergehend im Browser existieren. Beim Schließen der Seite könnten sie verloren gehen. Mit einer Datenbank kann die App Informationen speichern und später wieder abrufen – auch auf unterschiedlichen Geräten und für verschiedene Benutzer.

Eine Datenbank ist das Gedächtnis der App

Du kannst dir die Datenbank als dauerhaftes Gedächtnis einer Anwendung vorstellen.

Das Frontend zeigt Informationen an. Das Backend setzt die Logik um. Die Datenbank speichert die Daten.

Bei einer Buchungs-App sieht das zum Beispiel so aus:

Frontend → zeigt Dienstleistungen und Kalender an Backend → prüft Verfügbarkeit und Berechtigungen Datenbank → speichert Benutzer, Dienstleistungen und Buchungen

Es gibt verschiedene Arten von Datenbanken. Dokumentendatenbanken arbeiten mit flexiblen Dokumenten, Key-Value-Datenbanken sind für bestimmte Arten schneller Zugriffe optimiert und relationale Datenbanken organisieren Daten in miteinander verknüpften Tabellen. SQL und Postgres gehören hauptsächlich zu dieser Welt. Supabase ergänzt Postgres dagegen um eine Reihe von Backend-Diensten, die für Webanwendungen entwickelt wurden.

Relationale Datenbanken: Tabellen, Zeilen und Beziehungen

Eine relationale Datenbank organisiert Informationen in Tabellen. Jede Tabelle repräsentiert in der Regel eine bestimmte Art von Entität. Auf einer Buchungsplattform könntest du beispielsweise folgende Tabellen haben:

  • profiles → die Benutzer;
  • services → die verfügbaren Dienstleistungen;
  • bookings → die Buchungen.

In jeder Tabelle findest du:

  • Spalten, die die Eigenschaften der Daten beschreiben;
  • Zeilen, die einzelne Datensätze darstellen;
  • Primärschlüssel, die jeden Datensatz eindeutig identifizieren;
  • Fremdschlüssel, die Datensätze aus unterschiedlichen Tabellen miteinander verknüpfen;
  • Constraints, die verhindern, dass ungültige Daten gespeichert werden.

Eine Buchung könnte beispielsweise eine profile_id und eine service_id enthalten. So weißt du genau, wer die Buchung vorgenommen und welche Dienstleistung die Person ausgewählt hat, ohne sämtliche Benutzer- und Dienstleistungsdaten in jede einzelne Buchung kopieren zu müssen.

Warum sind Beziehungen wichtig?

Stell dir vor, eine Dienstleistung wird umbenannt. Wenn ihr Name in jede Buchung kopiert worden wäre, müsstest du Hunderte oder Tausende Datensätze aktualisieren. In einer relationalen Datenbank kann die Buchung stattdessen einfach auf die richtige Dienstleistung verweisen. Beziehungen zwischen Daten helfen somit, Duplikate und Widersprüche zu reduzieren und das Produktmodell übersichtlich zu halten.

Was ist ein Datenbankschema?

Bevor du eine Datenbank erstellst, musst du entscheiden, wie die Informationen organisiert werden sollen. Die Gesamtheit aus Tabellen, Spalten, Beziehungen, Datentypen und Constraints, die diese Struktur definiert, wird als Schema bezeichnet. Ein gutes Schema bildet in der Datenbank ab, wie das Produkt tatsächlich funktioniert.

Bevor du eine neue Tabelle erstellst, solltest du dich fragen:

  1. Was stellt jeder Datensatz dar?
  2. Welche Informationen sind Pflichtangaben?
  3. Welche Werte müssen eindeutig sein?
  4. Welche Entitäten müssen miteinander verknüpft werden?
  5. Wer darf diese Daten lesen oder ändern?

Das Ziel besteht nicht darin, möglichst viele Tabellen anzulegen. Eine riesige Tabelle mit völlig unterschiedlichen Informationen kann schwer zu verwalten sein. Gleichzeitig kann es das System unnötig kompliziert machen, jede kleine Information in eine eigene Tabelle auszulagern.

Ein gutes Schema schafft ein Gleichgewicht zwischen Datenkonsistenz, einfachen Abfragen und den tatsächlichen Anforderungen des Produkts.

Was ist SQL?

An dieser Stelle kommt SQL ins Spiel. Die Abkürzung steht für Structured Query Language. SQL ist die Sprache, mit der viele relationale Datenbanken angesprochen werden.

Du kannst SQL verwenden, um:

  • Strukturen zu erstellen;
  • Daten zu lesen;
  • Datensätze hinzuzufügen;
  • Informationen zu ändern;
  • Datensätze zu löschen;
  • Daten aus verschiedenen Tabellen miteinander zu verknüpfen.

Die vier grundlegenden Operationen werden häufig unter dem Akronym CRUD zusammengefasst:

  • Create → erstellen
  • Read → lesen
  • Update → aktualisieren
  • Delete → löschen

Ein einfaches Beispiel

Angenommen, wir möchten die Buchungen eines bestimmten Benutzers abrufen. Eine entsprechende SQL-Abfrage könnte so aussehen:

SELECT id, start_time, status
FROM bookings
WHERE profile_id = 42
ORDER BY start_time;

Im Grunde sagen wir damit:

„Gib mir ID, Uhrzeit und Status der Buchungen von Benutzer 42, sortiert nach Uhrzeit.“

Mit SQL lassen sich auch Informationen aus verschiedenen Tabellen kombinieren. Zum Beispiel:

SELECT bookings.start_time, services.name
FROM bookings
JOIN services ON services.id = bookings.service_id;

Diese Abfrage verknüpft die Buchungen mit den zugehörigen Dienstleistungen, sodass neben der Uhrzeit auch der Name der jeweiligen Dienstleistung ausgegeben wird.

SQL ist deklarativ

Eine wichtige Eigenschaft von SQL ist, dass es sich um eine deklarative Sprache handelt. Du musst der Datenbank nicht unbedingt jeden einzelnen Schritt erklären, der zum Finden einer Information erforderlich ist. Du teilst ihr mit, welches Ergebnis du erhalten möchtest, und die Datenbank entscheidet, wie sie die Abfrage ausführt.

SQL ist außerdem ein weitverbreiteter Standard, auch wenn unterschiedliche Systeme eigene Funktionen und Erweiterungen bieten können. Für den Einstieg musst du nicht alles lernen. Ein Verständnis von Konzepten wie SELECT, Filter, JOINs, Gruppierungen, Constraints und Transaktionen reicht bereits aus, um eine solide Grundlage zu schaffen.

Was ist Postgres?

Hier ist eine wichtige Unterscheidung erforderlich: SQL ist die Sprache. Postgres ist die Datenbank.

Postgres, genauer gesagt PostgreSQL, ist ein quelloffenes relationales Datenbankmanagementsystem. Es ist die Software, die Daten speichert, Constraints durchsetzt und SQL-Abfragen interpretiert.

Du kannst dir das Verhältnis so vorstellen:

SQL → die Sprache, mit der du kommunizierst Postgres → das System, das die Daten speichert und verwaltet

Postgres unterstützt wichtige Funktionen wie:

  • Primär- und Fremdschlüssel
  • Transaktionen
  • Indizes
  • Views
  • Constraints
  • erweiterte Datentypen

Warum sind Transaktionen wichtig?

Stell dir einen Onlineshop vor. Wenn ein Kunde ein Produkt kauft, muss das System möglicherweise:

  1. die Bestellung erstellen;
  2. den Lagerbestand reduzieren;
  3. die Zahlung erfassen.

Diese Vorgänge hängen zusammen. Wenn der erste Schritt erfolgreich ist, der zweite aber fehlschlägt, könnte eine Bestellung erfasst sein, ohne dass der Lagerbestand aktualisiert wurde.

Mit Transaktionen lassen sich mehrere Vorgänge als eine einzige Einheit behandeln: Entweder werden alle erfolgreich abgeschlossen oder die Datenbank kann den vorherigen Zustand wiederherstellen.

Und was ist mit Indizes?

Indizes beschleunigen bestimmte Suchvorgänge. Wenn eine Anwendung regelmäßig nach den Buchungen eines Benutzers an einem bestimmten Datum suchen muss, kann ein Index diesen Vorgang deutlich effizienter machen. Indizes sind jedoch nicht kostenlos: Sie benötigen Speicherplatz und verursachen zusätzlichen Aufwand, wenn Daten geändert werden.

Deshalb ist es keine gute Praxis, automatisch jede Spalte zu indexieren. Ein Index sollte einem tatsächlichen Abfragemuster des Produkts entsprechen.

Was ist Supabase?

Wenn Postgres die Datenbank ist, dann ist Supabase eine Backend-Plattform, die auf Postgres aufbaut. Supabase ersetzt Postgres nicht.

Stattdessen ergänzt es Postgres um verschiedene Dienste, die normalerweise zum Erstellen von Webanwendungen benötigt werden, darunter:

  • Authentifizierung und Sitzungsverwaltung;
  • Dateispeicher;
  • Werkzeuge zur Datenbankverwaltung;
  • serverseitige Funktionen;
  • mit den Daten verknüpfte APIs;
  • Row Level Security.

Die wichtigste Unterscheidung lautet daher:

SQL ist die Sprache. Postgres ist die Datenbank. Supabase ist eine Backend-Plattform, die Postgres verwendet und zusätzliche Dienste für die Entwicklung von Anwendungen bereitstellt.

Diese Kombination ist besonders für Web-Apps nützlich, weil sich Daten, Benutzer, Dateien und Berechtigungen innerhalb einer integrierten Infrastruktur verwalten lassen.

Authentifizierung und Autorisierung: zwei verschiedene Dinge

Auch hier ist es sinnvoll, zwei Konzepte voneinander zu trennen. Authentifizierung beantwortet die Frage:

„Wer ist dieser Benutzer?“

Autorisierung beantwortet die Frage:

„Was darf dieser Benutzer tun?“

Supabase Auth kann Registrierung, Anmeldung und Sitzungen verwalten. Die Row Level Security (RLS) kann dagegen festlegen, welche Datenbankzeilen ein bestimmter Benutzer lesen oder ändern darf. Stell dir eine Buchungsplattform vor. Ein Kunde sollte Folgendes sehen können:

seine eigenen Buchungen.

Ein Administrator könnte dagegen Folgendes sehen:

alle Buchungen.

Beide sind authentifizierte Benutzer, besitzen jedoch unterschiedliche Berechtigungen.

Sicherheit darf nicht nur vom Frontend abhängen

Eine Schaltfläche in der Benutzeroberfläche auszublenden, hindert niemanden daran, einen Vorgang auszuführen. Ein Benutzer könnte versuchen, eine Anfrage direkt an das Backend zu senden.

Deshalb müssen Zugriffsregeln im Backend und in der Datenbank durchgesetzt werden, nicht nur in der Benutzeroberfläche. Genau hier wird Row Level Security wichtig: Damit lassen sich Zugriffsregeln direkt auf Datenbankebene definieren.

So funktionieren Datenbanken in Coderblock

In den standardmäßigen Web-Apps von Coderblock verfügt jedes Projekt über eine eigene Supabase-Umgebung mit Postgres, Auth, Storage, Deno Edge Functions und Row Level Security. Außerdem sind bereits eine grundlegende Profilstruktur und ein anfängliches Rollensystem vorhanden.

Der Unterschied besteht darin, dass du nicht unbedingt mit der manuellen Konfiguration der Datenbank beginnen musst. Du kannst im Chat beschreiben, was du erstellen möchtest.

Zum Beispiel:

„Füge Dienstleistungen mit Dauer, Preis und Aktivstatus hinzu.“

Danach:

„Erstelle Buchungen, die mit authentifizierten Benutzern verknüpft sind.“

Und anschließend:

„Verhindere, dass Kunden die Buchungen anderer Kunden sehen, und erstelle eine Verwaltungsansicht, in der alle Buchungen verwaltet werden können.“

Der Agent kann das Schema entwerfen, Migrationen anwenden, das React-Frontend mit dem Backend verbinden und die erforderlichen RLS-Richtlinien konfigurieren. Im Bereich Backend des Editors kannst du anschließend Tabellen, authentifizierte Benutzer, Storage und Funktionen überprüfen.

Die Live-Vorschau wird aktualisiert, während du die App über die Unterhaltung weiter bearbeitest.

Der beste Prompt lautet nicht „Erstelle eine Datenbank“

Wenn du mit einem KI-App-Builder arbeitest, solltest du dich nicht auf eine Anfrage wie diese beschränken:

„Erstelle eine Datenbank für eine Buchungs-App.“

Viel hilfreicher ist es, das Produktmodell zu beschreiben. Gib an:

  • welche Hauptentitäten es gibt;
  • welche Informationen sie enthalten müssen;
  • wie sie miteinander verknüpft sind;
  • welche Felder Pflichtfelder sind;
  • welche Benutzer auf die Daten zugreifen dürfen;
  • welche Aktionen sie ausführen dürfen.

So erhält die KI alle Informationen, die sie benötigt, um eine Produktbeschreibung in eine konsistente Datenstruktur umzuwandeln.

Bewährte Vorgehensweisen für den Einstieg in Datenbanken

Du musst kein Datenbankentwickler sein, um die häufigsten Fehler zu vermeiden.

Verwende stabile Identifikatoren

Jede wichtige Tabelle sollte einen Primärschlüssel besitzen. Verwende Daten wie Namen oder E-Mail-Adressen nicht als dauerhafte Identifikatoren, da sie sich ändern können.

Definiere Regeln möglichst nah an den Daten

Die Validierung im Frontend verbessert die Benutzererfahrung, sollte aber nicht den einzigen Schutz darstellen. Verwende:

  • Pflichtfelder;
  • Eindeutigkeits-Constraints;
  • Fremdschlüssel;
  • geeignete Datentypen;
  • Zugriffsrichtlinien.

So kann die Datenbank die Datenintegrität unabhängig davon schützen, woher eine Anfrage stammt.

Folge dem Prinzip der geringsten Rechte

Jeder Benutzer sollte nur die Berechtigungen besitzen, die er für seine Aufgaben benötigt. Teste die App deshalb mit verschiedenen Rollen:

  • anonymer Besucher;
  • authentifizierter Benutzer;
  • Administrator.

Prüfe immer, welche Daten jede Rolle lesen, erstellen, ändern oder löschen kann.

Verwalte das Schema über Migrationen

Datenbanken verändern sich gemeinsam mit den Produkten. Wenn du eine neue Funktion hinzufügst, musst du möglicherweise eine Tabelle erstellen, eine Spalte ergänzen oder eine Beziehung ändern. Mit kontrollierten Migrationen kannst du diese Änderungen nachvollziehen und das Risiko reduzieren, vorhandene Daten zu verlieren. Bevor du eine Spalte löschst oder eine Struktur veränderst, solltest du stets prüfen, ob sie nicht mehr verwendet wird.

Modelliere das Produkt, nicht die Benutzeroberfläche

Das ist vielleicht die wichtigste Regel. Eine Tabelle sollte ein reales Konzept des Produkts darstellen und nicht einfach eine Ansicht der Benutzeroberfläche. Das Design eines Dashboards kann sich vollständig ändern. Ein Kunde, eine Buchung oder eine Bestellung repräsentiert dagegen weiterhin dieselbe Entität. Wenn du zuerst über das Datenmodell nachdenkst, lässt sich auch das Frontend später leichter weiterentwickeln.

SQL, Postgres und Supabase: Was du wirklich wissen musst

Wenn du gerade erst anfängst, musst du dir nicht Dutzende Fachbegriffe merken.

Behalte einfach diesen Zusammenhang im Kopf:

SQL → die Sprache, mit der Daten abgefragt und geändert werden Postgres → die relationale Datenbank, die Daten speichert und Abfragen ausführt Supabase → die Backend-Plattform, die Postgres verwendet und Authentifizierung, Storage, APIs, Funktionen und Werkzeuge zum Erstellen von Webanwendungen ergänzt

In Coderblock sind diese Konzepte direkt in den Prozess der App-Erstellung integriert. Du kannst in natürlicher Sprache beschreiben, was sich deine Anwendung merken soll, wie die Daten miteinander verknüpft werden müssen und wer darauf zugreifen darf. Der Agent kann sich um die Full-Stack-Implementierung kümmern, während du das Ergebnis über den Chat überprüfst und verfeinerst.

Wenn du verstehst, wie Datenbanken funktionieren, kannst du etwas noch Wichtigeres tun: besser beschreiben, was du erstellen möchtest. Du musst nicht unbedingt selbst SQL schreiben. Wenn du jedoch weißt, was Tabellen, Beziehungen, Rollen, Constraints und Berechtigungen sind, kannst du eine Idee in eine Anwendung verwandeln, die Daten nicht nur anzeigt, sondern sie tatsächlich speichert, verknüpft und schützt.

Starte noch heute mit Coderblock