En esta entrada realizaremos la construcción de una base de datos la cual contendrá una serie de datos proporcionados por un documento llamado "Kardex" donde se almacena de manera organizada información acerca de las materias cursadas por un alumno, notas definitivas, cantidad de créditos, sección y código de la materia así como aspectos que ayudan a medir el desempeño del alumno tales como la eficiencia, el promedio general y el promedio ponderado.
La asignación consta de 4 actividades:
1-Modelar la Base de Datos
2-Creación de la Base de Datos (DDL) en la herramienta Postgresql
3-Manipulación de la Base de Datos (DML) generando un INSERT para cada uno de los registros almacenados en el documento "Kardex"
4-Generar los querys(consultas) para cada una de las estadísticas que contenga el documento(Eficiencia, promedio, UC inscritas, etc.).
Empecemos con la asignación:
1- Modelar la base de datos.
El primer paso que debemos realizar es determinar las Entidades (Tablas):
Dado que el documento contiene información histórica del desempeño de un estudiante en la carrera se debe crear la tabla "Estudiante", para almacenar la información de las materias cursadas se debe crear una tabla llamada "Materia", adicional a esto, si se desea tener información de los profesores que dictaron la materia en un periodo dado y la escuela y la facultad a la cual pertenece la materia se pueden crear tablas llamadas "Profesor", "Escuela" y "Facultad".
Para cada entidad se definirán atributos los cuales son características especificas que tiene una entidad para poder identificarla o describirla. Cada entidad deberá tener un único atributo denominado clave principal que permitirá identificar de forma univoca a cada registro de la tabla.
En la siguiente imagen se mostrara las entidades "Estudiante" y "Materia" y sus atributos. Destacando la clave principal de la entidad con su nombre subrayado.
|
Entidad Estudiante |
|
Entidad Materia |
El segundo paso es determinar la relación entre las tablas (Entidades).
En este caso, la relación entre la tabla "Estudiante" y "Materia" sera una tabla, que yo llamare, "Cursa" que contendrá sus atributos, que serán los datos proporcionados por el documentos Kardex (nota, estado, sección, semestre cursado) ,ademas de las claves primarias de las entidades asociadas a ella.
|
Tabla "Cursa" la cual establece una relación entre las tablas "Estudiante" y "Materia" |
El siguiente paso para realizar la asignación consiste en crear un diagrama relacional a partir de este modelo E-R:
Como podrán notar, ademas de las tablas "Estudiante", "Cursa" y "Materia", cree tablas y relaciones adicionales para obtener mas información acerca de ese estudiante. La tabla "Profesor" y su relación con la tabla "Materia" a través de la tabla "Dicta" y tablas llamadas "Pertenece_M_E" el cual contiene la relación de la materia pertenece a tal "Escuela" y la escuela a tal facultad.
2-Creación de la Base de Datos (DDL) en la herramienta Postgresql
Consulta para crear tabla “estudiante”:
CREATE TABLE estudiante ( id_estudiante integer NOT NULL, ci_estudiante character varying(15),nombre character varying(15), apellido character varying(15), correo character varying(50), CONSTRAINT "Estudiante_pkey" PRIMARY KEY (id_estudiante));
Consulta para crear tabla “materia”:
CREATE TABLE materia( codigo_materia integer NOT NULL, nombre_materia character varying(100), tipo character varying(100), semestre character varying(15), creditos integer, CONSTRAINT "Materia_pkey" PRIMARY KEY (codigo_materia));
Consulta para crear tabla “cursa”:
CREATE TABLE cursa ( id_cursa integer NOT NULL, id_estudiante integer, codigo_materia integer, estado character varying(15), nota integer, seccion character varying(15), semestre character varying(15), CONSTRAINT cursa_pkey PRIMARY KEY (id_cursa), CONSTRAINT cursa_codigo_materia_fkey FOREIGN KEY (codigo_materia);
Se pueden ver las consultas para las demás tablas en el enlace adjunto al final de la entrada.
3-Manipulación de la Base de Datos (DML) generando un INSERT para cada uno de los registros almacenados en el documento "Kardex".
Ejemplo de inserción en la tabla 'materia':
INSERT INTO materia(codigo_materia, nombre_materia, tipo, semestre, creditos) VALUES (8206, 'Matematica I', 'Obligatoria', '1',6);
Ejemplo de inserción en la tabla 'estudiante':
INSERT INTO estudiante(id_estudiante, ci_estudiante, nombre, apellido, correo) VALUES (1, '20','Claudio' ,'Torrez', 'ct@gmail.com');
Ejemplo de inserción en la tabla 'cursa':
INSERT INTO cursa(id_cursa, id_estudiante, codigo_materia, estado, nota, seccion, semestre) VALUES (1, 1, 8206,'Aprobada',12 ,'U11' ,'02-2008');
Se pueden ver las consultas de los demas registros de las tablas en el enlace adjunto al final de la entrada.
4-Generar los querys(consultas) para cada una de las estadísticas que contenga el documento(Eficiencia, promedio, UC inscritas, etc.).
Consulta para calcular las unidades inscritas:
select sum(m.creditos)
from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.nota <> 0;
Unidades Inscritas: 165.
Consulta para calcular las unidades aprobadas:
select sum(m.creditos) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada';
Unidades aprobadas: 155.
Consulta para calcular las unidades aprobadas por equivalencia:
select sum(m.creditos) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado ='Equivalencia';:
Unidades aprobadas por equivalencia: 0.
Consulta para calcular el total de unidades aprobadas:
select sum(m.creditos) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada'
or c.estado ='Equivalencia' ;
Total Unidades aprobadas: 155.
Consulta para calcular el número de asignaturas inscritas:
select count(m.nombre_materia) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.nota <>0;
Número de asignaturas inscritas: 34.
Consulta para calcular el número de asignaturas aprobadas:
select count(m.nombre_materia) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada';
Número de asignaturas aprobadas: 32.
Consulta para calcular el número de asignaturas aprobadas por equivalencia:
select count(m.nombre_materia) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado = 'Equivalencia';
Número de asignaturas aprobadas por equivalencia: 0.
Consulta para calcular el número de asignaturas retiradas:
select count(m.nombre_materia) from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado='Retirada';
Número de asignaturas aprobadas por equivalencia: 0.
Consulta para calcular el promedio general de notas:
select cast(sum(c.nota) as real)/cast(count(c.nota) as real)
from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado <> 'Retirada' and c.codigo_materia <> 6536;
Promedio general de notas: 12,6364.
Consulta para calcular el promedio ponderado de notas:
select cast(a.suma1 as real)/cast(b.suma2 as real) as nota_ponderada
from (select sum(m.creditos * c.nota) as suma1 from cursa c, materia m
where c.codigo_materia = m.codigo_materia and c.estado <> 'Retirada' and c.codigo_materia <> 6536) a,
(select sum(m.creditos) as suma2 from cursa c, materia m where c.codigo_materia = m.codigo_materia and c.estado <> 'Retirada' and c.codigo_materia <> 6536) b;
Promedio ponderado de notas: 12,4074.
Consulta para calcular el promedio general de notas aprobadas:
select cast(sum(c.nota)/count(c.nota) as real) from cursa c, materia m where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada' and c.codigo_materia <> 6536;
Promedio general de notas aprobadas: 13.
Consulta para calcular el promedio ponderado de notas aprobadas:
select cast(a.suma1 as real)/cast(b.suma2 as real) as nota_ponderada_aprobada
from (select sum(m.creditos * c.nota) as suma1 from cursa c, materia m where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada' and c.codigo_materia <> 6536) a,
(select sum(m.creditos) as suma2 from cursa c, materia m where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada' and c.codigo_materia <> 6536) b;
Promedio ponderado de notas aprobadas: 12,7632.
Consulta para calcular la eficiencia:
select cast(b.count2 as real)/cast(a.count1 as real)
from (select count(m.nombre_materia) as count1 from cursa c, materia m where c.codigo_materia = m.codigo_materia and c.nota <>0 and c.codigo_materia <> 6536) a,
(select count(m.nombre_materia) as count2 from cursa c, materia m where c.codigo_materia = m.codigo_materia and c.estado = 'Aprobada' and c.codigo_materia <> 6536 ) b;
Eficiencia: 0,939394.
Y con esto concluye la asignacion.
Para consultar el Kardex de donde se sacaron los registros, el informe donde se encuentran todas las tablas y relaciones, las consultas utilizadas para la creacion de la base de datos y el backup de la base de datos hecha en postgres, se podran descargar del siguiente
enlace. El archivo es un comprimido .zip.