docs: Phase D - Dokumentation Migration 009
Some checks failed
Deploy Development / deploy (push) Successful in 40s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 5s
Test Suite / playwright-tests (push) Failing after 2m4s

Dokumentations-Updates:

DATABASE_SCHEMA.md:
- Version 0.3.4
- Migration 009 zur Historie hinzugefügt
- target_groups Struktur korrigiert (M:N statt 1:N)
- training_style_target_groups Junction-Tabelle dokumentiert
- Backend API Endpoints dokumentiert (5 neue)
- Frontend Admin-UI Änderungen dokumentiert

DOMAIN_MODEL.md:
- Version 0.3.4
- Dimension 3 (Zielgruppe) komplett überarbeitet
- Hierarchischer Kontext aktualisiert (M:N Architektur)
- Admin-UI Darstellung erklärt (Tree-View + Matrix + Global)
- BREAKING CHANGE klar gekennzeichnet

Fachlich:
- Zielgruppen sind jetzt GLOBAL (nicht mehr hierarchisch)
- M:N Zuordnung über Junction-Tabelle
- Wiederverwendbarkeit: Eine Zielgruppe → mehrere Stile

Version: 0.3.4
This commit is contained in:
Lars 2026-04-23 11:00:50 +02:00
parent f243b236be
commit cedb97eb9b
2 changed files with 93 additions and 41 deletions

View File

@ -1,7 +1,7 @@
# Shinkan Jinkendo - Fachliches Domänenmodell
**Version:** 0.2.0
**Stand:** 2026-04-23
**Version:** 0.3.4
**Stand:** 2026-04-23 (Migration 009: Target Groups M:N Refactoring)
**Basis:** `shinkan_anforderungsdokument_entwurf.md`
---
@ -40,39 +40,37 @@ Dieses Dokument beschreibt die **fachliche Datenstruktur** von Shinkan Jinkendo.
### 3. Hierarchischer Kontext (§8.1)
**Fachliche Grundstruktur:**
**Fachliche Grundstruktur (ab Migration 009 - M:N):**
```
Fokusbereich (Sportart/Bereich)
└─ Stil
└─ Zielgruppe
└─ Zielgruppen (M:N Zuordnung, wiederverwendbar)
```
**Beispiele:**
```
Karate
├─ Shotokan
│ ├─ Breitensportler
│ ├─ Leistungssportler
│ └─ Kinder
├─ Goju-Ryu
│ ├─ Erwachsene
│ └─ Jugendliche
└─ Wado-Ryu
└─ Gemischt
**🔄 ÄNDERUNG:** Zielgruppen sind global und können mehreren Stilen zugeordnet sein!
Selbstverteidigung
├─ Erwachsene
│ ├─ Männer
│ ├─ Frauen
│ └─ Gemischt
└─ Kinder
└─ 6-12 Jahre
Gewaltschutz
├─ Frauen
├─ Kinder
└─ Senioren
**Beispiel-Architektur (vereinfacht):**
```
Global definierte Zielgruppen:
├─ Breitensportler
├─ Leistungssportler
├─ Kinder
├─ Erwachsene
└─ Senioren
Zuordnungen (M:N):
Karate → Shotokan → [Breitensportler, Leistungssportler, Kinder]
Karate → Goju-Ryu → [Breitensportler, Erwachsene]
Karate → Wado-Ryu → [Leistungssportler]
Selbstverteidigung → [Erwachsene, Kinder, Senioren]
Gewaltschutz → [Kinder, Senioren]
```
**Admin-UI Darstellung:**
- **Tree-View (Tab "Hierarchie"):** Zeigt Fokusbereich → Stil → zugeordnete Zielgruppen
- **Matrix (Tab "Zuordnungen"):** Checkbox-Matrix: Stile × Zielgruppen
- **Global (Tab "Zielgruppen"):** Verwaltung aller Zielgruppen unabhängig von Stilen
**Bedeutung für Reifegradmodelle:**
@ -132,33 +130,42 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
### Dimension 3: Zielgruppe
**Definition:** Konkrete Trainingsempfänger-Gruppe innerhalb eines Stils.
**Definition:** Globale Trainingsempfänger-Gruppe, die MEHREREN Stilen zugeordnet werden kann (M:N).
**🔄 ÄNDERUNG ab Migration 009:** Zielgruppen sind NICHT mehr hierarchisch an Stile gebunden!
**Beispiele:**
- Breitensportler
- Leistungssportler
- Kinder (6-12 Jahre)
- Breitensportler (kann in Shotokan, Goju-Ryu, Wado-Ryu gültig sein)
- Leistungssportler (kann in verschiedenen Stilen genutzt werden)
- Kinder (6-12 Jahre) (stilunabhängig)
- Jugendliche (13-17 Jahre)
- Erwachsene
- Frauen
- Senioren
- Gemischt
**Hierarchie:**
- Gehört zu genau EINEM Trainingsstil
- Kann Altersbereich definieren
**Architektur (ab Migration 009):**
- ✅ **Global unabhängig:** Keine direkte FK zu `training_style_id`
- ✅ **M:N Zuordnung:** Über Junction-Tabelle `training_style_target_groups`
- ✅ **Wiederverwendbar:** Eine Zielgruppe kann mehreren Stilen zugeordnet sein
- ✅ **Primary Flag:** `is_primary` kennzeichnet Hauptzuordnung
**Eigenschaften:**
- Name, Beschreibung
- Stil-Zuordnung
- Optionale Altersangabe (min_age, max_age)
- Status
- **KEINE direkte Stil-Zuordnung mehr!**
**Verwaltung:**
- Admin-Level: Systemadmin, Vereinsadmin, Spartenadmin
- CRUD: Voll administrierbar
- Verschieben: Zwischen Stilen möglich
- Löschen: Cascade oder Restrict (konfigurierbar)
- CRUD: Voll administrierbar (global)
- Zuordnungen: Über M:N Matrix im Admin-UI
- Löschen: Nur wenn keine Übungen UND keine Stil-Zuordnungen
**Admin-UI:**
- Tab "Zielgruppen": Global verwalten (ohne Stil-Dropdown)
- Tab "Hierarchie": Tree-View (Fokusbereich → Stil → zugeordnete Zielgruppen)
- Tab "Zuordnungen": Checkbox-Matrix für M:N Assignments
### Dimension 4: Altersgruppen (separate Dimension!)

View File

@ -1,8 +1,8 @@
# Shinkan Jinkendo - Datenbank-Schema (Technisch)
**Version:** 0.2.0
**Version:** 0.3.4
**Stand:** 2026-04-23
**Aktuell deployed:** Migration 007 (idempotent)
**Aktuell deployed:** Migration 009 (Target Groups M:N Refactoring)
---
@ -26,6 +26,51 @@ Dieses Dokument beschreibt die **technische Datenbankstruktur** von Shinkan Jink
| 006 | 2026-04-21 | Training Planning | ✅ Deployed |
| 007 | 2026-04-22 | Exercise Catalogs (idempotent) | ✅ Deployed |
| 008 | 2026-04-23 | M:N Exercise Relations + Hierarchical Catalogs | ✅ Deployed |
| 009 | 2026-04-23 | **Target Groups M:N Refactoring** (BREAKING) | ✅ Deployed |
---
## Migration 009: Target Groups M:N Refactoring (BREAKING CHANGE)
**Problem:** Zielgruppen waren hierarchisch an Trainingsstile gebunden (1:N via FK `training_style_id`).
**Lösung:** M:N Beziehung über Junction-Tabelle `training_style_target_groups`.
**Änderungen:**
- ❌ **Entfernt:** `target_groups.training_style_id` (FK constraint + column)
- ✅ **Neu:** `training_style_target_groups` Junction-Tabelle
- ✅ **Migriert:** Alte Zuordnungen zu M:N (alle mit `is_primary = true`)
- ✅ **Architektur:** Eine Zielgruppe kann mehreren Stilen zugeordnet sein
**Neue Struktur:**
```sql
-- Global unabhängige Zielgruppen (KEINE training_style_id mehr)
target_groups (
id, name, description, min_age, max_age,
sort_order, status, created_at, updated_at
)
-- M:N Junction-Tabelle
training_style_target_groups (
id SERIAL PRIMARY KEY,
training_style_id INT REFERENCES training_styles(id) ON DELETE CASCADE,
target_group_id INT REFERENCES target_groups(id) ON DELETE CASCADE,
is_primary BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(training_style_id, target_group_id)
)
```
**Backend API:** 5 neue Endpoints:
- `GET /api/training-style-target-groups` (Liste mit Filtern + Enrichment)
- `POST /api/training-style-target-groups` (Upsert-Logik)
- `PUT /api/training-style-target-groups/{id}` (is_primary Flag)
- `DELETE /api/training-style-target-groups/{id}`
- `GET /api/training-styles/hierarchy` (Hierarchische Struktur für Tree-View)
**Frontend:**
- Admin-UI Tab "Hierarchie" (Tree-View: Fokusbereich → Stil → Zielgruppen)
- Admin-UI Tab "Zuordnungen" (Checkbox-Matrix für M:N)
- Tab "Zielgruppen" überarbeitet (global, ohne training_style_id Dropdown)
---