🐘 · Datenbank

PostgreSQL: Die Datenbank die alles kann

PostgreSQL ist die erste Wahl wenn relationale Daten, JSON-Dokumente, Volltext-Suche und Vektor-Suche in einer Datenbank zusammenkommen sollen. Robust, erweiterbar, kostenlos – und auf jedem Server in Minuten deployt.

SQLpgvectorJSONBDockerBackups

PostgreSQL für Automatisierungen und KI-Projekte

Warum PostgreSQL statt SQLite oder MySQL? Drei überzeugende Gründe für moderne Projekte:

  • JSONB: JSON-Dokumente als natives Typ speichern und indizieren – relationale und dokumentenbasierte Daten in einer Datenbank. Für n8n-Workflow-Daten ideal.
  • pgvector: Extension für Vektor-Suche direkt in PostgreSQL – kein separater Vektordatenbank-Service nötig. Für RAG-Systeme und Embeddings der pragmatischste Ansatz wenn schon PostgreSQL läuft.
  • Full-Text-Search: tsvector und tsquery – deutsche Stemming-Unterstützung eingebaut. Für Suche in eigenen Inhalten ohne Elasticsearch.
-- pgvector: Ähnlichkeitssuche in PostgreSQL CREATE EXTENSION vector; CREATE TABLE dokumente ( id SERIAL PRIMARY KEY, inhalt TEXT, embedding vector(768) ); -- Nearest Neighbor Search SELECT inhalt FROM dokumente ORDER BY embedding <-> '[0.1, 0.2, ...]' LIMIT 5;

PostgreSQL mit Docker betreiben

PostgreSQL als Docker Compose-Service ist der Standard für selbst gehostete Setups:

  • Persistenz: Volume für /var/lib/postgresql/data – ohne Volume gehen Daten beim Container-Neustart verloren
  • Connection Pooling: PgBouncer als Middleware für Anwendungen die viele kurze Verbindungen öffnen – reduziert PostgreSQL-Last massiv
  • Backups: pg_dump -Fc datenbankname > backup.dump für konsistente Backups. Automatisiert per Cron, Upload zu S3/Backblaze.
  • Versionen: Postgres 16 ist aktuell empfohlen. Image: postgres:16-alpine für kleinere Container-Größe

n8n, Gitea, Nextcloud und viele andere Services unterstützen PostgreSQL als Backend – eine Instanz für mehrere Services (separate Datenbanken, separate Nutzer).

Performance und Monitoring

PostgreSQL läuft gut mit Standardkonfiguration – aber ein paar Anpassungen helfen:

  • shared_buffers: 25% des verfügbaren RAMs. Standard sind 128 MB – auf einem 4-GB-Server sollte es 1 GB sein.
  • EXPLAIN ANALYZE: Für langsame Queries – zeigt den Execution Plan und wo Zeit verloren geht. pg_stat_statements Extension zeigt die teuersten Queries.
  • Indizes: Fehlendes Index ist die häufigste Performance-Ursache. CREATE INDEX CONCURRENTLY fügt Indizes ohne Table Lock hinzu.
  • Monitoring: postgres_exporter für Prometheus-Metriken, Grafana-Dashboard für Visualisierung

Häufige Fragen zu PostgreSQL

SQLite für: Einzel-Nutzer-Apps, Prototypen, wenn die App die einzige ist die auf die Daten zugreift. PostgreSQL für: alles was mehr als einen gleichzeitigen Schreiber hat, wenn pgvector oder JSONB gebraucht wird, oder wenn die App produktiv genutzt wird. Wechsel später ist aufwändig – im Zweifel PostgreSQL.

Direkt im Docker Container: `docker exec -it postgres psql -U username datenbankname`. Von außen: `psql "postgresql://user:pass@host:5432/db"`. Grafisches Tool: DBeaver (kostenlos, alle Plattformen) oder pgAdmin 4 als Docker Container.

Nie Port 5432 direkt ins Internet öffnen. Separate DB-User mit minimalen Rechten pro Anwendung (nur SELECT/INSERT/UPDATE, kein DROP). Starke Passwörter, in `.env`-Datei gespeichert. Backups verschlüsseln bevor sie das Haus verlassen.

Migrations-Tool nutzen: Alembic für Python/SQLAlchemy, Flyway oder Liquibase für Java, Prisma Migrate für Node. Nie Schema direkt in Produktion ändern ohne Migration. Immer Backup vor Migration. Rollback-Migration vorbereiten bevor die Forward-Migration ausgeführt wird.