trading-platform-database-v2/ddl/schemas/education/tables/09-quiz_attempts.sql
rckrdmrd 45e77e9a9c feat: Initial commit - Database schemas and scripts
DDL schemas for Trading Platform:
- User management
- Authentication
- Payments
- Education
- ML predictions
- Trading data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:30:23 -06:00

54 lines
2.0 KiB
SQL

-- =====================================================
-- TABLE: education.quiz_attempts
-- =====================================================
-- Proyecto: OrbiQuant IA (Trading Platform)
-- Módulo: OQI-002 - Education
-- Especificación: ET-EDU-001-database.md
-- =====================================================
CREATE TABLE education.quiz_attempts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Relaciones
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
quiz_id UUID NOT NULL REFERENCES education.quizzes(id) ON DELETE RESTRICT,
enrollment_id UUID REFERENCES education.enrollments(id) ON DELETE SET NULL,
-- Estado del intento
is_completed BOOLEAN DEFAULT false,
is_passed BOOLEAN DEFAULT false,
-- Respuestas del usuario
user_answers JSONB, -- [{questionId, answer, isCorrect, points}]
-- Puntuación
score_points INTEGER DEFAULT 0,
max_points INTEGER DEFAULT 0,
score_percentage DECIMAL(5,2) DEFAULT 0.00,
-- Tiempo
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
completed_at TIMESTAMPTZ,
time_taken_seconds INTEGER,
-- XP ganado
xp_earned INTEGER DEFAULT 0,
-- Metadata
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT valid_score_percentage CHECK (score_percentage >= 0 AND score_percentage <= 100)
);
-- Índices
CREATE INDEX idx_quiz_attempts_user ON education.quiz_attempts(user_id);
CREATE INDEX idx_quiz_attempts_quiz ON education.quiz_attempts(quiz_id);
CREATE INDEX idx_quiz_attempts_enrollment ON education.quiz_attempts(enrollment_id);
CREATE INDEX idx_quiz_attempts_user_quiz ON education.quiz_attempts(user_id, quiz_id);
CREATE INDEX idx_quiz_attempts_completed ON education.quiz_attempts(is_completed, completed_at);
-- Comentarios
COMMENT ON TABLE education.quiz_attempts IS 'Intentos de los usuarios en los quizzes';
COMMENT ON COLUMN education.quiz_attempts.user_answers IS 'Respuestas del usuario: [{questionId, answer, isCorrect, points}]';
COMMENT ON COLUMN education.quiz_attempts.time_taken_seconds IS 'Tiempo total empleado en segundos';