- 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.
100 lines
3.4 KiB
SQL
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;
|