CREATE TABLE roles ( id_rol SERIAL PRIMARY KEY, nombre VARCHAR(50) UNIQUE NOT NULL ); CREATE TABLE usuarios ( id_usuario SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL, apellidos VARCHAR(150), email VARCHAR(150) UNIQUE NOT NULL, fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, activo BOOLEAN DEFAULT TRUE, id_rol INT NOT NULL, CONSTRAINT fk_usuario_rol FOREIGN KEY(id_rol) REFERENCES roles(id_rol) ); CREATE TABLE credenciales ( id_credencial SERIAL PRIMARY KEY, id_usuario INT UNIQUE NOT NULL, password_hash TEXT NOT NULL, ultimo_login TIMESTAMP, CONSTRAINT fk_credencial_usuario FOREIGN KEY(id_usuario) REFERENCES usuarios(id_usuario) ON DELETE CASCADE ); CREATE TABLE profesores ( id_profesor SERIAL PRIMARY KEY, id_usuario INT UNIQUE NOT NULL, especialidad VARCHAR(100), CONSTRAINT fk_profesor_usuario FOREIGN KEY(id_usuario) REFERENCES usuarios(id_usuario) ON DELETE CASCADE ); CREATE TABLE alumnos ( id_alumno SERIAL PRIMARY KEY, id_usuario INT UNIQUE NOT NULL, nivel VARCHAR(50), CONSTRAINT fk_alumno_usuario FOREIGN KEY(id_usuario) REFERENCES usuarios(id_usuario) ON DELETE CASCADE ); CREATE TABLE cursos ( id_curso SERIAL PRIMARY KEY, nombre VARCHAR(150) NOT NULL, descripcion TEXT, fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, id_profesor INT NOT NULL, CONSTRAINT fk_curso_profesor FOREIGN KEY(id_profesor) REFERENCES profesores(id_profesor) ); CREATE TABLE matriculas ( id_matricula SERIAL PRIMARY KEY, id_alumno INT NOT NULL, id_curso INT NOT NULL, fecha_matricula TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_matricula_alumno FOREIGN KEY(id_alumno) REFERENCES alumnos(id_alumno) ON DELETE CASCADE, CONSTRAINT fk_matricula_curso FOREIGN KEY(id_curso) REFERENCES cursos(id_curso) ON DELETE CASCADE, CONSTRAINT unique_matricula UNIQUE(id_alumno, id_curso) ); CREATE TABLE actividades ( id_actividad SERIAL PRIMARY KEY, titulo VARCHAR(200) NOT NULL, descripcion TEXT, fecha_publicacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, fecha_entrega TIMESTAMP, puntuacion_maxima NUMERIC(5,2), id_curso INT NOT NULL, CONSTRAINT fk_actividad_curso FOREIGN KEY(id_curso) REFERENCES cursos(id_curso) ON DELETE CASCADE ); CREATE TABLE entregas ( id_entrega SERIAL PRIMARY KEY, id_actividad INT NOT NULL, id_alumno INT NOT NULL, fecha_entrega TIMESTAMP DEFAULT CURRENT_TIMESTAMP, contenido TEXT, estado VARCHAR(50) DEFAULT 'pendiente', CONSTRAINT fk_entrega_actividad FOREIGN KEY(id_actividad) REFERENCES actividades(id_actividad) ON DELETE CASCADE, CONSTRAINT fk_entrega_alumno FOREIGN KEY(id_alumno) REFERENCES alumnos(id_alumno) ON DELETE CASCADE ); CREATE TABLE calificaciones ( id_calificacion SERIAL PRIMARY KEY, id_entrega INT UNIQUE NOT NULL, nota NUMERIC(5,2), observaciones TEXT, fecha_calificacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_calificacion_entrega FOREIGN KEY(id_entrega) REFERENCES entregas(id_entrega) ON DELETE CASCADE ); CREATE TABLE progreso ( id_progreso SERIAL PRIMARY KEY, id_alumno INT NOT NULL, id_curso INT NOT NULL, porcentaje NUMERIC(5,2) DEFAULT 0, CONSTRAINT fk_progreso_alumno FOREIGN KEY(id_alumno) REFERENCES alumnos(id_alumno) ON DELETE CASCADE, CONSTRAINT fk_progreso_curso FOREIGN KEY(id_curso) REFERENCES cursos(id_curso) ON DELETE CASCADE, CONSTRAINT unique_progreso UNIQUE(id_alumno, id_curso) ); CREATE TABLE horarios ( id_horario SERIAL PRIMARY KEY, id_curso INT NOT NULL, dia_semana INT NOT NULL CHECK (dia_semana BETWEEN 1 AND 5), hora_inicio TIME NOT NULL, hora_fin TIME NOT NULL, aula VARCHAR(50), CONSTRAINT fk_horario_curso FOREIGN KEY(id_curso) REFERENCES cursos(id_curso) ON DELETE CASCADE ); CREATE TABLE proyectos ( id_proyecto SERIAL PRIMARY KEY, id_curso INT NOT NULL, titulo VARCHAR(200) NOT NULL, descripcion TEXT, fecha_entrega TIMESTAMP, estado VARCHAR(50) DEFAULT 'en curso', porcentaje_completado NUMERIC(5,2) DEFAULT 0, CONSTRAINT fk_proyecto_curso FOREIGN KEY(id_curso) REFERENCES cursos(id_curso) ON DELETE CASCADE ); CREATE TABLE proyectos_estudiantes ( id_proyecto INT NOT NULL, id_alumno INT NOT NULL, PRIMARY KEY (id_proyecto, id_alumno), CONSTRAINT fk_pe_proyecto FOREIGN KEY(id_proyecto) REFERENCES proyectos(id_proyecto) ON DELETE CASCADE, CONSTRAINT fk_pe_alumno FOREIGN KEY(id_alumno) REFERENCES alumnos(id_alumno) ON DELETE CASCADE ); CREATE TABLE examenes ( id_examen SERIAL PRIMARY KEY, id_curso INT NOT NULL, titulo VARCHAR(200) NOT NULL, temario TEXT, fecha TIMESTAMP NOT NULL, duracion_minutos INT NOT NULL, modalidad VARCHAR(50), CONSTRAINT fk_examen_curso FOREIGN KEY(id_curso) REFERENCES cursos(id_curso) ON DELETE CASCADE );