feat: Migration 010+011 - Stilrichtungen + Trainingsstil-Dimension
Some checks failed
Deploy Development / deploy (push) Successful in 35s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 5s
Test Suite / playwright-tests (push) Has been cancelled

Migration 010: Umbenennung (konsistente Terminologie)
- training_styles → style_directions
- exercise_styles → exercise_style_directions
- training_style_target_groups → style_direction_target_groups
- training_style_id → style_direction_id (in Junction-Tabellen)
- Idempotent mit IF EXISTS checks

Migration 011: Neue Dimension "Trainingsstil"
- Neue Tabelle training_types (Breitensport, Leistungssport, Wettkampf)
- Seed-Daten: 3 Standard-Trainingsstile
- Junction-Tabelle exercise_training_types (M:N)
- Indizes für Performance
- ON DELETE RESTRICT: Training Types können nicht gelöscht werden wenn zugeordnet

Architektur:
- Fokusbereich (Karate) → Stilrichtung (Shotokan) → Trainingsstil (Breitensport) → Zielgruppe (Kinder)
- Alle M:N für maximale Flexibilität
- KI-freundlich: Flache Dimensionen, einfache Queries

Version: 0.4.0 (BREAKING - nur DB-Migrationen, Backend/Frontend folgen)
This commit is contained in:
Lars 2026-04-23 12:10:27 +02:00
parent cedb97eb9b
commit 62b5b4c2fd
3 changed files with 146 additions and 1 deletions

View File

@ -0,0 +1,67 @@
-- Migration 010: Umbenennung "training_styles" → "style_directions"
-- Erstellt: 2026-04-23
-- Beschreibung: Konsistente Terminologie - "Stilrichtungen" statt "Trainingsstile"
-- Grund: "Trainingsstil" wird neue separate Dimension (Breitensport/Leistungssport)
-- ============================================================================
-- PHASE 1: Tabellen umbenennen
-- ============================================================================
-- Haupttabelle umbenennen
ALTER TABLE IF EXISTS training_styles RENAME TO style_directions;
-- Junction-Tabelle umbenennen
ALTER TABLE IF EXISTS exercise_styles RENAME TO exercise_style_directions;
-- Training-Style-Target-Groups Junction umbenennen
ALTER TABLE IF EXISTS training_style_target_groups RENAME TO style_direction_target_groups;
-- ============================================================================
-- PHASE 2: Spalten umbenennen
-- ============================================================================
-- In style_directions (vormals training_styles)
-- Keine Spalten-Umbennung nötig - parent_style_id kann bleiben (bedeutet parent_direction)
-- In exercise_style_directions (vormals exercise_styles)
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'exercise_style_directions' AND column_name = 'training_style_id'
) THEN
ALTER TABLE exercise_style_directions
RENAME COLUMN training_style_id TO style_direction_id;
END IF;
END $$;
-- In style_direction_target_groups (vormals training_style_target_groups)
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'style_direction_target_groups' AND column_name = 'training_style_id'
) THEN
ALTER TABLE style_direction_target_groups
RENAME COLUMN training_style_id TO style_direction_id;
END IF;
END $$;
-- ============================================================================
-- PHASE 3: Constraints umbenennen (automatisch durch ALTER TABLE)
-- ============================================================================
-- Foreign Key Constraints werden automatisch umbenannt
-- Indizes werden automatisch umbenannt
-- ============================================================================
-- PHASE 4: Validierung
-- ============================================================================
-- Nach dieser Migration:
-- - training_styles → style_directions
-- - exercise_styles → exercise_style_directions
-- - training_style_target_groups → style_direction_target_groups
-- - training_style_id → style_direction_id (in Junction-Tabellen)
-- Nächste Migration 011: Neue Dimension "training_types" (Breitensport/Leistungssport)

View File

@ -0,0 +1,65 @@
-- Migration 011: Neue Dimension "Trainingsstil" (Breitensport/Leistungssport)
-- Erstellt: 2026-04-23
-- Beschreibung: Neue Katalog-Dimension für Trainingsausrichtung
-- Grund: Trennung von "Stilrichtung" (Shotokan) und "Trainingsstil" (Breitensport)
-- ============================================================================
-- PHASE 1: Haupttabelle erstellen
-- ============================================================================
CREATE TABLE IF NOT EXISTS training_types (
id SERIAL PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
abbreviation VARCHAR(20),
description TEXT,
sort_order INT DEFAULT 99,
status VARCHAR(50) DEFAULT 'active' CHECK (status IN ('active', 'archived')),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- ============================================================================
-- PHASE 2: Seed-Daten
-- ============================================================================
INSERT INTO training_types (name, abbreviation, description, sort_order) VALUES
('Breitensport', 'BS', 'Freizeitorientiertes Training für Gesundheit und Spaß', 1),
('Leistungssport', 'LS', 'Wettkampforientiertes Training mit Leistungsfokus', 2),
('Wettkampf', 'WK', 'Spezifische Wettkampfvorbereitung', 3)
ON CONFLICT (name) DO NOTHING;
-- ============================================================================
-- PHASE 3: Junction-Tabelle für M:N Übungszuordnung
-- ============================================================================
CREATE TABLE IF NOT EXISTS exercise_training_types (
id SERIAL PRIMARY KEY,
exercise_id INT REFERENCES exercises(id) ON DELETE CASCADE,
training_type_id INT REFERENCES training_types(id) ON DELETE RESTRICT,
is_primary BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE(exercise_id, training_type_id)
);
-- ============================================================================
-- PHASE 4: Indizes
-- ============================================================================
CREATE INDEX IF NOT EXISTS idx_exercise_training_types_exercise
ON exercise_training_types(exercise_id);
CREATE INDEX IF NOT EXISTS idx_exercise_training_types_type
ON exercise_training_types(training_type_id);
CREATE INDEX IF NOT EXISTS idx_exercise_training_types_primary
ON exercise_training_types(is_primary);
-- ============================================================================
-- PHASE 5: Validierung
-- ============================================================================
-- Nach dieser Migration:
-- - Neue Dimension "training_types" (Breitensport, Leistungssport, Wettkampf)
-- - M:N Zuordnung zu Übungen über exercise_training_types
-- - is_primary Flag für Haupt-Trainingsstil
-- - ON DELETE RESTRICT: Training Types können nicht gelöscht werden wenn zugeordnet

View File

@ -1,6 +1,6 @@
# Shinkan Jinkendo Version Information
APP_VERSION = "0.3.4"
APP_VERSION = "0.4.0"
BUILD_DATE = "2026-04-23"
DB_SCHEMA_VERSION = "20260423"
@ -22,6 +22,19 @@ MODULE_VERSIONS = {
}
CHANGELOG = [
{
"version": "0.4.0",
"date": "2026-04-23",
"changes": [
"BREAKING: Migration 010 - Umbenennung training_styles → style_directions",
"BREAKING: Migration 011 - Neue Dimension training_types (Breitensport/Leistungssport)",
"DB: Konsistente Terminologie - Stilrichtungen vs. Trainingsstile",
"DB: Neue Tabelle training_types mit Seed-Daten (Breitensport, Leistungssport, Wettkampf)",
"DB: Neue Junction-Tabelle exercise_training_types (M:N)",
"Architektur: Fokusbereich → Stilrichtung → Trainingsstil → Zielgruppe (alle M:N)",
"Phase 1: Nur Datenbank-Migrationen - Backend/Frontend-Updates folgen",
]
},
{
"version": "0.3.4",
"date": "2026-04-23",