mitai-jinkendo/backend/migrations/037_profile_reference_values.sql
Lars f0e6fd04fb
All checks were successful
Deploy Development / deploy (push) Successful in 50s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 15s
feat: Add personal reference values management in settings and API
- Introduced new routes and API endpoints for managing personal reference values.
- Updated the SettingsPage to include a section for reference values with navigation to manage them.
- Enhanced the backend to support reference values in the data layer and versioning.
- Added necessary imports and UI components for a seamless user experience.
2026-04-06 19:45:06 +02:00

100 lines
3.4 KiB
SQL

-- Migration 037: Persönliche Referenzwerte (Typkatalog + historische Werte pro Profil)
-- Date: 2026-04-06
-- Purpose: System-definierte Referenztyp-Schlüssel; Nutzer pflegt nur historische Einträge.
CREATE TABLE IF NOT EXISTS reference_value_types (
id SERIAL PRIMARY KEY,
key VARCHAR(64) NOT NULL UNIQUE,
label VARCHAR(200) NOT NULL,
description TEXT,
default_unit VARCHAR(32),
sort_order INT NOT NULL DEFAULT 0,
active BOOLEAN NOT NULL DEFAULT TRUE,
metadata JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE reference_value_types IS
'Systemdefinierte Typen persönlicher Referenzwerte (kein Nutzer-CRUD auf Typen)';
CREATE TABLE IF NOT EXISTS profile_reference_values (
id BIGSERIAL PRIMARY KEY,
profile_id UUID NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,
reference_value_type_id INT NOT NULL REFERENCES reference_value_types(id) ON DELETE RESTRICT,
effective_date DATE NOT NULL,
value_numeric NUMERIC(18, 6),
value_text TEXT,
unit VARCHAR(32) NOT NULL,
source TEXT,
confidence NUMERIC(5, 2),
method TEXT,
notes TEXT,
extra JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
CONSTRAINT profile_reference_values_value_ck CHECK (
value_numeric IS NOT NULL OR (value_text IS NOT NULL AND length(trim(value_text)) > 0)
)
);
COMMENT ON TABLE profile_reference_values IS
'Historische Referenzwerte pro Profil (kein Überschreiben eines Einzel-»aktuellen« Werts)';
CREATE INDEX IF NOT EXISTS idx_prv_profile_type_date
ON profile_reference_values (profile_id, reference_value_type_id, effective_date DESC);
CREATE INDEX IF NOT EXISTS idx_prv_profile
ON profile_reference_values (profile_id);
-- Seed: nur Typdefinitionen, keine Benutzerwerte
INSERT INTO reference_value_types (key, label, description, default_unit, sort_order, active) VALUES
(
'max_heart_rate',
'Maximale Herzfrequenz',
'Individuelle HRmax (z. B. aus Leistungstest oder geschätzt).',
'bpm',
10,
TRUE
),
(
'anaerobic_threshold_hr',
'Anaerober Schwellenwert (Herzfrequenz)',
'Laktatschwelle / anaerober Schwellenpuls.',
'bpm',
20,
TRUE
),
(
'aerobic_threshold_hr',
'Aerober Schwellenwert (Herzfrequenz)',
'Erster aerobet/schwellenanaloger Trainingsbereich (GA2).',
'bpm',
30,
TRUE
),
(
'training_frequency_weekly',
'Trainingshäufigkeit',
'Geplante oder beobachtete Einheiten pro Woche.',
'Sessions/Woche',
40,
TRUE
),
(
'fitness_level',
'Fitnesslevel',
'Subjektive oder normierte Einstufung (Zahl oder Kurzbeschreibung im Freitextfeld).',
'Stufe',
50,
TRUE
),
(
'resting_heart_rate',
'Ruhepuls (Referenz)',
'Ruheherzfrequenz als persönliche Referenz (z. B. morgens).',
'bpm',
15,
TRUE
)
ON CONFLICT (key) DO NOTHING;