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

67 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
type: Architecture
status: ACTIVE
owner: 🏗️ Lead Architect & 🧹 Curator
last_update: 2026-04-02
sources:
- 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.