[{"data":1,"prerenderedAt":154},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Fdecisions\u002F002-convex-backend":4,"surround-de-\u002Fdeveloper\u002Fdecisions\u002F002-convex-backend":145},[],{"id":5,"title":6,"body":7,"description":137,"extension":138,"meta":139,"navigation":140,"path":141,"seo":142,"stem":143,"__hash__":144},"content_de\u002F3.developer\u002Fdecisions\u002F3.002-convex-backend.md","ADR-002: Convex als Backend",{"type":8,"value":9,"toc":130},"minimark",[10,27,32,36,39,60,64,72,76,81,101,106],[11,12,13,21],"ul",{},[14,15,16,20],"li",{},[17,18,19],"strong",{},"Status:"," Angenommen",[14,22,23,26],{},[17,24,25],{},"Datum:"," 2024-06-15",[28,29,31],"h2",{"id":30},"kontext","Kontext",[33,34,35],"p",{},"Owlat braucht ein Backend, das Echtzeit-Updates der Oberfläche unterstützt (Zusammenarbeit im E-Mail-Editor, Live-Kampagnenstatistiken), komplexe Abfragen bewältigt (Segmentauswertung, Kontaktfilterung) und ohne Infrastrukturverwaltung skaliert.",[33,37,38],{},"Die wichtigsten betrachteten Optionen:",[40,41,42,48,54],"ol",{},[14,43,44,47],{},[17,45,46],{},"Klassische REST-API + PostgreSQL"," — volle Kontrolle, erfordert aber das Betreiben von Servern, das Schreiben einer Echtzeit-Synchronisierung (WebSockets), den Aufbau einer ORM-Schicht und den Umgang mit Migrationen.",[14,49,50,53],{},[17,51,52],{},"Firebase\u002FFirestore"," — Echtzeit ab Werk, aber eingeschränkte Abfragemöglichkeiten, keine Mitverortung serverseitiger Logik und Vendor-Lock-in bei schwächerer TypeScript-Unterstützung.",[14,55,56,59],{},[17,57,58],{},"Convex"," — Echtzeitfähige Serverless-Datenbank mit TypeScript-Funktionen, die beim Schema mitverortet sind, automatischer Reaktivität und ACID-Transaktionen.",[28,61,63],{"id":62},"entscheidung","Entscheidung",[33,65,66,67,71],{},"Convex als Backend-Plattform verwenden. Sämtliche serverseitige Logik liegt in ",[68,69,70],"code",{},"apps\u002Fapi\u002Fconvex\u002F"," als TypeScript-Funktionen (Queries, Mutations, Actions und Crons).",[28,73,75],{"id":74},"konsequenzen","Konsequenzen",[33,77,78],{},[17,79,80],{},"Ermöglicht:",[11,82,83,86,89,92,95,98],{},[14,84,85],{},"Echtzeit-Reaktivität ohne WebSocket-Boilerplate — UI-Komponenten abonnieren Queries und aktualisieren sich automatisch",[14,87,88],{},"Durchgängiges TypeScript vom Schema bis zur API — die Schemadefinition erzeugt typisierte Dokument-Interfaces",[14,90,91],{},"Mitverortete Serverlogik — Queries, Mutations und Crons liegen direkt neben dem Schema, auf dem sie arbeiten",[14,93,94],{},"Eingebautes Scheduling (Crons) für wiederkehrende Aufgaben wie Kampagnenversand und Aufräumarbeiten",[14,96,97],{},"Automatische Skalierung — kein Server-Provisioning, keine Verwaltung von Connection Pools",[14,99,100],{},"ACID-Transaktionen über mehrere Tabellen hinweg ohne manuelles Transaktionsmanagement",[33,102,103],{},[17,104,105],{},"Trade-offs:",[11,107,108,111,114,120,127],{},[14,109,110],{},"Abhängigkeit vom Anbieter Convex — eine Migration ist schwieriger als bei einem gewöhnlichen PostgreSQL-Setup",[14,112,113],{},"Die Abfragesprache ist Convex-spezifisch (kein SQL) — neue Mitwirkende müssen die Convex-API lernen",[14,115,116,117],{},"Kein direkter SQL-Zugriff für komplexe analytische Abfragen — die Segmentauswertung erfordert eigene Logik in ",[68,118,119],{},"conditions\u002FsegmentMatch.ts",[14,121,122,123,126],{},"Grenzen der Funktionsausführung (Zeit, Speicher) schränken Batch-Operationen ein — große Importe müssen über ",[68,124,125],{},"integrationImports\u002F"," in Blöcke zerlegt werden",[14,128,129],{},"Die lokale Entwicklung erfordert einen Convex-Account und ein aktives Deployment (kein vollständig offline nutzbarer Modus)",{"title":131,"searchDepth":132,"depth":132,"links":133},"",2,[134,135,136],{"id":30,"depth":132,"text":31},{"id":62,"depth":132,"text":63},{"id":74,"depth":132,"text":75},"Warum sich Owlat für Convex und gegen PostgreSQL und Firebase entschieden hat — wegen Echtzeit-Reaktivität, mitverorteter TypeScript-Logik und Skalierung ohne Konfigurationsaufwand.","md",{},true,"\u002Fdeveloper\u002Fdecisions\u002F002-convex-backend",{"title":6,"description":137},"3.developer\u002Fdecisions\u002F3.002-convex-backend","G3DMhjV_lHndMu3LjZeg311UyKq7W9TX3IltnuN9hME",[146,150],{"title":147,"path":148,"stem":149,"children":-1},"ADR-001: Eigener E-Mail-Renderer statt MJML","\u002Fdeveloper\u002Fdecisions\u002F001-custom-email-renderer","3.developer\u002Fdecisions\u002F2.001-custom-email-renderer",{"title":151,"path":152,"stem":153,"children":-1},"ADR-003: Notion-artiger E-Mail-Builder","\u002Fdeveloper\u002Fdecisions\u002F003-notion-like-builder","3.developer\u002Fdecisions\u002F4.003-notion-like-builder",1786915110439]