docs: Phase D - Dokumentation Migration 009
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:
parent
f243b236be
commit
cedb97eb9b
|
|
@ -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!)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user