MorphGuard / database_init /02_create_advanced_face_tables.sql
juanquy's picture
Initial clean commit of modular MorphGuard
2978bba
Raw
History Blame Contribute Delete
9.13 kB
-- 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';