docs: Dokumentation aktualisiert für Skills-Import Complete
Updates: - DATABASE_SCHEMA.md v0.4.0 (Migration 022+023, Skills-Hierarchie) - DOMAIN_MODEL.md v0.4.0 (Fähigkeiten-Domäne, Fokusbereich-Zuordnung) - MEDIAWIKI_IMPORT_SPEC.md v1.1 (Skills via Migration statt API) - PROJECT_STATUS.md (NEU - Projekt-Übersicht & Deployment-Status) Änderungen: - 69 Skills mit Kategorisierung dokumentiert - Haupt-/Unterkategorien (KARATE/ALLGEMEINE) - Fokusbereich-Zuordnung (karate/universal) - Level-Definitionen-Schema - Migration 021 als DEPRECATED markiert - Deployment-Status aktualisiert - Lessons Learned dokumentiert
This commit is contained in:
parent
e8eba57b3a
commit
5626be792f
218
.claude/docs/PROJECT_STATUS.md
Normal file
218
.claude/docs/PROJECT_STATUS.md
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
# Shinkan Jinkendo - Projekt-Status
|
||||
|
||||
**Stand:** 2026-04-27
|
||||
**Version:** 0.4.0
|
||||
**Branch:** develop
|
||||
**Letzter Commit:** e8eba57
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
**Aktueller Meilenstein:** MediaWiki Import - Skills Complete ✅
|
||||
|
||||
**Letzte Änderungen:**
|
||||
- ✅ Migration 022: Skills-Schema komplett (skill_main_categories, focus_areas, level_definitions)
|
||||
- ✅ Migration 023: 69 Skills importiert mit vollständiger Kategorisierung
|
||||
- ✅ Duplikat-Bereinigung und Fokusbereich-Zuordnung (karate/universal)
|
||||
- ✅ Scripts erstellt (parse_matrix.py, generate_migration_023_direct.py)
|
||||
|
||||
**Nächste Schritte:**
|
||||
1. Test: Übungs-Import mit neuen Skills
|
||||
2. Optional: Level-Definitionen (1-5) aus Matrix extrahieren
|
||||
3. Admin-UI für Skill-Kategorien (CRUD)
|
||||
4. Deployment nach Prod vorbereiten
|
||||
|
||||
---
|
||||
|
||||
## Deployed Migrations (Dev: 023, Prod: TBD)
|
||||
|
||||
| Migration | Beschreibung | Dev | Prod |
|
||||
|-----------|--------------|-----|------|
|
||||
| 001-017 | Initial Schema + Exercise System | ✅ | ✅ |
|
||||
| 018 | Wiki Import Tracking | ✅ | ✅ |
|
||||
| 019 | Exercises Optional Fields | ✅ | ✅ |
|
||||
| 020 | Exercise Skills UNIQUE Constraint | ✅ | 🔲 |
|
||||
| 021 | ~~Import Skills from Matrix~~ (DEPRECATED) | ⚠️ | ❌ |
|
||||
| **022** | **Skills Schema Complete** | ✅ | 🔲 |
|
||||
| **023** | **Skills Complete Import (69 Skills)** | ✅ | 🔲 |
|
||||
|
||||
---
|
||||
|
||||
## Aktuelle Datenbank-Stats (Dev)
|
||||
|
||||
```
|
||||
Skills: 69 (32 KARATE + 37 ALLGEMEINE)
|
||||
Skill Main Categories: 2 (KARATE Fähigkeiten, ALLGEMEINE sportliche Fähigkeiten)
|
||||
Skill Categories: 9 (Kihon, Kumite, Kata, Selbstverteidigung, Koordination, ...)
|
||||
Übungen (MediaWiki): 221 (importiert, mit Skill-Zuordnungen)
|
||||
Focus Areas: 5
|
||||
Style Directions: 15
|
||||
Target Groups: 12
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Feature-Status
|
||||
|
||||
### ✅ Deployed Features (Dev)
|
||||
|
||||
**Kern-System:**
|
||||
- [x] Auth & Profile Management
|
||||
- [x] Organisation (Clubs, Divisions, Groups)
|
||||
- [x] Kataloge (Focus Areas, Styles, Target Groups - M:N)
|
||||
|
||||
**Übungen:**
|
||||
- [x] CRUD (Create, Read, Update, Delete)
|
||||
- [x] M:N Beziehungen (Focus Areas, Styles, Target Groups, Skills)
|
||||
- [x] Varianten & Medien
|
||||
- [x] Suche & Filter (erweitert)
|
||||
- [x] Exercise Blocks (Bausteine)
|
||||
- [x] Saved Searches
|
||||
|
||||
**MediaWiki Import:**
|
||||
- [x] Import-Tracking (wiki_import_log, wiki_import_references)
|
||||
- [x] Übungs-Import via API (221 Übungen)
|
||||
- [x] Skills via Migration 023 (69 Skills mit Kategorisierung)
|
||||
- [x] Duplikat-Erkennung
|
||||
- [x] Reimport-Flag
|
||||
|
||||
**Skills-System:**
|
||||
- [x] Hierarchisches Schema (Haupt-/Unterkategorien)
|
||||
- [x] Fokusbereich-Zuordnung (karate/universal)
|
||||
- [x] Exercise-Skill Assignments mit Levels (1-5)
|
||||
- [x] Level-Definitionen-Schema (noch nicht gefüllt)
|
||||
|
||||
**Admin-UI:**
|
||||
- [x] Focus Areas, Styles, Target Groups CRUD
|
||||
- [x] Hierarchie-View (Tree)
|
||||
- [x] M:N Zuordnungen (Checkbox-Matrix)
|
||||
- [x] MediaWiki Import-UI
|
||||
- [x] Import-Log-Ansicht
|
||||
|
||||
### 🔲 In Arbeit
|
||||
|
||||
**Skills:**
|
||||
- [ ] Admin-UI für Skill-Kategorien (CRUD)
|
||||
- [ ] Level-Definitionen aus Matrix extrahieren (optional)
|
||||
- [ ] Skills-Beschreibungen aus Wiki importieren
|
||||
- [ ] Skill-Filter in Übungssuche
|
||||
|
||||
**Training Planning:**
|
||||
- [ ] Training Units (CRUD)
|
||||
- [ ] Exercise Assignment zu Units
|
||||
- [ ] Kalender-View
|
||||
|
||||
**Frontend:**
|
||||
- [ ] Responsive Design (Mobile)
|
||||
- [ ] Dark Mode
|
||||
- [ ] Offline-Modus (PWA)
|
||||
|
||||
### 📋 Geplant (Backlog)
|
||||
|
||||
**KI-Features:**
|
||||
- [ ] Trainingsplan-Generator (basierend auf Fähigkeiten-Level)
|
||||
- [ ] Übungs-Empfehlungen
|
||||
- [ ] Reifegradmodelle (automatische Bewertung)
|
||||
|
||||
**Import/Export:**
|
||||
- [ ] Trainingsmethoden-Import aus Wiki
|
||||
- [ ] Bulk-Export (Excel/PDF)
|
||||
- [ ] Import aus anderen Systemen
|
||||
|
||||
**Kollaboration:**
|
||||
- [ ] Übungs-Review-Workflow
|
||||
- [ ] Kommentare & Bewertungen
|
||||
- [ ] Teilen & Favoriten
|
||||
|
||||
---
|
||||
|
||||
## Technische Schulden
|
||||
|
||||
| Bereich | Issue | Priorität |
|
||||
|---------|-------|-----------|
|
||||
| Skills | Migration 021 löschen (faulty) | Niedrig |
|
||||
| Import | Reimport-Flag-Bug (wird manchmal als false gespeichert) | Mittel |
|
||||
| Import | DNS-Fehler sporadisch (temporär, retry hilft) | Niedrig |
|
||||
| DB | 9 Duplikate in DB bereinigen (aus Migration 021) | Niedrig |
|
||||
|
||||
---
|
||||
|
||||
## Lessons Learned (Session 2026-04-27)
|
||||
|
||||
**✅ Funktioniert gut:**
|
||||
- Direkte SQL-Generierung aus Matrix (ohne CSV-Zwischenschritt)
|
||||
- UTF-8 Encoding explizit setzen (sys.stdout.reconfigure)
|
||||
- Duplikat-Bereinigung nach fachlicher Logik (nicht automatisch)
|
||||
- Verifikation-Queries direkt in Migration einbauen
|
||||
|
||||
**❌ Vermeiden:**
|
||||
- CSV als Zwischenschritt (Encoding-Probleme)
|
||||
- Automatisches Parsing ohne manuelle Duplikat-Prüfung
|
||||
- Fehlende Schema-Erweiterung vor Daten-Import
|
||||
- Unvollständige "Schnellschuss"-Migrationen (wie 021)
|
||||
|
||||
**📚 Best Practices:**
|
||||
- Schema VOR Daten importieren
|
||||
- Cleanup VOR Insert (DELETE old data)
|
||||
- Verifikation NACH Insert (count, Verteilung)
|
||||
- Produktionsreifer Import: Vollständig oder gar nicht
|
||||
|
||||
---
|
||||
|
||||
## Deployment-Status
|
||||
|
||||
### Dev-System (192.168.2.49:8098/3098)
|
||||
|
||||
```
|
||||
Branch: develop
|
||||
Migrations: 023 (latest)
|
||||
Skills: 69 ✅
|
||||
Übungen: 221 ✅
|
||||
Status: Stabil, bereit für Testing
|
||||
```
|
||||
|
||||
### Prod-System (TBD)
|
||||
|
||||
```
|
||||
Branch: main
|
||||
Migrations: 019 (veraltet)
|
||||
Skills: 0
|
||||
Übungen: 0
|
||||
Status: Wartet auf Migration 020-023 Deployment
|
||||
```
|
||||
|
||||
**Deployment-Plan:**
|
||||
1. ✅ Dev-Testing abgeschlossen (Migration 022+023)
|
||||
2. 🔲 Test: Übungs-Import mit neuen Skills
|
||||
3. 🔲 Code-Review + QA
|
||||
4. 🔲 Prod-Deployment (Migration 020-023)
|
||||
5. 🔲 Daten-Import auf Prod (Übungen + Skills)
|
||||
6. 🔲 Smoke-Tests auf Prod
|
||||
|
||||
---
|
||||
|
||||
## Dokumentation-Status
|
||||
|
||||
| Dokument | Pfad | Stand | Status |
|
||||
|----------|------|-------|--------|
|
||||
| Database Schema | `technical/DATABASE_SCHEMA.md` | 2026-04-27 | ✅ Aktuell |
|
||||
| Domain Model | `functional/DOMAIN_MODEL.md` | 2026-04-27 | ✅ Aktuell |
|
||||
| MediaWiki Import Spec | `technical/MEDIAWIKI_IMPORT_SPEC.md` | 2026-04-27 | ✅ Aktuell |
|
||||
| Session Handover | `.claude/handover/session-2026-04-27-skills-complete.md` | 2026-04-27 | ✅ Komplett |
|
||||
| API Reference | `technical/EXERCISES_API_SPEC.md` | 2026-04-24 | ⚠️ Veraltet |
|
||||
| Frontend Routing | `technical/EXERCISES_FRONTEND_ROUTING.md` | 2026-04-23 | ⚠️ Veraltet |
|
||||
|
||||
---
|
||||
|
||||
## Team & Kontakte
|
||||
|
||||
**Entwicklung:** Claude Code
|
||||
**Product Owner:** Lars
|
||||
**Git Repository:** http://192.168.2.144:3000/Lars/shinkan-jinkendo
|
||||
**Wiki (Datenquelle):** https://karatetrainer.net
|
||||
|
||||
---
|
||||
|
||||
**Letzte Aktualisierung:** 2026-04-27
|
||||
**Nächstes Review:** Nach Prod-Deployment
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
# Shinkan Jinkendo - Fachliches Domänenmodell
|
||||
|
||||
**Version:** 0.3.4
|
||||
**Stand:** 2026-04-23 (Migration 009: Target Groups M:N Refactoring)
|
||||
**Basis:** `shinkan_anforderungsdokument_entwurf.md`
|
||||
**Version:** 0.4.0
|
||||
**Stand:** 2026-04-27 (Migration 023: Skills Complete Import)
|
||||
**Basis:** `shinkan_anforderungsdokument_entwurf.md` + Fähigkeitsmatrix
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -27,6 +27,27 @@ Dieses Dokument beschreibt die **fachliche Datenstruktur** von Shinkan Jinkendo.
|
|||
|
||||
**Konsequenz:** Ein globaler Katalog, aber kontextabhängige Ausprägung über Reifegradmodelle.
|
||||
|
||||
**🆕 Hierarchische Struktur (ab Migration 022):**
|
||||
```
|
||||
Haupt-Kategorie (KARATE / ALLGEMEINE)
|
||||
└─ Unter-Kategorie (Kihon, Kumite, Kondition, etc.)
|
||||
└─ Fähigkeit
|
||||
└─ Level-Definitionen (1-5)
|
||||
```
|
||||
|
||||
**🆕 Fokusbereich-Zuordnung (ab Migration 022):**
|
||||
- **Karate-spezifisch** (`focus_areas: ["karate"]`)
|
||||
- Beispiele: Kata Ablauf, Kihon, Bunkai, Dachi Waza
|
||||
- Nur relevant für Karate-Training
|
||||
|
||||
- **Universal** (`focus_areas: ["universal"]`)
|
||||
- Beispiele: Maximalkraft, Konzentration, Deeskalation, Flexibilität
|
||||
- Relevant für ALLE Trainingsbereiche (Karate, Selbstverteidigung, Gewaltschutz)
|
||||
|
||||
**Später möglich:** Mehrfachzuordnung
|
||||
- `["karate", "selbstverteidigung"]` - Fähigkeit in beiden Bereichen relevant
|
||||
- `["karate", "gewaltschutz"]` - etc.
|
||||
|
||||
### 2. Mehrfachzuordnung von Übungen (§10.7)
|
||||
|
||||
**Prinzip:** Eine Übung kann mehreren Bereichen GLEICHZEITIG zugeordnet sein.
|
||||
|
|
@ -188,6 +209,161 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
|
|||
|
||||
---
|
||||
|
||||
## Fähigkeiten-Domäne (§8.3, erweitert ab Migration 022+023)
|
||||
|
||||
### Fähigkeiten-Hierarchie
|
||||
|
||||
**🆕 3-Ebenen-Struktur (ab Migration 022):**
|
||||
|
||||
```
|
||||
Haupt-Kategorie (2 Stück)
|
||||
├─ KARATE Fähigkeiten
|
||||
│ ├─ Kihon (Unterkategorie)
|
||||
│ │ ├─ Dachi Waza (Fähigkeit, Level 1-5)
|
||||
│ │ ├─ Uke Waza
|
||||
│ │ └─ ...
|
||||
│ ├─ Kumite
|
||||
│ ├─ Kata
|
||||
│ └─ Selbstverteidigung
|
||||
│
|
||||
└─ ALLGEMEINE sportliche Fähigkeiten
|
||||
├─ Koordination (Unterkategorie)
|
||||
│ ├─ Orientierung (Fähigkeit, Level 1-5)
|
||||
│ └─ ...
|
||||
├─ Kondition
|
||||
├─ Kognition
|
||||
├─ Soziale Fähigkeiten
|
||||
└─ Psychische Fähigkeiten
|
||||
```
|
||||
|
||||
### Haupt-Kategorien
|
||||
|
||||
**1. KARATE Fähigkeiten** (`focus_areas: ["karate"]`)
|
||||
- **Anzahl:** 32 Skills
|
||||
- **Bedeutung:** Karate-spezifische Techniken und Fähigkeiten
|
||||
- **Verwendung:** Nur für Karate-Training relevant
|
||||
- **Unterkategorien:** Kihon, Kumite, Kata, Selbstverteidigung
|
||||
|
||||
**2. ALLGEMEINE sportliche Fähigkeiten** (`focus_areas: ["universal"]`)
|
||||
- **Anzahl:** 37 Skills
|
||||
- **Bedeutung:** Universelle sportliche und mentale Fähigkeiten
|
||||
- **Verwendung:** Für ALLE Trainingsbereiche einsetzbar
|
||||
- **Unterkategorien:** Koordination, Kondition, Kognition, Soziale Fähigkeiten, Psychische Fähigkeiten
|
||||
|
||||
### Unterkategorien
|
||||
|
||||
#### KARATE Fähigkeiten
|
||||
|
||||
**Kihon (Grundtechniken) - 10 Skills:**
|
||||
- Dachi Waza (Standtechniken)
|
||||
- Uke Waza (Blocktechniken)
|
||||
- Zuki Waza (Stoßtechniken)
|
||||
- Uchi Waza (Schlagtechniken)
|
||||
- Geri Waza (Tritttechniken)
|
||||
- Nage Waza (Wurftechniken)
|
||||
- Nukite Waza (Fingerstichtechniken)
|
||||
- Ken Waza (Fausttechniken)
|
||||
- Hüfteinsatz
|
||||
- Kime (Fokussierung)
|
||||
|
||||
**Kumite (Kampf) - 10 Skills:**
|
||||
- Beinarbeit
|
||||
- Distanzkontrolle
|
||||
- Angriff
|
||||
- Abwehr Konter
|
||||
- Präzision
|
||||
- Antizipation
|
||||
- Timing
|
||||
- Taktik
|
||||
- Fokus
|
||||
- Mentale Stärke
|
||||
|
||||
**Kata (Formen) - 8 Skills:**
|
||||
- Technik Kombination
|
||||
- Kata Ablauf
|
||||
- Bunkai (Anwendung)
|
||||
- Oyo (Variation)
|
||||
- Henka (Veränderung)
|
||||
- Kakushi (Versteckte Techniken)
|
||||
- Kata Atmung
|
||||
- Kata Rhythmus
|
||||
|
||||
**Selbstverteidigung - 4 Skills:**
|
||||
- Gefahrenbewustsein
|
||||
- Selbstbehauptung
|
||||
- Selbstschutz
|
||||
- Gefahrenabwehr
|
||||
|
||||
#### ALLGEMEINE sportliche Fähigkeiten
|
||||
|
||||
**Koordination - 7 Skills:**
|
||||
- Orientierung
|
||||
- Differenzierung
|
||||
- Kopplung
|
||||
- Gleichgewicht
|
||||
- Rhythmisierung
|
||||
- Reaktion
|
||||
- Umstellung
|
||||
|
||||
**Kondition - 15 Skills:**
|
||||
- Kraftfähigkeiten: Maximalkraft, Schnellkraft, Reaktivkraft, Kraftausdauer, Muskelaufbau
|
||||
- Schnelligkeitsfähigkeiten: Reaktionsschnelligkeit, Bewegungsschnelligkeit, Handlungsschnelligkeit, Schnelligkeitsausdauer
|
||||
- Ausdauerfähigkeiten: Grundlagenausdauer, Aerobe Ausdauer, Anaerobe Ausdauer
|
||||
- Regenerationsfähigkeiten: Regenerationsfähigkeit, Ermüdungswiderstandsfähigkeit
|
||||
- Beweglichkeit: Flexibilität
|
||||
|
||||
**Kognition - 5 Skills:**
|
||||
- Aufmerksamkeit
|
||||
- Wahrnehmung
|
||||
- Urteilsvermögen
|
||||
- Merkfähigkeit
|
||||
- Lernfähigkeit
|
||||
|
||||
**Psychische Fähigkeiten - 6 Skills:**
|
||||
- Selbstvertrauen
|
||||
- Konzentration
|
||||
- Emotionale Kontrolle
|
||||
- Motivation
|
||||
- Stressresistenz
|
||||
- Stressregulation
|
||||
|
||||
**Soziale Fähigkeiten - 4 Skills:**
|
||||
- Deeskalation
|
||||
- Selbstdisziplin
|
||||
- Toleranz
|
||||
- Fairness
|
||||
|
||||
### Level-Definitionen (Reifegradmodell)
|
||||
|
||||
**Konzept:** Jede Fähigkeit hat 5 Stufen mit konkreten Beschreibungen.
|
||||
|
||||
**Struktur (noch nicht vollständig implementiert):**
|
||||
- **Level 1:** Einsteiger - Grundlegende Ausführung
|
||||
- **Level 2:** Grundlagen - Kontrollierte Ausführung
|
||||
- **Level 3:** Aufbau - Sichere Anwendung
|
||||
- **Level 4:** Fortgeschritten - Variable Anwendung
|
||||
- **Level 5:** Experte - Meisterhafte Beherrschung
|
||||
|
||||
**Beispiel (Dachi Waza - Standtechniken):**
|
||||
- Level 1: Stabiler Stand mit Schwerpunkt und richtiger Ausrichtung
|
||||
- Level 2: Korrekter Stand mit guter Balance in verschiedenen Positionen
|
||||
- Level 3: Fließender Wechsel zwischen Ständen mit Kontrolle
|
||||
- Level 4: Dynamische Stand-Variationen unter Belastung
|
||||
- Level 5: Perfekte Stand-Technik in allen Kampfsituationen
|
||||
|
||||
**Datenbankstruktur:**
|
||||
```sql
|
||||
skill_level_definitions (
|
||||
skill_id,
|
||||
level (1-5),
|
||||
description (Text aus Fähigkeitsmatrix)
|
||||
)
|
||||
```
|
||||
|
||||
**Status:** Schema vorhanden (Migration 022), Daten noch nicht importiert (optional für spätere Phase).
|
||||
|
||||
---
|
||||
|
||||
## Übungs-Zuordnungslogik (§10)
|
||||
|
||||
### Primäre vs. Sekundäre Zuordnung
|
||||
|
|
@ -223,19 +399,23 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
|
|||
**Beispiel:** "Kumite-Drill"
|
||||
|
||||
**Hauptfähigkeiten:**
|
||||
- Distanzgefühl (Intensität: hoch)
|
||||
- Timing (Intensität: hoch)
|
||||
- Distanzkontrolle (Kumite, target_level: 3, intensity: hoch)
|
||||
- Timing (Kumite, target_level: 3, intensity: hoch)
|
||||
|
||||
**Nebenfähigkeiten:**
|
||||
- Beinarbeit (Intensität: mittel)
|
||||
- Reaktionsfähigkeit (Intensität: mittel)
|
||||
- Beinarbeit (Kumite, target_level: 2, intensity: mittel)
|
||||
- Reaktion (Koordination, target_level: 2, intensity: mittel)
|
||||
|
||||
**Attribute pro Fähigkeitsbezug:**
|
||||
- is_primary (Haupt- oder Nebenfähigkeit)
|
||||
- intensity (niedrig/mittel/hoch)
|
||||
- development_contribution (Entwicklungsbeitrag)
|
||||
- required_level (Voraussetzung)
|
||||
- target_level (Ziel-Level)
|
||||
- required_level (Voraussetzung, 1-5)
|
||||
- target_level (Ziel-Level, 1-5)
|
||||
|
||||
**🆕 Fokusbereich-Filterung:**
|
||||
- Bei Übungen mit Fokusbereich "Karate" sollten primär KARATE-Fähigkeiten zugeordnet werden
|
||||
- ALLGEMEINE Fähigkeiten können als Nebenfähigkeiten hinzugefügt werden
|
||||
- Bei universellen Übungen (Selbstverteidigung, Gewaltschutz) bevorzugt ALLGEMEINE Fähigkeiten
|
||||
|
||||
### Trainingscharakter (§10.7)
|
||||
|
||||
|
|
@ -314,12 +494,45 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
|
|||
- Offiziell (Standardinhalte)
|
||||
|
||||
**Zusätzlich:** Thematische Einschränkungen
|
||||
- Karate-Inhalte
|
||||
- Karate-Inhalte (nur Übungen mit `focus_areas: ["karate"]`)
|
||||
- Selbstverteidigungs-Inhalte
|
||||
- Gewaltschutz-Inhalte
|
||||
|
||||
---
|
||||
|
||||
## MediaWiki Import (ab Migration 018)
|
||||
|
||||
### Import-Typen
|
||||
|
||||
**1. Übungen** (`import_type: exercise`)
|
||||
- Quelle: https://karatetrainer.net `Kategorie:Übungen`
|
||||
- Import-Modus: Vollständig mit Skill-Zuordnungen
|
||||
- Status: ✅ Produktiv (221 Übungen importiert)
|
||||
|
||||
**2. Fähigkeiten** (`import_type: skill`)
|
||||
- Quelle: https://karatetrainer.net `Kategorie:Fähigkeitsbeschreibung`
|
||||
- Import-Modus: DEPRECATED - Nutze Migration 023 stattdessen
|
||||
- Status: ⚠️ Migration 021 fehlerhaft, ersetzt durch Migration 023
|
||||
|
||||
**3. Trainingsmethoden** (`import_type: method`)
|
||||
- Quelle: https://karatetrainer.net `Kategorie:Methodenbeschreibung`
|
||||
- Import-Modus: Vollständig
|
||||
- Status: 🔲 Noch nicht implementiert
|
||||
|
||||
### Import-Tracking
|
||||
|
||||
**Duplikat-Erkennung:**
|
||||
- Über `wiki_import_references` Tabelle
|
||||
- Verknüpfung `wiki_page_id` → `local_id`
|
||||
- Reimport aktualisiert bestehende Einträge
|
||||
|
||||
**Import-Metadaten:**
|
||||
- `import_source = 'mediawiki'`
|
||||
- `import_id` = Wiki-Seitentitel
|
||||
- `wiki_page_id` = MediaWiki interne Page-ID
|
||||
|
||||
---
|
||||
|
||||
## Admin-Workflows
|
||||
|
||||
### Fokusbereich anlegen
|
||||
|
|
@ -344,7 +557,7 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
|
|||
- Ziel-Fokusbereich existiert
|
||||
- Keine Namenskonflikte
|
||||
5. System aktualisiert:
|
||||
- `training_styles.focus_area_id`
|
||||
- `style_directions.focus_area_id`
|
||||
- Alle abhängigen Zielgruppen bleiben erhalten
|
||||
6. System loggt Änderung
|
||||
7. Erfolg-Meldung
|
||||
|
|
@ -358,7 +571,7 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
|
|||
2. Klickt "Löschen"
|
||||
3. System prüft Abhängigkeiten:
|
||||
```sql
|
||||
SELECT COUNT(*) FROM training_styles WHERE focus_area_id = :id
|
||||
SELECT COUNT(*) FROM style_directions WHERE focus_area_id = :id
|
||||
SELECT COUNT(*) FROM exercise_focus_areas WHERE focus_area_id = :id
|
||||
```
|
||||
4. **Falls verwendet:**
|
||||
|
|
@ -396,15 +609,15 @@ Jede Kombination (Fokusbereich + Stil + Zielgruppe) kann ein eigenes Reifegradmo
|
|||
|
||||
## Nächste Schritte
|
||||
|
||||
- [ ] Hierarchie-UI Wireframes erstellen
|
||||
- [ ] Admin-CRUD-Endpoints spezifizieren
|
||||
- [ ] Cascade-Logik detaillieren
|
||||
- [ ] Umrouten-Workflows implementieren
|
||||
- [ ] Migration 008 Entwurf finalisieren
|
||||
- [ ] Tests für alle Admin-Operationen
|
||||
- [ ] Level-Definitionen aus Fähigkeitsmatrix extrahieren (optional)
|
||||
- [ ] Skills-Beschreibungen aus Wiki importieren (Migration 024)
|
||||
- [ ] Admin-UI für Fähigkeiten-Kategorien (CRUD)
|
||||
- [ ] Skill-Filter in Übungssuche integrieren
|
||||
- [ ] Reifegradmodelle definieren (Kombination Fokusbereich + Stil + Zielgruppe)
|
||||
- [ ] KI-Unterstützung für Trainingsplanung (basierend auf Fähigkeiten-Level)
|
||||
|
||||
---
|
||||
|
||||
**Letzte Aktualisierung:** 2026-04-23
|
||||
**Letzte Aktualisierung:** 2026-04-27
|
||||
**Verantwortlich:** Claude Code
|
||||
**Review:** Pending
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# Shinkan Jinkendo - Datenbank-Schema (Technisch)
|
||||
|
||||
**Version:** 0.3.4
|
||||
**Stand:** 2026-04-23
|
||||
**Aktuell deployed:** Migration 009 (Target Groups M:N Refactoring)
|
||||
**Version:** 0.4.0
|
||||
**Stand:** 2026-04-27
|
||||
**Aktuell deployed:** Migration 023 (Skills Complete Import)
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -26,55 +26,140 @@ 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 |
|
||||
| 009 | 2026-04-23 | Target Groups M:N Refactoring (BREAKING) | ✅ Deployed |
|
||||
| 010 | 2026-04-23 | Rename training_styles to style_directions | ✅ Deployed |
|
||||
| 011 | 2026-04-23 | Create Training Types | ✅ Deployed |
|
||||
| 012 | 2026-04-23 | Exercise Training Characters + Trainer Contexts | ✅ Deployed |
|
||||
| 013 | 2026-04-23 | Training Types Focus Area | ✅ Deployed |
|
||||
| 014 | 2026-04-24 | Variant Progression Search Legacy | ✅ Deployed |
|
||||
| 016 | 2026-04-24 | Saved Searches | ✅ Deployed |
|
||||
| 017 | 2026-04-24 | Exercise Blocks | ✅ Deployed |
|
||||
| 018 | 2026-04-24 | Wiki Import Tracking | ✅ Deployed |
|
||||
| 019 | 2026-04-24 | Exercises Optional Fields (goal/execution nullable) | ✅ Deployed |
|
||||
| 020 | 2026-04-27 | Exercise Skills UNIQUE Constraint | ✅ Deployed |
|
||||
| 021 | 2026-04-27 | ~~Import Skills from Matrix~~ (DEPRECATED) | ⚠️ Faulty |
|
||||
| **022** | **2026-04-27** | **Skills Schema Complete (BREAKING)** | ✅ Deployed |
|
||||
| **023** | **2026-04-27** | **Skills Complete Import (69 Skills)** | ✅ Deployed |
|
||||
|
||||
---
|
||||
|
||||
## Migration 009: Target Groups M:N Refactoring (BREAKING CHANGE)
|
||||
## Migration 022: Skills Schema Complete (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`.
|
||||
**Problem:** Skills hatten keine Kategorisierung (Haupt-/Unterkategorie, Fokusbereich).
|
||||
**Lösung:** Vollständiges hierarchisches Schema für produktionsreifen Import.
|
||||
|
||||
**Ä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:**
|
||||
**Neue Tabellen:**
|
||||
```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
|
||||
-- Haupt-Kategorien (KARATE / ALLGEMEINE)
|
||||
skill_main_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(200) UNIQUE NOT NULL, -- "KARATE Fähigkeiten" / "ALLGEMEINE sportliche Fähigkeiten"
|
||||
slug VARCHAR(50) UNIQUE NOT NULL, -- "karate" / "allgemeine"
|
||||
description TEXT,
|
||||
sort_order INT,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
)
|
||||
|
||||
-- M:N Junction-Tabelle
|
||||
training_style_target_groups (
|
||||
-- Level-Definitionen (1-5 Beschreibungen aus Fähigkeitsmatrix)
|
||||
skill_level_definitions (
|
||||
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,
|
||||
skill_id INT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
|
||||
level INT NOT NULL CHECK (level BETWEEN 1 AND 5),
|
||||
description TEXT NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(training_style_id, target_group_id)
|
||||
updated_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE (skill_id, level)
|
||||
)
|
||||
```
|
||||
|
||||
**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)
|
||||
**Erweiterte Tabellen:**
|
||||
```sql
|
||||
-- skill_categories erweitert
|
||||
ALTER TABLE skill_categories ADD COLUMN slug VARCHAR(50);
|
||||
ALTER TABLE skill_categories ADD COLUMN main_category_id INT REFERENCES skill_main_categories(id);
|
||||
ALTER TABLE skill_categories ADD CONSTRAINT skill_categories_slug_unique UNIQUE (slug);
|
||||
|
||||
**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)
|
||||
-- skills erweitert
|
||||
ALTER TABLE skills ADD COLUMN main_category_id INT REFERENCES skill_main_categories(id);
|
||||
ALTER TABLE skills ADD COLUMN focus_areas JSONB DEFAULT '[]'::jsonb;
|
||||
```
|
||||
|
||||
**Indizes:**
|
||||
- `idx_skills_main_category_id`
|
||||
- `idx_skills_category_id`
|
||||
- `idx_skill_categories_main_category_id`
|
||||
- `idx_skill_level_definitions_skill_id`
|
||||
|
||||
**Struktur:**
|
||||
```
|
||||
skill_main_categories (Hauptkategorie)
|
||||
└─ skill_categories (Unterkategorie)
|
||||
└─ skills (Fähigkeit)
|
||||
└─ skill_level_definitions (Level 1-5 Beschreibungen)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Kern-Entitäten (Stand Migration 007)
|
||||
## Migration 023: Skills Complete Import
|
||||
|
||||
**Quelle:** Fähigkeitsmatrix (https://karatetrainer.net/index.php?title=Fähigkeitsmatrix)
|
||||
|
||||
**Importiert:**
|
||||
- **69 Skills** mit vollständiger Kategorisierung
|
||||
- **2 Haupt-Kategorien:** KARATE Fähigkeiten, ALLGEMEINE sportliche Fähigkeiten
|
||||
- **9 Unterkategorien:** Kihon, Kumite, Kata, Selbstverteidigung, Koordination, Kondition, Kognition, Soziale Fähigkeiten, Psychische Fähigkeiten
|
||||
|
||||
**Skills-Verteilung:**
|
||||
```
|
||||
KARATE Fähigkeiten (32 Skills, focus_areas: ["karate"]):
|
||||
├─ Kata (8): Technik Kombination, Kata Ablauf, Bunkai, Oyo, Henka, Kakushi, Kata Atmung, Kata Rhythmus
|
||||
├─ Kihon (10): Dachi Waza, Uke Waza, Zuki Waza, Uchi Waza, Geri Waza, Nage Waza, Nukite Waza, Ken Waza, Hüfteinsatz, Kime
|
||||
├─ Kumite (10): Beinarbeit, Distanzkontrolle, Angriff, Abwehr Konter, Präzision, Antizipation, Timing, Taktik, Fokus, Mentale Stärke
|
||||
└─ Selbstverteidigung (4): Gefahrenbewustsein, Selbstbehauptung, Selbstschutz, Gefahrenabwehr
|
||||
|
||||
ALLGEMEINE sportliche Fähigkeiten (37 Skills, focus_areas: ["universal"]):
|
||||
├─ Kognition (5): Aufmerksamkeit, Wahrnehmung, Urteilsvermögen, Merkfähigkeit, Lernfähigkeit
|
||||
├─ Kondition (15): Maximalkraft, Schnellkraft, Reaktivkraft, Kraftausdauer, Muskelaufbau,
|
||||
│ Reaktionsschnelligkeit, Bewegungsschnelligkeit, Handlungsschnelligkeit,
|
||||
│ Schnelligkeitsausdauer, Grundlagenausdauer, Aerobe Ausdauer, Anaerobe Ausdauer,
|
||||
│ Regenerationsfähigkeit, Ermüdungswiderstandsfähigkeit, Flexibilität
|
||||
├─ Koordination (7): Orientierung, Differenzierung, Kopplung, Gleichgewicht, Rhythmisierung, Reaktion, Umstellung
|
||||
├─ Psychische Fähigkeiten (6): Selbstvertrauen, Konzentration, Emotionale Kontrolle, Motivation, Stressresistenz, Stressregulation
|
||||
└─ Soziale Fähigkeiten (4): Deeskalation, Selbstdisziplin, Toleranz, Fairness
|
||||
```
|
||||
|
||||
**Duplikat-Handling:**
|
||||
Einige Skills kommen in der Matrix doppelt vor (Kumite + Kondition/Koordination):
|
||||
- **Behalten in Kondition:** Anaerobe Ausdauer, Bewegungsschnelligkeit, Flexibilität, Reaktionsschnelligkeit, Schnelligkeitsausdauer (konditionelle Primärfähigkeiten)
|
||||
- **Behalten in Kumite:** Antizipation, Timing (kampfspezifisch)
|
||||
|
||||
**Cleanup:**
|
||||
- DELETE FROM exercise_skills (M:N Beziehungen)
|
||||
- DELETE FROM skills (alte Daten)
|
||||
- DELETE FROM skill_categories
|
||||
- DELETE FROM skill_main_categories
|
||||
|
||||
**Verifikation:**
|
||||
```sql
|
||||
-- Sollte 69 ergeben
|
||||
SELECT COUNT(*) FROM skills;
|
||||
|
||||
-- Zeigt Verteilung
|
||||
SELECT
|
||||
mc.name AS hauptkategorie,
|
||||
sc.name AS unterkategorie,
|
||||
COUNT(s.id) AS anzahl_skills
|
||||
FROM skills s
|
||||
JOIN skill_categories sc ON s.category_id = sc.id
|
||||
JOIN skill_main_categories mc ON s.main_category_id = mc.id
|
||||
GROUP BY mc.name, sc.name, mc.sort_order, sc.sort_order
|
||||
ORDER BY mc.sort_order, sc.sort_order;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Kern-Entitäten
|
||||
|
||||
### Auth & Profile
|
||||
|
||||
|
|
@ -91,29 +176,91 @@ divisions (id, club_id, name, description, ...)
|
|||
training_groups (id, division_id, name, description, focus_area, level, ...)
|
||||
```
|
||||
|
||||
### Kataloge (Einfache FK-Struktur - zu refactoren)
|
||||
### Kataloge
|
||||
|
||||
**ACHTUNG:** Aktuell 1:1 Beziehungen - fachlich inkorrekt!
|
||||
#### Fokusbereiche & Stile (M:N mit Zielgruppen)
|
||||
|
||||
```sql
|
||||
focus_areas (id, name, abbreviation, description, color, icon, ...)
|
||||
training_styles (id, name, abbreviation, description, parent_style_id, ...)
|
||||
training_characters (id, name, description, ...)
|
||||
skill_categories (id, name, description, parent_category_id, ...)
|
||||
style_directions (id, focus_area_id, name, abbreviation, description, parent_style_id, ...)
|
||||
target_groups (id, name, description, min_age, max_age, ...) -- Global, NICHT gebunden an Stil
|
||||
training_style_target_groups (style_direction_id, target_group_id, is_primary) -- M:N Junction
|
||||
```
|
||||
|
||||
### Übungen (Aktuell - zu refactoren)
|
||||
#### Fähigkeiten (Hierarchisches Schema ab Migration 022)
|
||||
|
||||
```sql
|
||||
-- Haupt-Kategorien (2: KARATE, ALLGEMEINE)
|
||||
skill_main_categories (
|
||||
id, name, slug, description, sort_order, created_at, updated_at
|
||||
)
|
||||
|
||||
-- Unterkategorien (9: Kihon, Kumite, Kata, Selbstverteidigung, Koordination, Kondition, ...)
|
||||
skill_categories (
|
||||
id, name, slug, description, sort_order,
|
||||
main_category_id REFERENCES skill_main_categories(id),
|
||||
parent_category_id, -- Optional: Hierarchie
|
||||
created_at, updated_at
|
||||
)
|
||||
|
||||
-- Fähigkeiten (69 Skills)
|
||||
skills (
|
||||
id, name, description,
|
||||
category_id REFERENCES skill_categories(id),
|
||||
main_category_id REFERENCES skill_main_categories(id),
|
||||
focus_areas JSONB, -- ["karate"] oder ["universal"]
|
||||
created_at, updated_at
|
||||
)
|
||||
|
||||
-- Level-Definitionen (optional, noch nicht gefüllt)
|
||||
skill_level_definitions (
|
||||
id, skill_id, level, description,
|
||||
created_at, updated_at,
|
||||
UNIQUE (skill_id, level)
|
||||
)
|
||||
```
|
||||
|
||||
**Focus Areas Bedeutung:**
|
||||
- `["karate"]` - Skill ist spezifisch für Karate (z.B. Kata Ablauf, Kihon)
|
||||
- `["universal"]` - Skill ist universell einsetzbar (z.B. Maximalkraft, Konzentration, Deeskalation)
|
||||
- Später möglich: `["karate", "selbstverteidigung"]` - Mehrfachzuordnung
|
||||
|
||||
#### Trainingscharakter
|
||||
|
||||
```sql
|
||||
training_characters (id, name, description, ...)
|
||||
trainer_contexts (id, name, description, ...) -- Neue Dimension (Migration 012)
|
||||
```
|
||||
|
||||
### Übungen (M:N Beziehungen ab Migration 008)
|
||||
|
||||
```sql
|
||||
exercises (
|
||||
id, title, summary, goal, execution, preparation, trainer_notes,
|
||||
focus_area_id, -- ❌ 1:1 - sollte M:N sein
|
||||
training_style_id, -- ❌ 1:1 - sollte M:N sein
|
||||
training_character_id, -- ❌ 1:1 - sollte M:N sein
|
||||
visibility, status, created_by, club_id, ...
|
||||
duration_min, duration_max,
|
||||
group_size_min, group_size_max,
|
||||
equipment JSONB,
|
||||
visibility, status, created_by, club_id,
|
||||
import_source, import_id, wiki_page_id, -- MediaWiki Import (Migration 018)
|
||||
created_at, updated_at
|
||||
)
|
||||
|
||||
exercise_skills (exercise_id, skill_id, is_primary, intensity, ...)
|
||||
-- M:N Beziehungen
|
||||
exercise_focus_areas (exercise_id, focus_area_id, is_primary)
|
||||
exercise_style_directions (exercise_id, style_direction_id, is_primary)
|
||||
exercise_target_groups (exercise_id, target_group_id, is_primary)
|
||||
exercise_age_groups (exercise_id, age_group) -- Enum: Minis, Kinder, Schüler, Teenager, Erwachsene
|
||||
|
||||
-- Fähigkeiten-Zuordnung (mit Level)
|
||||
exercise_skills (
|
||||
exercise_id, skill_id,
|
||||
is_primary, intensity,
|
||||
required_level INT, -- Voraussetzung (1-5)
|
||||
target_level INT, -- Ziel (1-5)
|
||||
UNIQUE (exercise_id, skill_id) -- Migration 020
|
||||
)
|
||||
|
||||
-- Varianten & Medien
|
||||
exercise_variants (id, exercise_id, name, description, ...)
|
||||
exercise_media (id, exercise_id, type, url, title, description, ...)
|
||||
```
|
||||
|
|
@ -123,119 +270,77 @@ exercise_media (id, exercise_id, type, url, title, description, ...)
|
|||
```sql
|
||||
training_units (id, group_id, date, title, description, ...)
|
||||
training_unit_exercises (training_unit_id, exercise_id, sort_order, ...)
|
||||
exercise_blocks (id, name, description, created_by, club_id, ...) -- Migration 017
|
||||
```
|
||||
|
||||
### MediaWiki Import (Migration 018)
|
||||
|
||||
```sql
|
||||
wiki_import_log (
|
||||
id, category, import_type, import_status,
|
||||
items_total, items_imported, items_skipped, items_failed,
|
||||
error_log JSONB,
|
||||
started_at, finished_at,
|
||||
imported_by
|
||||
)
|
||||
|
||||
wiki_import_references (
|
||||
id, wiki_page_id, entity_type, local_id,
|
||||
created_at, updated_at
|
||||
)
|
||||
```
|
||||
|
||||
**Import-Typen:**
|
||||
- `exercise` - Übungen aus `Kategorie:Übungen`
|
||||
- `skill` - Fähigkeiten aus `Kategorie:Fähigkeitsbeschreibung` (veraltet, nutze Migration 023)
|
||||
- `method` - Trainingsmethoden aus `Kategorie:Methodenbeschreibung`
|
||||
|
||||
---
|
||||
|
||||
## Indizes
|
||||
|
||||
### Performance-Indizes
|
||||
|
||||
```sql
|
||||
-- Hierarchie-Lookups
|
||||
CREATE INDEX idx_style_directions_focus_area ON style_directions(focus_area_id);
|
||||
CREATE INDEX idx_skill_categories_main_category ON skill_categories(main_category_id);
|
||||
CREATE INDEX idx_skills_category ON skills(category_id);
|
||||
CREATE INDEX idx_skills_main_category ON skills(main_category_id);
|
||||
|
||||
-- M:N Joins
|
||||
CREATE INDEX idx_exercise_focus_areas_exercise ON exercise_focus_areas(exercise_id);
|
||||
CREATE INDEX idx_exercise_focus_areas_focus ON exercise_focus_areas(focus_area_id);
|
||||
CREATE INDEX idx_exercise_style_directions_exercise ON exercise_style_directions(exercise_id);
|
||||
CREATE INDEX idx_exercise_style_directions_style ON exercise_style_directions(style_direction_id);
|
||||
CREATE INDEX idx_exercise_target_groups_exercise ON exercise_target_groups(exercise_id);
|
||||
CREATE INDEX idx_exercise_target_groups_target ON exercise_target_groups(target_group_id);
|
||||
CREATE INDEX idx_exercise_skills_exercise ON exercise_skills(exercise_id);
|
||||
CREATE INDEX idx_exercise_skills_skill ON exercise_skills(skill_id);
|
||||
|
||||
-- Import-Tracking
|
||||
CREATE INDEX idx_wiki_import_references_wiki_page ON wiki_import_references(wiki_page_id);
|
||||
CREATE INDEX idx_wiki_import_references_entity ON wiki_import_references(entity_type, local_id);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Geplante Änderungen (Migration 008)
|
||||
|
||||
### Hierarchische Katalog-Struktur
|
||||
|
||||
**Fachliche Anforderung (§8.1 Anforderungsdokument):**
|
||||
```
|
||||
Fokusbereich → Stil → Zielgruppe
|
||||
```
|
||||
|
||||
**Neue Struktur:**
|
||||
|
||||
```sql
|
||||
-- Level 1: Fokusbereiche (Root)
|
||||
focus_areas (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) UNIQUE NOT NULL,
|
||||
abbreviation VARCHAR(20),
|
||||
description TEXT,
|
||||
color VARCHAR(20),
|
||||
icon VARCHAR(50),
|
||||
sort_order INT,
|
||||
status VARCHAR(50) DEFAULT 'active'
|
||||
)
|
||||
|
||||
-- Level 2: Trainingsstile (untergeordnet zu Fokusbereich)
|
||||
training_styles (
|
||||
id SERIAL PRIMARY KEY,
|
||||
focus_area_id INT REFERENCES focus_areas(id), -- Hierarchie-Link
|
||||
name VARCHAR(100) NOT NULL,
|
||||
abbreviation VARCHAR(20),
|
||||
description TEXT,
|
||||
parent_style_id INT REFERENCES training_styles(id), -- Optional: Sub-Stile
|
||||
sort_order INT,
|
||||
status VARCHAR(50) DEFAULT 'active'
|
||||
)
|
||||
|
||||
-- Level 3: Zielgruppen (untergeordnet zu Stil)
|
||||
target_groups (
|
||||
id SERIAL PRIMARY KEY,
|
||||
training_style_id INT REFERENCES training_styles(id), -- Hierarchie-Link
|
||||
name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
min_age INT,
|
||||
max_age INT,
|
||||
sort_order INT,
|
||||
status VARCHAR(50) DEFAULT 'active'
|
||||
)
|
||||
```
|
||||
|
||||
### M:N Übungs-Zuordnungen
|
||||
|
||||
```sql
|
||||
-- Übung → Fokusbereiche (M:N)
|
||||
exercise_focus_areas (
|
||||
id SERIAL PRIMARY KEY,
|
||||
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
||||
focus_area_id INT REFERENCES focus_areas(id),
|
||||
is_primary BOOLEAN DEFAULT false,
|
||||
UNIQUE(exercise_id, focus_area_id)
|
||||
)
|
||||
|
||||
-- Übung → Stile (M:N)
|
||||
exercise_styles (
|
||||
id SERIAL PRIMARY KEY,
|
||||
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
||||
training_style_id INT REFERENCES training_styles(id),
|
||||
is_primary BOOLEAN DEFAULT false,
|
||||
UNIQUE(exercise_id, training_style_id)
|
||||
)
|
||||
|
||||
-- Übung → Zielgruppen (M:N)
|
||||
exercise_target_groups (
|
||||
id SERIAL PRIMARY KEY,
|
||||
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
||||
target_group_id INT REFERENCES target_groups(id),
|
||||
is_primary BOOLEAN DEFAULT false,
|
||||
UNIQUE(exercise_id, target_group_id)
|
||||
)
|
||||
|
||||
-- Übung → Altersgruppen (M:N - separate Dimension)
|
||||
exercise_age_groups (
|
||||
id SERIAL PRIMARY KEY,
|
||||
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
|
||||
age_group VARCHAR(50) NOT NULL, -- 'Minis', 'Kinder', 'Schüler', 'Teenager', 'Erwachsene'
|
||||
UNIQUE(exercise_id, age_group)
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Kaskadier-Regeln (Geplant)
|
||||
## Kaskadier-Regeln
|
||||
|
||||
### Fokusbereich löschen
|
||||
|
||||
**Verhalten:** `RESTRICT` (Löschen verweigern wenn verwendet)
|
||||
|
||||
**Alternativen:**
|
||||
1. **Umrouten:** Alle abhängigen Stile auf neuen Fokusbereich setzen
|
||||
2. **Archivieren:** Status auf 'archived' setzen statt löschen
|
||||
|
||||
**Implementierung:**
|
||||
**Prüfung:**
|
||||
```sql
|
||||
-- Prüfung vor Löschen:
|
||||
SELECT COUNT(*) FROM training_styles WHERE focus_area_id = :id
|
||||
SELECT COUNT(*) FROM style_directions WHERE focus_area_id = :id
|
||||
SELECT COUNT(*) FROM exercise_focus_areas WHERE focus_area_id = :id
|
||||
|
||||
-- Falls verwendet → HTTP 409 Conflict mit Hinweis
|
||||
```
|
||||
|
||||
**Alternativen:**
|
||||
1. Umrouten: Alle abhängigen Stile auf neuen Fokusbereich setzen
|
||||
2. Archivieren: Status auf 'archived' setzen statt löschen
|
||||
|
||||
### Stil löschen
|
||||
|
||||
**Verhalten:** `RESTRICT` wenn Zielgruppen oder Übungen zugeordnet
|
||||
|
|
@ -243,63 +348,41 @@ SELECT COUNT(*) FROM exercise_focus_areas WHERE focus_area_id = :id
|
|||
**Umrouten-Workflow:**
|
||||
1. Admin wählt Ziel-Stil
|
||||
2. System aktualisiert:
|
||||
- `target_groups.training_style_id`
|
||||
- `exercise_styles.training_style_id`
|
||||
- `training_style_target_groups.style_direction_id`
|
||||
- `exercise_style_directions.style_direction_id`
|
||||
3. Löschen erlaubt
|
||||
|
||||
### Zielgruppe löschen
|
||||
|
||||
**Verhalten:** `SET NULL` oder `CASCADE` in `exercise_target_groups`
|
||||
|
||||
---
|
||||
|
||||
## Indizes (Geplant)
|
||||
|
||||
**Prüfung:**
|
||||
```sql
|
||||
-- Hierarchie-Lookups
|
||||
CREATE INDEX idx_training_styles_focus_area ON training_styles(focus_area_id);
|
||||
CREATE INDEX idx_target_groups_style ON target_groups(training_style_id);
|
||||
|
||||
-- M:N Joins
|
||||
CREATE INDEX idx_exercise_focus_areas_exercise ON exercise_focus_areas(exercise_id);
|
||||
CREATE INDEX idx_exercise_focus_areas_focus ON exercise_focus_areas(focus_area_id);
|
||||
CREATE INDEX idx_exercise_styles_exercise ON exercise_styles(exercise_id);
|
||||
CREATE INDEX idx_exercise_styles_style ON exercise_styles(training_style_id);
|
||||
CREATE INDEX idx_exercise_target_groups_exercise ON exercise_target_groups(exercise_id);
|
||||
CREATE INDEX idx_exercise_target_groups_target ON exercise_target_groups(target_group_id);
|
||||
SELECT COUNT(*) FROM training_style_target_groups WHERE target_group_id = :id
|
||||
SELECT COUNT(*) FROM exercise_target_groups WHERE target_group_id = :id
|
||||
```
|
||||
|
||||
---
|
||||
### Skill löschen
|
||||
|
||||
## Deprecation-Pfad (Migration 008)
|
||||
**Verhalten:** `CASCADE` zu `skill_level_definitions`, `RESTRICT` wenn in `exercise_skills`
|
||||
|
||||
**Legacy-Spalten in `exercises`:**
|
||||
**Prüfung:**
|
||||
```sql
|
||||
-- Werden in Migration 008 deprecated:
|
||||
exercises.focus_area_id → Migriert zu exercise_focus_areas (is_primary=true)
|
||||
exercises.training_style_id → Migriert zu exercise_styles (is_primary=true)
|
||||
exercises.training_character_id → Bleibt vorerst (separate Dimension)
|
||||
|
||||
-- Spalten bleiben zur Rückwärtskompatibilität, aber:
|
||||
-- 1. Daten migriert
|
||||
-- 2. Neue Übungen nutzen M:N-Tabellen
|
||||
-- 3. API liefert enriched data aus M:N
|
||||
-- 4. Später: Spalten droppen nach Stabilisierung
|
||||
SELECT COUNT(*) FROM exercise_skills WHERE skill_id = :id
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Nächste Schritte
|
||||
|
||||
- [ ] Migration 008 Entwurf erstellen
|
||||
- [ ] Migrations-Strategie für Altdaten dokumentieren
|
||||
- [ ] Admin-UI für Baum-Verwaltung planen
|
||||
- [ ] API-Endpoints für hierarchische Navigation
|
||||
- [ ] Cascade-Logik implementieren
|
||||
- [ ] Tests für Löschen/Umrouten
|
||||
- [ ] Level-Definitionen aus Fähigkeitsmatrix extrahieren (optional)
|
||||
- [ ] Skills-Import testen mit Übungs-Import
|
||||
- [ ] Migration 024: Skills-Beschreibungen aus Wiki importieren
|
||||
- [ ] Admin-UI für Skill-Kategorien (CRUD)
|
||||
- [ ] Skill-Filter in Übungssuche integrieren
|
||||
|
||||
---
|
||||
|
||||
**Letzte Aktualisierung:** 2026-04-23
|
||||
**Letzte Aktualisierung:** 2026-04-27
|
||||
**Verantwortlich:** Claude Code
|
||||
**Review:** Pending
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# MediaWiki Import Specification
|
||||
|
||||
**Version:** 1.0
|
||||
**Datum:** 2026-04-24
|
||||
**Status:** DRAFT - Ready for Review
|
||||
**Version:** 1.1
|
||||
**Datum:** 2026-04-27
|
||||
**Status:** DEPLOYED - Skills via Migration, Exercises via API
|
||||
**Autor:** Claude Code
|
||||
|
||||
---
|
||||
|
|
@ -19,6 +19,11 @@
|
|||
**Import-Tracking:** Jeder Import wird geloggt, Duplikate werden via `wiki_page_title`
|
||||
erkannt und nicht doppelt angelegt.
|
||||
|
||||
**⚠️ WICHTIG - Skills-Import (ab 2026-04-27):**
|
||||
Skills werden NICHT mehr über die API importiert, sondern über **Migration 023**
|
||||
(vollständiger Import aus Fähigkeitsmatrix mit Kategorisierung).
|
||||
Siehe `.claude/handover/session-2026-04-27-skills-complete.md` für Details.
|
||||
|
||||
---
|
||||
|
||||
## 2. MediaWiki API-Zugriff
|
||||
|
|
@ -88,23 +93,42 @@ GET /api.php?action=browsebysubject&subject=Übungsname&format=json
|
|||
| `CapabilityLevel` | `exercise_skills` (target_level) | Integer → Named Level (1=einsteiger…5=experte) |
|
||||
| `Schlüsselworte` | — | Keywords (für zukünftige Tag-Funktion) |
|
||||
|
||||
### 3.3 Skill-Level-Mapping (CapabilityLevel → Stufen)
|
||||
### 3.3 Skill-Level-Mapping (CapabilityLevel → INTEGER)
|
||||
|
||||
| Wiki-Wert | Shinkan-Stufe |
|
||||
|-----------|---------------|
|
||||
| 1 | einsteiger |
|
||||
| 2 | grundlagen |
|
||||
| 3 | aufbau |
|
||||
| 4 | fortgeschritten |
|
||||
| 5 | experte |
|
||||
**🆕 ÄNDERUNG (2026-04-27):** `target_level` ist jetzt INTEGER (1-5), nicht mehr String.
|
||||
|
||||
| Wiki-Wert | Shinkan DB-Wert | Bedeutung |
|
||||
|-----------|-----------------|-----------|
|
||||
| "1" | 1 (INTEGER) | Einsteiger |
|
||||
| "2" | 2 (INTEGER) | Grundlagen |
|
||||
| "3" | 3 (INTEGER) | Aufbau |
|
||||
| "4" | 4 (INTEGER) | Fortgeschritten |
|
||||
| "5" | 5 (INTEGER) | Experte |
|
||||
|
||||
**Implementierung:** `smw_mapper.py` Zeile 271-299 `build_skill_assignments()`
|
||||
konvertiert String → INTEGER via `int(level_str.strip())`.
|
||||
|
||||
### 3.4 Kategorien (karatetrainer.net)
|
||||
|
||||
| Import-Typ | Wiki-Kategorie |
|
||||
|------------|---------------|
|
||||
| exercises | `Übungen` |
|
||||
| skills | `Fähigkeitsbeschreibung` |
|
||||
| methods | `Methodenbeschreibung` |
|
||||
| Import-Typ | Wiki-Kategorie | Status | Import-Methode |
|
||||
|------------|---------------|--------|----------------|
|
||||
| exercises | `Übungen` | ✅ Produktiv | API (`/api/import-wiki/execute`) |
|
||||
| skills | `Fähigkeitsbeschreibung` | ⚠️ DEPRECATED | ~~API~~ → **Migration 023** |
|
||||
| methods | `Methodenbeschreibung` | 🔲 Geplant | API (noch nicht implementiert) |
|
||||
|
||||
**⚠️ Skills-Import-Änderung (2026-04-27):**
|
||||
|
||||
Skills werden NICHT mehr über `import_type: skill` importiert, sondern über:
|
||||
- **Migration 022:** Schema-Erweiterung (skill_main_categories, focus_areas, level_definitions)
|
||||
- **Migration 023:** Vollständiger Import (69 Skills mit Kategorisierung aus Fähigkeitsmatrix)
|
||||
|
||||
**Grund:** API-Import lieferte nur skill_name, aber KEINE Kategorisierung
|
||||
(Haupt-/Unterkategorie, Fokusbereich). Migration 023 importiert alle Skills
|
||||
mit vollständiger Metadaten-Struktur.
|
||||
|
||||
**Quelle:** https://karatetrainer.net/index.php?title=Fähigkeitsmatrix
|
||||
|
||||
**Details:** `.claude/handover/session-2026-04-27-skills-complete.md`
|
||||
|
||||
**Unbekannte Katalog-Werte:** Warnmeldung im Import-Log, Übung wird ohne
|
||||
diese Zuordnung importiert (kein Abbruch).
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user