-- Database Schema for AI Medical Document Scanner & Health Insight App -- Target RDBMS: PostgreSQL CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS pgcrypto; -- For AES encryption functions if needed natively -- 1. Users Table CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(100), last_name VARCHAR(100), role VARCHAR(50) DEFAULT 'user', -- 'user', 'admin' created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- 2. Subscriptions Table CREATE TABLE subscriptions ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, plan_tier VARCHAR(50) DEFAULT 'free', -- 'free', 'premium' status VARCHAR(50) DEFAULT 'active', start_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, end_date TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- 3. Reports Table CREATE TABLE reports ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, file_name VARCHAR(255) NOT NULL, file_path TEXT NOT NULL, -- S3/Bucket path (Encrypted at rest) report_type VARCHAR(50), -- 'lab_result', 'prescription' status VARCHAR(50) DEFAULT 'processing', -- 'processing', 'completed', 'failed' extracted_text_encrypted BYTEA, -- Raw text from EasyOCR encrypted summary_encrypted BYTEA, -- Insight generator summary encrypted created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- 4. LabResults Table CREATE TABLE lab_results ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), report_id UUID NOT NULL REFERENCES reports(id) ON DELETE CASCADE, test_name VARCHAR(100) NOT NULL, test_value NUMERIC(10, 2), unit VARCHAR(50), reference_range VARCHAR(100), flag VARCHAR(50), -- 'high', 'low', 'normal', 'critical' created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- 5. Medications Table CREATE TABLE medications ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), report_id UUID NOT NULL REFERENCES reports(id) ON DELETE CASCADE, drug_name VARCHAR(200) NOT NULL, dosage VARCHAR(100), frequency VARCHAR(100), instructions TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- 6. RiskFlags Table CREATE TABLE risk_flags ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), report_id UUID NOT NULL REFERENCES reports(id) ON DELETE CASCADE, flag_type VARCHAR(100), -- 'interaction', 'vital_anomaly', 'emergency' severity VARCHAR(50), -- 'low', 'medium', 'high', 'critical' description TEXT NOT NULL, resolved BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- 7. Reminders Table CREATE TABLE reminders ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, medication_id UUID REFERENCES medications(id) ON DELETE SET NULL, title VARCHAR(100) NOT NULL, scheduled_time TIME NOT NULL, days_of_week VARCHAR(50), -- e.g., '1,2,3,4,5,6,7' for daily is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Indexes for performance CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_reports_user_id ON reports(user_id); CREATE INDEX idx_lab_results_report_id ON lab_results(report_id); CREATE INDEX idx_medications_report_id ON medications(report_id); CREATE INDEX idx_risk_flags_report_id ON risk_flags(report_id); CREATE INDEX idx_reminders_user_id ON reminders(user_id);