-- Database: ml -- Tabella jobs: ciclo di vita di un lavoro asincrono (training oggi, domani altro). -- L'api-service espone /jobs /queue /pageconnections per coordinare accessi e coda. CREATE TABLE IF NOT EXISTS jobs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), type TEXT NOT NULL, -- 'train' | 'test' | ... status TEXT NOT NULL DEFAULT 'queued',-- queued|running|succeeded|failed|cancelled payload JSONB NOT NULL DEFAULT '{}'::JSONB, result JSONB, error TEXT, created_by TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), started_at TIMESTAMPTZ, finished_at TIMESTAMPTZ, CONSTRAINT jobs_status_ok CHECK (status IN ('queued','running','succeeded','failed','cancelled')) ); CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status); CREATE INDEX IF NOT EXISTS idx_jobs_type ON jobs(type); CREATE INDEX IF NOT EXISTS idx_jobs_created_by ON jobs(created_by); CREATE INDEX IF NOT EXISTS idx_jobs_created_at ON jobs(created_at DESC); DROP TRIGGER IF EXISTS trg_jobs_updated_at ON jobs; CREATE TRIGGER trg_jobs_updated_at BEFORE UPDATE ON jobs FOR EACH ROW EXECUTE FUNCTION set_updated_at();