-- 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';