CREATE TABLE IF NOT EXISTS background_jobs ( id BIGSERIAL PRIMARY KEY, queue VARCHAR(100) NOT NULL DEFAULT 'default', job_type VARCHAR(150) NOT NULL, payload JSONB NOT NULL DEFAULT '{}', status VARCHAR(50) NOT NULL DEFAULT 'queued', priority INTEGER NOT NULL DEFAULT 0, attempts INTEGER NOT NULL DEFAULT 0, max_attempts INTEGER NOT NULL DEFAULT 3, scheduled_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), locked_at TIMESTAMP WITH TIME ZONE, locked_by VARCHAR(150), idempotency_key VARCHAR(255), last_error TEXT, finished_at TIMESTAMP WITH TIME ZONE, failed_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_background_jobs_ready ON background_jobs(status, queue, scheduled_at, priority DESC, id); CREATE INDEX IF NOT EXISTS idx_background_jobs_job_type ON background_jobs(job_type); CREATE INDEX IF NOT EXISTS idx_background_jobs_locked_at ON background_jobs(locked_at); CREATE INDEX IF NOT EXISTS idx_background_jobs_idempotency_key ON background_jobs(idempotency_key); CREATE UNIQUE INDEX IF NOT EXISTS idx_background_jobs_idempotency_key_unique ON background_jobs(idempotency_key) WHERE idempotency_key IS NOT NULL AND idempotency_key <> '';