- Add database schema documentation: `Database_Schema_V1-V009.md` for tenant-isolated entities (`veranstaltungen`, `turniere`, `bewerbe`, etc.). - Draft initial Kassa API reference: `Kassa_API.md` (status: DRAFT). - Finalize Stammdaten API reference: `API_Uebersicht_Stammdaten.md` (status: ACTIVE). - Summarize tenant isolation and multi-tenant strategy in `Multi_Tenant_Kurz.md`. - Update `README.md` with links to new references. Mark B-2 roadmap tasks as partially complete.
4.3 KiB
| type | status | owner | last_update |
|---|---|---|---|
| Reference | ACTIVE | Backend Developer | 2026-04-03 |
Datenbankschema V1–V009 (Tenant‑Schema)
Quelle: Flyway‑Migrationen im Entries‑Service (backend/services/entries/entries-service/src/main/resources/db/tenant/), insbesondere V2__domain_hierarchy.sql.
Hinweis zur Architektur: Je Veranstaltung (Tenant) existiert ein eigenes Datenbankschema (ADR‑0021). Alle untenstehenden Tabellen werden pro Tenant‑Schema angelegt und sind somit mandantengetrennt.
Tabellenübersicht
veranstaltungen— Eine Veranstaltung (Singleton im Tenant‑Schema)turniere— Turniere einer Veranstaltung (1:N zuveranstaltungen)bewerbe— Bewerbe/Prüfungen eines Turniers (1:N zuturniere)abteilungen— Abteilungen/Heats eines Bewerbs (1:N zubewerbe)teilnehmer_konten— Aggregierte Salden eines Teilnehmers über alle Turniere der Veranstaltungturnier_kassa— Kassa‑Saldo pro Turnier
Detaillierte Definitionen (aus V2__domain_hierarchy.sql)
veranstaltungen
Primärschlüssel: id (UUID)
Spalten:
id UUID PRIMARY KEYcreated_at TIMESTAMPTZ NOT NULLupdated_at TIMESTAMPTZ NOT NULL
turniere
Primärschlüssel: id (UUID)
Fremdschlüssel: veranstaltung_id → veranstaltungen(id) ON DELETE CASCADE
Spalten:
id UUID PRIMARY KEYveranstaltung_id UUID NOT NULLoeps_turniernummer VARCHAR(50) NOT NULLcreated_at TIMESTAMPTZ NOT NULLupdated_at TIMESTAMPTZ NOT NULL
Indizes/Constraints:
UNIQUE (oeps_turniernummer)→uq_turniere_oeps_nrINDEX (veranstaltung_id)→idx_turniere_veranstaltung_id
bewerbe
Primärschlüssel: id (UUID)
Fremdschlüssel: turnier_id → turniere(id) ON DELETE CASCADE
Spalten:
id UUID PRIMARY KEYturnier_id UUID NOT NULLklasse VARCHAR(50) NOT NULLhoehe_cm INTEGER NULLbezeichnung TEXT NOT NULLcreated_at TIMESTAMPTZ NOT NULLupdated_at TIMESTAMPTZ NOT NULL
Indizes:
INDEX (turnier_id)→idx_bewerbe_turnier_idINDEX (klasse)→idx_bewerbe_klasse
abteilungen
Primärschlüssel: id (UUID)
Fremdschlüssel: bewerb_id → bewerbe(id) ON DELETE CASCADE
Spalten:
id UUID PRIMARY KEYbewerb_id UUID NOT NULLnr INTEGER NOT NULLbezeichnung TEXT NOT NULLtyp VARCHAR(32) NOT NULL(Werte:SEPARATE_SIEGEREHRUNG,ORGANISATORISCH)created_at TIMESTAMPTZ NOT NULLupdated_at TIMESTAMPTZ NOT NULL
Constraints/Indizes:
CHECK (typ IN ('SEPARATE_SIEGEREHRUNG','ORGANISATORISCH'))→chk_abteilungen_typUNIQUE (bewerb_id, nr)→uq_abteilungen_bewerb_nrINDEX (bewerb_id)→idx_abteilungen_bewerb_idINDEX (typ)→idx_abteilungen_typ
teilnehmer_konten
Primärschlüssel: id (UUID)
Fremdschlüssel: veranstaltung_id → veranstaltungen(id) ON DELETE CASCADE
Spalten:
id UUID PRIMARY KEYveranstaltung_id UUID NOT NULLteilnehmer_id UUID NOT NULLsaldo_cents BIGINT NOT NULL DEFAULT 0currency CHAR(3) NOT NULL DEFAULT 'EUR'created_at TIMESTAMPTZ NOT NULLupdated_at TIMESTAMPTZ NOT NULL
Indizes/Constraints:
UNIQUE (veranstaltung_id, teilnehmer_id)→uq_tkonten_veranstaltung_teilnehmerINDEX (veranstaltung_id)→idx_tkonten_veranstaltung_idINDEX (teilnehmer_id)→idx_tkonten_teilnehmer_id
turnier_kassa
Primärschlüssel: id (UUID)
Fremdschlüssel: turnier_id → turniere(id) ON DELETE CASCADE
Spalten:
id UUID PRIMARY KEYturnier_id UUID NOT NULLsaldo_cents BIGINT NOT NULL DEFAULT 0currency CHAR(3) NOT NULL DEFAULT 'EUR'created_at TIMESTAMPTZ NOT NULLupdated_at TIMESTAMPTZ NOT NULL
Indizes/Constraints:
UNIQUE (turnier_id)→uq_turnier_kassa_turnierINDEX (turnier_id)→idx_turnier_kassa_turnier_id
Versionierung / Flyway
- Die oben dokumentierten Tabellen sind in
V2__domain_hierarchy.sqldefiniert. - Weitere Migrationen V1–V009 betreffen Bootstrap/Erweiterungen; diese Seite wird fortlaufend ergänzt, sobald neue fachrelevante Strukturen hinzukommen.
Beziehungen (Kurz)
veranstaltungen (1) ──< (N) turniere (1) ──< (N) bewerbe (1) ──< (N) abteilungen
Separat aggregierend:
teilnehmer_kontenauf Veranstaltungsebene (pro Teilnehmer genau ein Konto)turnier_kassaauf Turnierebene (pro Turnier genau ein Kassa‑Eintrag)