PostgreSQL vs MongoDB
PostgreSQL, der Open-Source-Champion der relationalen Datenbanken, gegen MongoDB mit seinem flexiblen NoSQL-Dokumentmodell. Wie wählt man die richtige Datenbank für sein Datenmodell?
Läuft auf dem eigenen Server – eine seit 1986 gereifte relationale Open-Source-Datenbank
Eine verwaltete Open-Source-Backend-Plattform auf Basis von echtem PostgreSQL
Diese Entscheidung hat keine einzig richtige Antwort. Bist du ein kleines Team und hat Geschwindigkeit Priorität, ist Supabase die richtige Wahl: Auth, Storage, Realtime und Pooler sind vorhanden. Bei vorhersehbarer Last, einer Vorgabe zum Datenstandort (unter den 17 Regionen fehlt die Türkei) oder mit der Nutzerzahl wachsenden Kosten gewinnt selbst gehostetes PostgreSQL. Eine Warnung: Die offizielle Dokumentation schreibt, dass Managed Backup/PITR beim Self-Hosting entfällt — mit der Kontrolle erbst du den Restore-Test. Ein Backup anzulegen ist nicht das Kriterium; wiederherstellen zu können schon.
| Kategorie | Self-hosted PostgreSQL | Supabase |
|---|---|---|
| Performance | 8/10 | 8/10 |
| Erlernbarkeit | 5/10 | 8/10 |
| Ökosystem | 9/10 | 8/10 |
| Community | 9/10 | 9/10 |
| Arbeitsmarkt | 8/10 | 7/10 |
| Zukunftssicherheit | 8/10 | 8/10 |
# Self-hosted PostgreSQL - WAL-Archivierung + PITR-Einrichtung (postgresql.conf)
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /var/backups/pg_wal_archive/%f && cp %p /var/backups/pg_wal_archive/%f'
max_wal_senders = 3
# Basis-Backup erstellen (pg_basebackup)
pg_basebackup -D /var/backups/base -Ft -z -P -U replicator -h localhost
# PITR: Wiederherstellung auf einen bestimmten Zeitpunkt (recovery.signal + postgresql.conf)
# 1) Base-Backup in das Restore-Verzeichnis entpacken
# 2) Folgende Zeilen zu postgresql.conf hinzufügen, recovery.signal-Datei anlegen
restore_command = 'cp /var/backups/pg_wal_archive/%f %p'
recovery_target_time = '2026-09-23 09:00:00+03'
# pg_hba.conf - Verbindung nur vom Anwendungsserver
host appdb app_user 10.0.0.5/32 scram-sha-256
-- SQL (psql): Erweiterungsinstallation (volle Freiheit - self-host-spezifisch)
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pg_cron;
# Connection Pooling (PgBouncer, pgbouncer.ini)
[databases]
appdb = host=127.0.0.1 port=5432 dbname=appdb
[pgbouncer]
pool_mode = transaction
max_client_conn = 500
default_pool_size = 25-- SQL (Supabase SQL Editor): 1) Tabelle erstellen und RLS aktivieren (die Data API erfordert dies)
create table public.notes (
id uuid default gen_random_uuid() primary key,
user_id uuid references auth.users not null,
content text not null,
created_at timestamptz default now()
);
alter table public.notes enable row level security;
create policy "kullanicilar kendi notlarini okur"
on public.notes for select
using (auth.uid() = user_id);
create policy "kullanicilar kendi notlarini yazar"
on public.notes for insert
with check (auth.uid() = user_id);
// 2) Abfrage mit supabase-js (RLS wird automatisch angewendet)
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_ANON_KEY!
)
const { data: notes, error } = await supabase
.from('notes')
.select('id, content, created_at')
.order('created_at', { ascending: false })
// 3) Verbindungsstrings für den Postgres-Client (offizielle Tabelle "Endpoints and IP versions")
// Direct connection (persistenter Backend, pg_dump, Migration):
// postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres
// Dedicated pooler (nur Transaction-Modus, in kostenpflichtigen Plänen):
// postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:6543/postgres
// String manuell erstellen: aus dem Dashboard > Connect-Bildschirm kopieren (der Shared-Pooler-Host lässt sich nicht aus der Region ableiten).Diese Entscheidung hat keine einzig richtige Antwort. Bist du ein kleines Team und hat Geschwindigkeit Priorität, ist Supabase die richtige Wahl: Auth, Storage, Realtime und Pooler sind vorhanden. Bei vorhersehbarer Last, einer Vorgabe zum Datenstandort (unter den 17 Regionen fehlt die Türkei) oder mit der Nutzerzahl wachsenden Kosten gewinnt selbst gehostetes PostgreSQL. Eine Warnung: Die offizielle Dokumentation schreibt, dass Managed Backup/PITR beim Self-Hosting entfällt — mit der Kontrolle erbst du den Restore-Test. Ein Backup anzulegen ist nicht das Kriterium; wiederherstellen zu können schon.
Kostenlose Beratung erhaltenDa Supabase Standard-PostgreSQL verwendet, kannst du mit `pg_dump`/`pg_dumpall` oder über native Postgres-Replikation exportieren; die offizielle Dokumentation beschreibt die projektübergreifende Migration anhand eines Node.js-Skriptbeispiels (inklusive Auth/Storage). Supabase-spezifische Dienste wie Auth, Storage und Realtime auf der Self-Host-Seite neu aufzubauen (durch Betrieb des offiziellen Self-Host-Stacks mit Docker Compose) ist eine separate Aufgabe — Datenmigration und Herstellung der Dienstparität sind unterschiedliche Schritte.