trading-platform-database-v2/ddl/schemas/education/README.md
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

354 lines
9.5 KiB
Markdown

# Schema: education
**Proyecto:** Trading Platform (Trading Platform)
**Módulo:** OQI-002 - Education
**Especificación:** ET-EDU-001-database.md
**PostgreSQL:** 15+
---
## Descripción
Schema completo para el módulo educativo de Trading Platform, implementando:
- Gestión de cursos, módulos y lecciones
- Sistema de enrollments y progreso de estudiantes
- Quizzes y evaluaciones
- Certificados de finalización
- Sistema de gamificación (XP, niveles, streaks, achievements)
- Reviews de cursos
- Activity logging
---
## Estructura de Archivos
```
education/
├── 00-enums.sql # Tipos ENUM
├── tables/
│ ├── 01-categories.sql # Categorías de cursos
│ ├── 02-courses.sql # Cursos
│ ├── 03-modules.sql # Módulos del curso
│ ├── 04-lessons.sql # Lecciones
│ ├── 05-enrollments.sql # Inscripciones de usuarios
│ ├── 06-progress.sql # Progreso en lecciones
│ ├── 07-quizzes.sql # Quizzes/evaluaciones
│ ├── 08-quiz_questions.sql # Preguntas de quiz
│ ├── 09-quiz_attempts.sql # Intentos de quiz
│ ├── 10-certificates.sql # Certificados
│ ├── 11-user_achievements.sql # Logros/badges
│ ├── 12-user_gamification_profile.sql # Perfil de gamificación
│ ├── 13-user_activity_log.sql # Log de actividades
│ └── 14-course_reviews.sql # Reviews de cursos
└── functions/
├── 01-update_updated_at.sql # Trigger updated_at
├── 02-update_enrollment_progress.sql # Actualizar progreso
├── 03-auto_complete_enrollment.sql # Auto-completar enrollment
├── 04-generate_certificate.sql # Generar certificados
├── 05-update_course_stats.sql # Actualizar estadísticas
├── 06-update_enrollment_count.sql # Contador de enrollments
├── 07-update_gamification_profile.sql # Sistema de gamificación
└── 08-views.sql # Vistas útiles
```
---
## Orden de Ejecución
Para crear el schema completo, ejecutar en este orden:
```bash
# 1. ENUMs
psql -f 00-enums.sql
# 2. Tablas (en orden de dependencias)
psql -f tables/01-categories.sql
psql -f tables/02-courses.sql
psql -f tables/03-modules.sql
psql -f tables/04-lessons.sql
psql -f tables/05-enrollments.sql
psql -f tables/06-progress.sql
psql -f tables/07-quizzes.sql
psql -f tables/08-quiz_questions.sql
psql -f tables/09-quiz_attempts.sql
psql -f tables/10-certificates.sql
psql -f tables/11-user_achievements.sql
psql -f tables/12-user_gamification_profile.sql
psql -f tables/13-user_activity_log.sql
psql -f tables/14-course_reviews.sql
# 3. Funciones y Triggers
psql -f functions/01-update_updated_at.sql
psql -f functions/02-update_enrollment_progress.sql
psql -f functions/03-auto_complete_enrollment.sql
psql -f functions/04-generate_certificate.sql
psql -f functions/05-update_course_stats.sql
psql -f functions/06-update_enrollment_count.sql
psql -f functions/07-update_gamification_profile.sql
psql -f functions/08-views.sql
```
---
## Tablas
### Principales
| Tabla | Descripción |
|-------|-------------|
| `categories` | Categorías de cursos con soporte para jerarquía |
| `courses` | Cursos del módulo educativo |
| `modules` | Módulos que agrupan lecciones |
| `lessons` | Lecciones individuales (video, artículo, interactivo) |
| `enrollments` | Inscripciones de usuarios a cursos |
| `progress` | Progreso del usuario en cada lección |
### Evaluación
| Tabla | Descripción |
|-------|-------------|
| `quizzes` | Quizzes/evaluaciones |
| `quiz_questions` | Preguntas de los quizzes |
| `quiz_attempts` | Intentos de usuarios en quizzes |
### Logros
| Tabla | Descripción |
|-------|-------------|
| `certificates` | Certificados de finalización |
| `user_achievements` | Logros/badges obtenidos |
### Gamificación
| Tabla | Descripción |
|-------|-------------|
| `user_gamification_profile` | XP, niveles, streaks, estadísticas |
| `user_activity_log` | Log de todas las actividades |
| `course_reviews` | Reviews y calificaciones de cursos |
---
## ENUMs
- `difficulty_level`: beginner, intermediate, advanced, expert
- `course_status`: draft, published, archived
- `enrollment_status`: active, completed, expired, cancelled
- `lesson_content_type`: video, article, interactive, quiz
- `question_type`: multiple_choice, true_false, multiple_select, fill_blank, code_challenge
- `achievement_type`: course_completion, quiz_perfect_score, streak_milestone, level_up, special_event
---
## Funciones Principales
### Gamificación
```sql
-- Actualizar XP del usuario
SELECT education.update_user_xp(
'user-uuid', -- user_id
100 -- xp_to_add
);
-- Actualizar streak del usuario
SELECT education.update_user_streak('user-uuid');
```
### Triggers Automáticos
- `updated_at`: Se actualiza automáticamente en todas las tablas
- `update_enrollment_progress()`: Calcula progreso al completar lecciones
- `auto_complete_enrollment()`: Completa enrollment al alcanzar 100%
- `generate_certificate_number()`: Genera número único de certificado
- `update_course_rating_stats()`: Actualiza rating promedio del curso
- `update_enrollment_count()`: Actualiza contador de enrollments
- `update_streak_on_activity()`: Actualiza streak en cada actividad
---
## Vistas
| Vista | Descripción |
|-------|-------------|
| `v_courses_with_stats` | Cursos con estadísticas agregadas |
| `v_user_course_progress` | Progreso del usuario por curso |
| `v_leaderboard_weekly` | Top 100 usuarios por XP semanal |
| `v_leaderboard_monthly` | Top 100 usuarios por XP mensual |
| `v_leaderboard_alltime` | Top 100 usuarios por XP total |
| `v_user_statistics` | Estadísticas completas del usuario |
| `v_popular_courses` | Top 50 cursos más populares |
---
## Dependencias
### Schemas externos
- `auth.users` - Tabla de usuarios (requerida)
### Extensions
- `gen_random_uuid()` - Built-in en PostgreSQL 13+
---
## Políticas de Seguridad (RLS)
Para habilitar Row Level Security (implementar según necesidad):
```sql
-- Habilitar RLS
ALTER TABLE education.enrollments ENABLE ROW LEVEL SECURITY;
ALTER TABLE education.progress ENABLE ROW LEVEL SECURITY;
ALTER TABLE education.quiz_attempts ENABLE ROW LEVEL SECURITY;
ALTER TABLE education.certificates ENABLE ROW LEVEL SECURITY;
-- Política: usuarios solo ven sus propios datos
CREATE POLICY user_own_data ON education.enrollments
FOR ALL
USING (user_id = current_setting('app.user_id')::UUID);
```
---
## Ejemplos de Uso
### Enrollar usuario a un curso
```sql
INSERT INTO education.enrollments (user_id, course_id)
VALUES ('user-uuid', 'course-uuid')
RETURNING *;
```
### Registrar progreso en lección
```sql
INSERT INTO education.progress (
user_id,
lesson_id,
enrollment_id,
is_completed,
watch_percentage
) VALUES (
'user-uuid',
'lesson-uuid',
'enrollment-uuid',
true,
100.00
);
-- Esto automáticamente actualizará el enrollment progress
```
### Completar quiz
```sql
INSERT INTO education.quiz_attempts (
user_id,
quiz_id,
enrollment_id,
is_completed,
is_passed,
user_answers,
score_percentage,
xp_earned
) VALUES (
'user-uuid',
'quiz-uuid',
'enrollment-uuid',
true,
true,
'[{"questionId": "q1", "answer": "A", "isCorrect": true}]'::jsonb,
85.00,
50
);
```
### Emitir certificado
```sql
INSERT INTO education.certificates (
user_id,
course_id,
enrollment_id,
user_name,
course_title,
completion_date,
final_score
) VALUES (
'user-uuid',
'course-uuid',
'enrollment-uuid',
'John Doe',
'Introducción al Trading',
CURRENT_DATE,
92.50
);
-- El número de certificado y código de verificación se generan automáticamente
```
### Agregar review a curso
```sql
INSERT INTO education.course_reviews (
user_id,
course_id,
enrollment_id,
rating,
title,
content
) VALUES (
'user-uuid',
'course-uuid',
'enrollment-uuid',
5,
'Excelente curso',
'Muy bien explicado y con ejemplos prácticos'
);
```
---
## Notas Importantes
1. **Referencias**: Todas las FKs a usuarios usan `auth.users(id)`
2. **Cascadas**: Las eliminaciones en CASCADE están definidas donde corresponde
3. **Índices**: Creados para optimizar queries frecuentes
4. **Constraints**: Validaciones de lógica de negocio implementadas
5. **JSONB**: Usado para metadata flexible (attachments, user_answers, etc.)
6. **Denormalización**: Algunas estadísticas están denormalizadas para performance
---
## Mantenimiento
### Resetear XP semanal/mensual
```sql
-- Resetear XP semanal (ejecutar cada lunes)
UPDATE education.user_gamification_profile SET weekly_xp = 0;
-- Resetear XP mensual (ejecutar el 1ro de cada mes)
UPDATE education.user_gamification_profile SET monthly_xp = 0;
```
### Recalcular estadísticas de curso
```sql
-- Recalcular total de módulos y lecciones
UPDATE education.courses c
SET
total_modules = (SELECT COUNT(*) FROM education.modules WHERE course_id = c.id),
total_lessons = (
SELECT COUNT(*)
FROM education.lessons l
JOIN education.modules m ON l.module_id = m.id
WHERE m.course_id = c.id
);
```
---
## Versión
**Versión:** 1.0.0
**Última actualización:** 2025-12-06