Está en la página 1de 7

Prueba de habilidades técnicas

Objetivo:

Cumplir con el requerimiento presentado en caso de negocio

Fecha de entrega:

29 de abril 2023

Calificación máxima:

100 pt

Correo (Jimmy Naranjo)

ja_naranjo@ivieduca.com

Caso de Negocio:

Se requiere de un sistema que administre a estudiantes, profesores y materias de la unidad


educativa Sirius, para ello se requiere que el sistema pueda recibir información de los
estudiantes (cedula, nombre, e-mail), información de los docentes (cedula, nombre, e-mail), y
datos de la materia (nombre de la materia, profesor que lo imparte, y alumnos registrados
para esa materia).

Se requiere que permita configurar el año lectivo en diferentes periodos de tiempo (bimestre,
trimestre, quimestre, semestre, etc.), para la entrega de boletines por periodo, de igual
manera un periodo puede estar divido en partes internas de tiempo (subperiodo). Los
estudiantes tendrán notas finales de cada periodo. Si un periodo tiene subperiodos tendría
notas de subperiodo y estas se promedian para obtener la nota final del periodo.

Pantalla de referencia:
Para cumplir con estos requerimientos se solicita:

1. Describir como diseñaría la DB relacional Sql (20 pt)


Al ser un diseño libre y sin tener en cuenta los recursos de hardware que en este caso
tendría la unidad educativa Sirius ni tampoco la escalabilidad de la aplicación ni el volumen
de usuarios que va a tener, para el diseño de la DB relacional tome en cuenta la forma de
implementar la solución con la menor cantidad posible de tablas, también tome en cuenta
que los tiempos de procesamiento en sql general carga a los equipos, decidí crear
solamente 5 tablas asumiendo que es un escenario pequeño trate de optimizar los
recursos, las tablas principales estarían conformadas por alumnos, profesores y materias,
en cuanto al requerimiento del periodo y subperiodo, el subperiodo vendría a ser una tabla
intermedia entre el periodo y la materia. Con este diseño el subperiodo almacenaría 6
notas por defecto, ya que el semestre que es el mas grande de los subperiodos consta de 6
meses (asumiendo que se almacena una nota por mes), en el caso de que el subperiodo sea
un bimestre almacenaría 2 notas y el resto serian 0 o null por defecto (habría que definirlo
con el equipo de trabajo).
El modelo entidad relación sería el siguiente:
El script de la creación de la DB es el siguiente:

create table Alumnos


(
idAlumno int identity (1,1) not null,
codigo varchar(10),
nombre varchar(50),
email varchar(50)

constraint pk_Alumnos primary key (idAlumno)

create table Profesores


(
idProfesor int identity (1,1) not null,
codigo varchar(10),
nombre varchar(50),
email varchar(50)

constraint pk_Profesor primary key (idProfesor)

create table Materias


(
idMaterias int identity (1,1) not null,
nombreMateria varchar(25),
idProfesor int,
idAlumno int

constraint pk_Materias primary key (idMaterias),


constraint fk_pk_Profesor foreign key (idProfesor) references Profesores (idProfesor),
constraint fk_pk_Alumnos foreign key (idAlumno) references Alumnos (idAlumno)

create table SubPeriodo(


idSubPeriodo int identity (1,1) not null,
tipoSubPeriodo varchar(20),
subNota1 decimal(4,2),
subNota2 decimal(4,2),
subNota3 decimal(4,2),
subNota4 decimal(4,2),
subNota5 decimal(4,2),
subNota6 decimal(4,2),
idMaterias int

constraint pk_SubPeriodo primary key (idSubPeriodo),


constraint fk_pk_MateriasPeriodo foreign key (idMaterias) references Materias (idMaterias)
)

create table Periodo(


idPeriodo int identity (1,1) not null,
tipoPeriodo varchar(20),
notaFinal float,
fechaInicio dateTime,
fechaFinal dateTime,
idSubPeriodo int

constraint pk_Periodo primary key (idPeriodo),


constraint fk_pk_SubPeriodo foreign key (idSubPeriodo) references SubPeriodo (idSubPeriodo)
)
2. Realizar la consulta de las notas por materia (indicando la materia) del estudiante para
el fin de periodo según su diagrama de base de datos. Enviar el código de la consulta
realizada en lenguaje SQL Server y en linq (20 pt)

SELECT Mat.nombreMateria AS materia, P.notaFinal AS notas, P.tipoPeriodo AS periodo


FROM Materias Mat
INNER JOIN SubPeriodo Sub ON Mat.idMaterias = Sub.idMaterias
INNER JOIN Periodo P ON Sub.idSubPeriodo = P.idSubPeriodo
WHERE Mat.idAlumno = idAlumno

var query = db.Materias


.Join(db.SubPeriodo, mat => mat.idMaterias, sub => sub.idMaterias, (mat, sub)
=> new { Mat = mat, Sub = sub })
.Join(db.Periodo, ms => ms.Sub.idSubPeriodo, p => p.idSubPeriodo, (ms, p) =>
new { MatSub = ms, Periodo = p })
.Where(msp => msp.MatSub.Mat.idAlumno == idAlumno)
.Select(msp => new { materia = msp.MatSub.Mat.nombreMateria, notas =
msp.Periodo.notaFinal, periodo = msp.Periodo.tipoPeriodo });

3. A partir de su modelo de bbd justifique que servicios crearía para el funcionamiento


del sistema (20 pt)
A nivel de base de datos no me gustaría trabajar puesto que no es la opción más optima, yo
usaría apis para realizar los cálculos y operaciones a nivel de sw y no a nivel de base de
datos, pero para el requerimiento y tomando en cuenta que es a nivel de base de datos,
crearía procesos almacenados para el CRUD de cada una de las tablas, como, por ejemplo:

-- Ingresar nuevo profesor


INSERT INTO Profesores (codigo, nombre, email)
VALUES (@CodigoProfesor, @NombreProfesor, @EmailProfesor)

-- Ingresar nuevo alumno


INSERT INTO Alumnos (codigo, nombre, email)
VALUES (@CodigoAlumno, @NombreAlumno, @EmailAlumno)

-- Ingresar nueva materia


INSERT INTO Materias (nombreMateria, idProfesor, idAlumno)
VALUES (@NombreMateria, @IdProfesor, @IdAlumno)

-- Ingresar nuevo subperiodo


DECLARE @idMaterias int
SELECT @idMaterias = SCOPE_IDENTITY()
INSERT INTO SubPeriodo (tipoSubPeriodo, subNota1, subNota2, subNota3, subNota4,
subNota5, subNota6, idMaterias)
VALUES (@TipoSubPeriodo, @SubNota1, @SubNota2, @SubNota3, @SubNota4,
@SubNota5, @SubNota6, @idMaterias)

-- Ingresar nuevo periodo


DECLARE @idSubPeriodo int
SELECT @idSubPeriodo = SCOPE_IDENTITY()
INSERT INTO Periodo (tipoPeriodo, notaFinal, fechaInicio, fechaFinal, idSubPeriodo)
VALUES (@TipoPeriodo, @NotaFinal, @FechaInicio, @FechaFinal, @idSubPeriodo)
También procesos CRUDS para las notas como, por ejemplo:

CREATE PROCEDURE IngresarNotas


@codigoAlumno varchar(10),
@nombreMateria varchar(25),
@subNota1 decimal(4,2) = NULL,
@subNota2 decimal(4,2) = NULL,
@subNota3 decimal(4,2) = NULL,
@subNota4 decimal(4,2) = NULL,
@subNota5 decimal(4,2) = NULL,
@subNota6 decimal(4,2) = NULL,
@tipoSubPeriodo varchar(20)
AS
BEGIN
DECLARE @idAlumno int
SELECT @idAlumno = idAlumno FROM Alumnos WHERE codigo = @codigoAlumno

DECLARE @idMateria int


SELECT @idMateria = idMateria FROM Materias WHERE nombreMateria =
@nombreMateria AND idAlumno = @idAlumno

IF (@idMateria IS NOT NULL)


BEGIN
IF (@subNota1 IS NOT NULL)
BEGIN
UPDATE SubPeriodo SET subNota1 = @subNota1 WHERE idMateria =
@idMateria AND tipoSubPeriodo = @tipoSubPeriodo
END

IF (@subNota2 IS NOT NULL)


BEGIN
UPDATE SubPeriodo SET subNota2 = @subNota2 WHERE idMateria =
@idMateria AND tipoSubPeriodo = @tipoSubPeriodo
END

IF (@subNota3 IS NOT NULL)


BEGIN
UPDATE SubPeriodo SET subNota3 = @subNota3 WHERE idMateria =
@idMateria AND tipoSubPeriodo = @tipoSubPeriodo
END

IF (@subNota4 IS NOT NULL)


BEGIN
UPDATE SubPeriodo SET subNota4 = @subNota4 WHERE idMateria =
@idMateria AND tipoSubPeriodo = @tipoSubPeriodo
END
IF (@subNota5 IS NOT NULL)
BEGIN
UPDATE SubPeriodo SET subNota5 = @subNota5 WHERE idMateria =
@idMateria AND tipoSubPeriodo = @tipoSubPeriodo
END

IF (@subNota6 IS NOT NULL)


BEGIN
UPDATE SubPeriodo SET subNota6 = @subNota6 WHERE idMateria =
@idMateria AND tipoSubPeriodo = @tipoSubPeriodo
END
END
END

Pero otros servicios importantes podría ser una autenticación a través de sql, para
mantener seguridad en dos capas.
Procesos tales como Calcular nota final, calcular el acumulado de las notas de los
subperiodos, las consultas para ver los estudiantes de una materia, las materias que da un
profesor, calcular si un estudiante esta aprobado o no, consultas para ver periodos y
subperiodos académicos.

4. Genere un diagrama de actividades del proceso descrito en el sistema (20 pt)

Diagrama de actividades del proceso que tendría un estudiante para consultar su nota
5. Que implementaría para garantizar la seguridad del sistema (10 pt)
Teniendo en cuenta los avances tecnológicos tanto para las cosas buenas y malas, yo
considero, que es muy complicado (si no imposible) garantizar la seguridad de un sistema
informático, pero lo que si se puede hacer es mitigar al máximo las vulnerabilidades y las
acciones que yo tomaría son las siguientes:
• Implementar un sistema de autenticación robusto con un control de acceso de
usuarios.
• Encriptar los datos tanto en la conexión de la base de datos, como también las claves
de los usuarios.
• En lo posible no acceder al sistema de manera remota, pero si hacerlo implementar
Vxlan o túneles Gre, o usar una vpn confiable, (dependerá de cuantas personas
podrán acceder)
• Realizar auditorias y registros de actividades tanto en base de datos, como en el
control de acceso de la aplicación
• Crearía un módulo extra de gestión de usuarios.
• Certificado SSL en el servidor web
• Notificar el acceso implementando un servidor SMTP
• Crear verificación para el acceso para evitar el DOS
• Actualizar periódicamente el sistema, corrigiendo los errores y las posibles
vulnerabilidades.
• Formación y concientización, el eslabón más débil de la cadena de seguridad es el
usuario, por eso es de vital importancia capacitar a los usuarios con medidas de
seguridad y formas de que ellos puedan proteger su información, sobre todo para
que no comprometan la seguridad del sistema.

6. Describa que dificultades encuentra en la creación de un sistema como el mencionado


y como solucionaría dichas dificultades (de manera técnica) (10 pt)
Una de las dificultades fue que los periodos tenían subperiodos y al no saber el alcance de
la solución requerida implemente menos tablas para asegurar un mejor rendimiento si
existieran los recursos de hardware y demás implementaría más tablas con el fin de que se
faciliten las consultas y procesos almacenados una opción podría ser crear una tabla notas
que se asocie a los subperiodos y también una tabla para las fechas, de cualquier manera, si
las consultas se hicieran a nivel de sw y no de DB se mejoraría el rendimiento al realizar apis
que permitan hacer los microservicios requeridos. Usaría entity framework y el patrón de
diseño para crear un repositorio y que sea más optimo la gestión de los datos de cada tabla.

También podría gustarte