meldestelle/docs/01_Architecture/Reference/Tenant-Konzept_Eine-Veranstaltung-eine-Datenbank.md

2.9 KiB
Raw Blame History

type status owner last_update sources
Architecture ACTIVE 🏗️ Lead Architect & 🧹 Curator 2026-04-02
docs/01_Architecture/adr/0021-tenant-resolution-strategy-de.md
Domain Workshop 2026-03-24

TenantKonzept: „Eine Veranstaltung = eine Datenbank“ (in einfacher Sprache)

Kurz gesagt: Jede Veranstaltung bekommt ihre eigene kleine Datenbank. So bleiben Daten sauber getrennt, und die Meldestelle kann offline sicher arbeiten, ohne andere Veranstaltungen zu berühren.


1. Warum machen wir das?

  • Sicherheit und Ordnung: Was zu Veranstaltung A gehört, landet nicht aus Versehen bei Veranstaltung B.
  • OfflineTauglichkeit: Eine Datenbank pro Veranstaltung ist klein, lokal und schnell zu sichern/verteilen.
  • Einfache Abrechnung: Die VeranstaltungsKassa und die TeilnehmerKonten sind klar auf EventEbene definiert.

2. Wie wird bestimmt, welche Datenbank benutzt wird?

Siehe ArchitekturEntscheidung (ADR0021):

  • Datei: docs/01_Architecture/adr/0021-tenant-resolution-strategy-de.md
  • Kerngedanke: Die App leitet aus dem aktuellen „Arbeitskontext“ (gewählte Veranstaltung) den Tenant ab. Alle Lese/SchreibOperationen gehen automatisch in die richtige EventDatenbank.

3. Auswirkungen im Überblick

a) DatenbankSchema (Backend)

  • Pro Veranstaltung ein eigenes Schema/Datei (z. B. event-{eventId}.db).
  • Tabellen wiederholen sich je Veranstaltung (z. B. turniere, bewerbe, abteilungen, startlisten, kassa_belege).
  • Keine Vermischung zwischen Veranstaltungen. Für Auswertungen über mehrere Veranstaltungen braucht es einen AggregationsProzess.

b) APIDesign

  • Jeder Request enthält implizit oder explizit den EventKontext (Header, Pfad oder SessionScope).
  • SchreibOperationen validieren, dass die ZielIDs (Turnier, Bewerb, Abteilung) zur aktuellen Veranstaltung gehören.
  • Export/Import: Datenpakete sind pro Veranstaltung abgegrenzt (leichte Weitergabe an Verband oder andere Systeme).

c) Frontend (Navigation & State)

  • Beim Eintritt in eine Veranstaltung wird der Tenant gesetzt; alle folgenden Screens arbeiten innerhalb dieses Kontexts.
  • Wechsel der Veranstaltung leert relevante Caches und setzt den BackStack definiertermaßen zurück (→ Navigation V2).
  • MultiTurnierFälle innerhalb EINER Veranstaltung bleiben möglich (Turnierkassa je Turnier, Konsolidierung in VeranstaltungsKassa).

4. Grenzen & Tradeoffs

  • CrossEventSuche/Auswertung erfordert separate Aggregation (bewusste Entscheidung zugunsten OfflineFirst und Sicherheit).
  • Datenmigration (z. B. Zusammenlegen/Teilen von Veranstaltungen) braucht Tools/Assistenten.

5. Beziehung zur Domäne

  • Ubiquitous Language: Veranstaltung ist die Root. Kassen und TeilnehmerKonten sind auf EventEbene verankert.
  • Zahlvorgänge können mehrere Rechnungen/Belege aus verschiedenen Turnieren derselben Veranstaltung ausgleichen.