- Migration 022: Schema-Erweiterung - skill_main_categories (KARATE / ALLGEMEINE) - skills.main_category_id + focus_areas JSONB - skill_level_definitions Tabelle - Indizes für Performance - Migration 023: Produktionsreifer Skills-Import - 69 Skills mit vollständiger Kategorisierung - 2 Haupt-Kategorien, 9 Unterkategorien - KARATE: 32 Skills (karate focus) - ALLGEMEINE: 37 Skills (universal focus) - Duplikat-Bereinigung (Timing, Antizipation, etc.) - Scripts: - parse_matrix.py: Extrahiert Skills aus Fähigkeitsmatrix - generate_migration_023_direct.py: Generiert Migration direkt aus Matrix Source: https://karatetrainer.net/index.php?title=Fähigkeitsmatrix Verified auf Dev: 69 Skills importiert, korrekte Kategorisierung
91 lines
3.6 KiB
SQL
91 lines
3.6 KiB
SQL
-- Migration 022: Skills Schema Complete - Hauptkategorien + Fokusbereich + Level-Definitionen
|
|
-- Purpose: Erweitert Skills-Schema um vollständige Kategorisierung für Prod-Import
|
|
-- Date: 2026-04-27
|
|
|
|
-- ======================================================================
|
|
-- 1. Haupt-Kategorien (KARATE Fähigkeiten / ALLGEMEINE sportliche Fähigkeiten)
|
|
-- ======================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS skill_main_categories (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(200) UNIQUE NOT NULL,
|
|
slug VARCHAR(50) UNIQUE NOT NULL,
|
|
description TEXT,
|
|
sort_order INT,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
updated_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
-- ======================================================================
|
|
-- 2. Unterkategorien erweitern (Beziehung zu Hauptkategorie)
|
|
-- ======================================================================
|
|
|
|
-- Slug für URL-friendly Namen
|
|
ALTER TABLE skill_categories
|
|
ADD COLUMN IF NOT EXISTS slug VARCHAR(50);
|
|
|
|
-- Beziehung zu Hauptkategorie
|
|
ALTER TABLE skill_categories
|
|
ADD COLUMN IF NOT EXISTS main_category_id INT REFERENCES skill_main_categories(id);
|
|
|
|
-- Unique constraint für slug
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint WHERE conname = 'skill_categories_slug_unique'
|
|
) THEN
|
|
ALTER TABLE skill_categories ADD CONSTRAINT skill_categories_slug_unique UNIQUE (slug);
|
|
END IF;
|
|
END $$;
|
|
|
|
-- ======================================================================
|
|
-- 3. Skills erweitern (Hauptkategorie + Fokusbereich)
|
|
-- ======================================================================
|
|
|
|
-- Beziehung zu Hauptkategorie (für direkte Queries)
|
|
ALTER TABLE skills
|
|
ADD COLUMN IF NOT EXISTS main_category_id INT REFERENCES skill_main_categories(id);
|
|
|
|
-- Fokusbereich als JSONB Array (z.B. ['karate'], ['universal'], ['karate', 'selbstverteidigung'])
|
|
ALTER TABLE skills
|
|
ADD COLUMN IF NOT EXISTS focus_areas JSONB DEFAULT '[]'::jsonb;
|
|
|
|
-- ======================================================================
|
|
-- 4. Level-Definitionen (1-5 Beschreibungen aus Matrix)
|
|
-- ======================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS skill_level_definitions (
|
|
id SERIAL PRIMARY KEY,
|
|
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(),
|
|
updated_at TIMESTAMP DEFAULT NOW(),
|
|
UNIQUE (skill_id, level)
|
|
);
|
|
|
|
-- Index für schnelle Abfragen
|
|
CREATE INDEX IF NOT EXISTS idx_skill_level_definitions_skill_id
|
|
ON skill_level_definitions(skill_id);
|
|
|
|
-- ======================================================================
|
|
-- 5. Indizes für Performance
|
|
-- ======================================================================
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_skills_main_category_id
|
|
ON skills(main_category_id);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_skills_category_id
|
|
ON skills(category_id);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_skill_categories_main_category_id
|
|
ON skill_categories(main_category_id);
|
|
|
|
-- ======================================================================
|
|
-- 6. Kommentare für Dokumentation
|
|
-- ======================================================================
|
|
|
|
COMMENT ON TABLE skill_main_categories IS 'Hauptkategorien: KARATE Fähigkeiten / ALLGEMEINE sportliche Fähigkeiten';
|
|
COMMENT ON COLUMN skills.focus_areas IS 'JSONB Array: [''karate''] = nur Karate, [''universal''] = alle Fokussbereiche';
|
|
COMMENT ON TABLE skill_level_definitions IS 'Level 1-5 Beschreibungen aus Fähigkeitsmatrix für jede Fähigkeit';
|