Spaces:
Running
Running
| -- Advanced Face Capture TimescaleDB Schema | |
| -- Creates hypertables for real-time face capture metrics and analysis | |
| -- Create extension if not exists | |
| CREATE EXTENSION IF NOT EXISTS timescaledb; | |
| -- Face capture sessions table | |
| CREATE TABLE IF NOT EXISTS face_capture_sessions ( | |
| timestamp TIMESTAMPTZ NOT NULL, | |
| session_id TEXT NOT NULL, | |
| user_id TEXT, | |
| device_info JSONB, | |
| camera_settings JSONB, | |
| ip_address INET, | |
| user_agent TEXT, | |
| created_at TIMESTAMPTZ DEFAULT NOW(), | |
| PRIMARY KEY (timestamp, session_id) | |
| ); | |
| -- Real-time quality metrics table | |
| CREATE TABLE IF NOT EXISTS face_quality_metrics ( | |
| timestamp TIMESTAMPTZ NOT NULL, | |
| session_id TEXT NOT NULL, | |
| frame_number INTEGER, | |
| sharpness_score REAL, | |
| illumination_score REAL, | |
| pose_score REAL, | |
| eye_distance_score REAL, | |
| motion_blur_score REAL, | |
| overall_score REAL, | |
| confidence REAL, | |
| processing_time_ms REAL, | |
| landmarks JSONB, | |
| pose_angles JSONB, | |
| is_frontal BOOLEAN, | |
| created_at TIMESTAMPTZ DEFAULT NOW(), | |
| PRIMARY KEY (timestamp, session_id, frame_number) | |
| ); | |
| -- Processed face captures table | |
| CREATE TABLE IF NOT EXISTS processed_face_captures ( | |
| timestamp TIMESTAMPTZ NOT NULL, | |
| session_id TEXT NOT NULL, | |
| quality_score REAL, | |
| pose_angles JSONB, | |
| is_frontal BOOLEAN, | |
| face_box JSONB, | |
| landmark_count INTEGER, | |
| processing_time_ms REAL, | |
| morphing_detection_result JSONB, | |
| liveness_detection_result JSONB, | |
| identity_verification_result JSONB, | |
| created_at TIMESTAMPTZ DEFAULT NOW(), | |
| PRIMARY KEY (timestamp, session_id) | |
| ); | |
| -- WebRTC performance metrics table | |
| CREATE TABLE IF NOT EXISTS webrtc_performance_metrics ( | |
| timestamp TIMESTAMPTZ NOT NULL, | |
| session_id TEXT NOT NULL, | |
| fps REAL, | |
| frame_drops INTEGER, | |
| latency_ms REAL, | |
| bandwidth_kbps REAL, | |
| resolution_width INTEGER, | |
| resolution_height INTEGER, | |
| codec_info JSONB, | |
| created_at TIMESTAMPTZ DEFAULT NOW(), | |
| PRIMARY KEY (timestamp, session_id) | |
| ); | |
| -- System health metrics table | |
| CREATE TABLE IF NOT EXISTS system_health_metrics ( | |
| timestamp TIMESTAMPTZ NOT NULL, | |
| component_name TEXT NOT NULL, | |
| health_score REAL, | |
| status TEXT, | |
| metrics JSONB, | |
| alerts JSONB, | |
| created_at TIMESTAMPTZ DEFAULT NOW(), | |
| PRIMARY KEY (timestamp, component_name) | |
| ); | |
| -- Model performance tracking table | |
| CREATE TABLE IF NOT EXISTS model_performance_metrics ( | |
| timestamp TIMESTAMPTZ NOT NULL, | |
| model_name TEXT NOT NULL, | |
| model_version TEXT, | |
| accuracy_score REAL, | |
| processing_time_ms REAL, | |
| memory_usage_mb REAL, | |
| gpu_utilization REAL, | |
| inference_count INTEGER, | |
| error_count INTEGER, | |
| created_at TIMESTAMPTZ DEFAULT NOW(), | |
| PRIMARY KEY (timestamp, model_name) | |
| ); | |
| -- Create hypertables for time-series optimization | |
| SELECT create_hypertable('face_capture_sessions', 'timestamp', if_not_exists => TRUE); | |
| SELECT create_hypertable('face_quality_metrics', 'timestamp', if_not_exists => TRUE); | |
| SELECT create_hypertable('processed_face_captures', 'timestamp', if_not_exists => TRUE); | |
| SELECT create_hypertable('webrtc_performance_metrics', 'timestamp', if_not_exists => TRUE); | |
| SELECT create_hypertable('system_health_metrics', 'timestamp', if_not_exists => TRUE); | |
| SELECT create_hypertable('model_performance_metrics', 'timestamp', if_not_exists => TRUE); | |
| -- Create indexes for optimal query performance | |
| CREATE INDEX IF NOT EXISTS idx_face_quality_session | |
| ON face_quality_metrics (session_id, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_face_quality_overall_score | |
| ON face_quality_metrics (overall_score, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_face_quality_frontal | |
| ON face_quality_metrics (is_frontal, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_processed_captures_session | |
| ON processed_face_captures (session_id, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_processed_captures_quality | |
| ON processed_face_captures (quality_score, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_webrtc_performance_session | |
| ON webrtc_performance_metrics (session_id, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_system_health_component | |
| ON system_health_metrics (component_name, timestamp); | |
| CREATE INDEX IF NOT EXISTS idx_model_performance_name | |
| ON model_performance_metrics (model_name, timestamp); | |
| -- Create continuous aggregates for real-time analytics | |
| CREATE MATERIALIZED VIEW IF NOT EXISTS face_quality_hourly | |
| WITH (timescaledb.continuous) AS | |
| SELECT | |
| time_bucket('1 hour', timestamp) AS bucket, | |
| session_id, | |
| AVG(overall_score) AS avg_quality, | |
| MAX(overall_score) AS max_quality, | |
| MIN(overall_score) AS min_quality, | |
| COUNT(*) AS frame_count, | |
| COUNT(CASE WHEN is_frontal THEN 1 END) AS frontal_frames, | |
| AVG(processing_time_ms) AS avg_processing_time | |
| FROM face_quality_metrics | |
| GROUP BY bucket, session_id; | |
| CREATE MATERIALIZED VIEW IF NOT EXISTS system_performance_hourly | |
| WITH (timescaledb.continuous) AS | |
| SELECT | |
| time_bucket('1 hour', timestamp) AS bucket, | |
| AVG(fps) AS avg_fps, | |
| SUM(frame_drops) AS total_frame_drops, | |
| AVG(latency_ms) AS avg_latency, | |
| AVG(bandwidth_kbps) AS avg_bandwidth | |
| FROM webrtc_performance_metrics | |
| GROUP BY bucket; | |
| CREATE MATERIALIZED VIEW IF NOT EXISTS model_performance_daily | |
| WITH (timescaledb.continuous) AS | |
| SELECT | |
| time_bucket('1 day', timestamp) AS bucket, | |
| model_name, | |
| AVG(accuracy_score) AS avg_accuracy, | |
| AVG(processing_time_ms) AS avg_processing_time, | |
| SUM(inference_count) AS total_inferences, | |
| SUM(error_count) AS total_errors | |
| FROM model_performance_metrics | |
| GROUP BY bucket, model_name; | |
| -- Set up data retention policies (keep detailed data for 30 days, aggregated for 1 year) | |
| SELECT add_retention_policy('face_quality_metrics', INTERVAL '30 days', if_not_exists => TRUE); | |
| SELECT add_retention_policy('webrtc_performance_metrics', INTERVAL '30 days', if_not_exists => TRUE); | |
| SELECT add_retention_policy('system_health_metrics', INTERVAL '90 days', if_not_exists => TRUE); | |
| SELECT add_retention_policy('model_performance_metrics', INTERVAL '90 days', if_not_exists => TRUE); | |
| -- Set up compression policies for older data | |
| SELECT add_compression_policy('face_quality_metrics', INTERVAL '7 days', if_not_exists => TRUE); | |
| SELECT add_compression_policy('processed_face_captures', INTERVAL '7 days', if_not_exists => TRUE); | |
| SELECT add_compression_policy('webrtc_performance_metrics', INTERVAL '7 days', if_not_exists => TRUE); | |
| -- Create refresh policies for continuous aggregates | |
| SELECT add_continuous_aggregate_policy('face_quality_hourly', | |
| start_offset => INTERVAL '1 day', | |
| end_offset => INTERVAL '1 hour', | |
| schedule_interval => INTERVAL '1 hour', | |
| if_not_exists => TRUE); | |
| SELECT add_continuous_aggregate_policy('system_performance_hourly', | |
| start_offset => INTERVAL '1 day', | |
| end_offset => INTERVAL '1 hour', | |
| schedule_interval => INTERVAL '1 hour', | |
| if_not_exists => TRUE); | |
| SELECT add_continuous_aggregate_policy('model_performance_daily', | |
| start_offset => INTERVAL '7 days', | |
| end_offset => INTERVAL '1 day', | |
| schedule_interval => INTERVAL '1 day', | |
| if_not_exists => TRUE); | |
| -- Create views for common queries | |
| CREATE OR REPLACE VIEW recent_face_sessions AS | |
| SELECT | |
| session_id, | |
| MIN(timestamp) AS start_time, | |
| MAX(timestamp) AS end_time, | |
| COUNT(*) AS total_frames, | |
| AVG(overall_score) AS avg_quality, | |
| COUNT(CASE WHEN is_frontal THEN 1 END) AS frontal_frames | |
| FROM face_quality_metrics | |
| WHERE timestamp > NOW() - INTERVAL '1 hour' | |
| GROUP BY session_id | |
| ORDER BY start_time DESC; | |
| CREATE OR REPLACE VIEW system_health_dashboard AS | |
| SELECT | |
| component_name, | |
| timestamp, | |
| health_score, | |
| status, | |
| metrics | |
| FROM system_health_metrics | |
| WHERE timestamp > NOW() - INTERVAL '5 minutes' | |
| ORDER BY timestamp DESC, component_name; | |
| CREATE OR REPLACE VIEW real_time_quality_stats AS | |
| SELECT | |
| COUNT(*) AS total_frames_last_minute, | |
| AVG(overall_score) AS avg_quality_last_minute, | |
| COUNT(CASE WHEN is_frontal THEN 1 END) AS frontal_frames_last_minute, | |
| AVG(processing_time_ms) AS avg_processing_time_last_minute | |
| FROM face_quality_metrics | |
| WHERE timestamp > NOW() - INTERVAL '1 minute'; | |
| -- Grant permissions to morphguard user | |
| GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO morphguard; | |
| GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO morphguard; | |
| -- Insert system health check | |
| INSERT INTO system_health_metrics (timestamp, component_name, health_score, status, metrics) | |
| VALUES (NOW(), 'database_schema', 1.0, 'healthy', '{"tables_created": true, "hypertables_created": true, "indexes_created": true}'); | |
| COMMENT ON TABLE face_capture_sessions IS 'Stores WebRTC face capture session metadata'; | |
| COMMENT ON TABLE face_quality_metrics IS 'Real-time face quality assessment metrics for each frame'; | |
| COMMENT ON TABLE processed_face_captures IS 'Final processed face capture results with AI analysis'; | |
| COMMENT ON TABLE webrtc_performance_metrics IS 'WebRTC streaming performance metrics'; | |
| COMMENT ON TABLE system_health_metrics IS 'System component health monitoring'; | |
| COMMENT ON TABLE model_performance_metrics IS 'AI model performance tracking and monitoring'; |