Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lima, Perú
2022
Índice
Introducción 1
Vista Funcional de la Base de datos 1
Propósito 1
Objetivos 1
Objetivo principal 1
Objetivos específicos 1
Alcances y limitaciones 2
Alcances 2
Limitaciones 2
Reglas del negocio 2
Reglas del modelo de datos 2
Reglas de relación 2
Regla de flujo 3
Modelo conceptual 5
Modelo lógico 7
Modelo Físico 8
Creación de las tablas en SQL 9
Carga de datos a las tablas 9
Restricciones, consultas y optimización 10
Restricciones 10
Tabla Celda 10
Tabla Condena 10
Tabla Empleado 11
Tabla Nacionalidad 12
Tabla Pabellón 12
Tabla Personal 13
Tabla Rasgos 13
Tabla ReoVisita 14
Tabla Tatuajes 15
Tabla TatuajesReo 15
Consultas 16
Consultas sin optimizar 16
Consultas con optimización 28
Comandos de administración de base de datos 34
Creación de Logins 34
Creación de usuarios 35
Asignar rol a un usuario 36
Asignar o revocar privilegios a un usuario 37
Creación de un plan de mantenimiento para la BD 38
Creación de CTE - COMMON TABLE EXPRESSION 42
Creación de Triggers y Stored Procedure 44
Conclusiones 47
Recomendaciones 48
Referencias 49
1. Introducción
El siguiente documento tiene como objetivo la creación de una base de datos para
un centro penitenciario, esta base de datos estará documentada desde su
concepción como modelo conceptual, luego pasando por el modelo conceptual,
luego un modelo lógico y finalmente siendo implementada en SQL Server haciendo
uso de Microsoft SQL Server Management Studio. Por último se incluirán todos los
temas vistos durante el semestre del curso de Base de datos II que corresponden a
la administración de base de datos.
2.1. Propósito
Entonces, al existir una sobrepoblación carcelaria, debe haber una correcta gestión
y administración de la información correspondiente a cada uno de las personas
encarceladas, asegurándose que su información sea correcta para evitar errores
administrativos. De igual forma, se busca registrar la información del personal que
labora en la penitenciaría.
Se destaca entonces que, para una adecuada gestión penitenciaria se debe contar
con los datos e información suficientes de cada una de las entidades.
2.2. Objetivos
● Crear una base de datos que permita administrar de forma adecuada los
distintos datos que tiene un centro penitenciario.
1
● Evitar la pérdida de información con el pasar del tiempo que puede ser
perjudicial si es que no se almacena correctamente.
● Distribución correcta de los reos al centro penitenciario ya que en los centros
penitenciarios de nuestro país tienen hacinamiento.
2.3.1. Alcances
2.3.2. Limitaciones
b. Reglas de relación
● Un reo que haya ingresado al centro penitenciario, se deberá garantizar que
no es posible retirarlo, salvo que se cumpla la sentencia completa.
● Uno de los campos de visitante deberá ser el reo al cual visitan
2
● Un empleado del centro penitenciario deberá estar siempre asociado a un
área dentro de este centro penitenciario.
c. Reglas de restricciones
d. Regla de flujo
● Antes de las visitas del prisionero se deben registrar los datos de las
personas que ingresan
● Después de las visitas del prisionero se registrará la hora de salida
● El número máximo de horas de visita son 3 horas.
3
A continuación, se muestran las principales entidades que serán tomadas en cuenta
para el desarrollo de esta base de datos con algunos campos que creemos serán
necesarios.
4
3. Modelo conceptual
5
El siguiente diagrama de entidad relación (ER) fue realizado teniendo en cuenta
las entidades definidas previamente, este gráfico fue realizado haciendo uso del
software web LucidChart, en este se define de mejor manera los atributos de
cada entidad.
6
4. Ventajas y desventajas
VENTAJAS DESVENTAJAS
El modelo contempla que todas aquellas No se contempló que a un preso pueda tener
personas que visitan a un preso sean una reducción de la condena ya que según las
registradas en la base de datos, esto aumenta reglas de negocio esta no puede ser variada.
la seguridad del establecimiento penitenciario.
5. Modelo lógico
7
Para una mejor visualización del modelo, ingresar al siguiente link
https://drive.google.com/file/d/1gH7zqfPReJh-o8P1lTdYmXDmrJ7-L2pS/view?us
p=sharing
6. Modelo Físico
8
7. Creación de las tablas en SQL
9
9. Restricciones, consultas y optimización
9.1. Restricciones
a) Tabla Celda
idCelda
Para este primer check constraint se requiere que los datos introducidos en la
columna idCelda siempre puedan empezar con la letra C seguidos de caracteres
numéricos.
camas
Crearemos un check constraint que nos asegure que al introducir datos en el campo
camas, estos siempre sean un número positivo. De esta manera nuestros datos en
esta tabla tendrán siempre sentido de acuerdo al objetivo de la BD.
Nótese que ambos constraint fueron creados con éxito en el explorador de objetos
de SSMS.
b) Tabla Condena
fecha_inicio, fecha_fin
Se creará un check constraint que comparta que ambas fechas no son iguales y que
sino la data no tendría sentido ya que un preso no puede tener como fecha de inicio
de condena el mismo día en el que acaba.
USE centropenitenciario
10
ALTER TABLE Condena
ADD CONSTRAINT valid_date
CHECK([fecha_inicio]<>[fecha_fin])
Ahora crearemos otra nueva restricción para esta tabla ya que también debemos
cerciorarnos que la fecha de fin de condena siempre sea mayor que la fecha de
inicio de la condena del preso.
USE centropenitenciario
ALTER TABLE Condena
ADD CONSTRAINT valid_startDate_endDate
CHECK(fecha_inicio < fecha_fin);
idReo
Por último crearemos un check constraint para el campo de idReo , sabemos por
nuestras reglas de negocio que este tipo de dato está identificado con una R al inicio
seguido de un código numérico, para impedir que datos que nos correctos puedan
ingresarse creamos este nuevo constrain.
Vemos que los tres check constraint fueron creados exitosamente en el explorador
de objetos de SSMS.
c) Tabla Empleado
Nacionalidad_Empleado
Una forma de crear el Check Constraint es en el mismo momento de crear la tabla.
En nuestro caso la columna de [nacionalidad_empleado] sólo contiene 3 caracteres
debido a una norma ISO.
11
Ahora vemos que se creó correctamente.
d) Tabla Nacionalidad
IdNacionalidad
Ahora creamos un checkConstraint para la columna [idNacionalidad] de la tabla
Nacionalidad. El caso es el mismo que el anterior donde cada id debe de estar
formado por 3 caracteres según norma ISO.
e) Tabla Pabellón
IdPabellon
Creamos un check Constraint para la columna [idPabellon] de la tabla Pabellon. El
caso es que la id se debe identificar con una ‘P’ seguido de un código numérico.
12
CHECK (idPabellon LIKE 'P%')
Planta
Creamos un check Constraint para la columna [planta] de la tabla Pabellon, de modo
que este solo acepta datos cuyo número sea positivo.
f) Tabla Personal
IdEmpleados
Creamos un check Constraint para la columna [idEmpleado] de la tabla
PersonalEmpleo, de modo que solo acepte datos ingresados que sean números
positivos.
g) Tabla Rasgos
Tez
Se creará un Check Constraint para establecer el ingreso de valores para el campo
tez.
Peso
Se creará un Check Constraint para que el peso sea un número natural.
13
ADD CONSTRAINT valid_peso
CHECK(peso>0)
Altura
Se creará un Check Constraint para la altura para que este sea un número natural.
CHECK(altura>0)
idReo
Por último crearemos un check constraint para el campo de idReo , sabemos por
nuestras reglas de negocio que este tipo de dato está identificado con una R al inicio
seguido de un código numérico, para impedir que datos que nos correctos puedan
ingresarse creamos este nuevo constraint.
h) Tabla ReoVisita
idVisitante
Crearemos un check constraint para el campo de idVisitante, sabemos por nuestras
reglas de negocio que este tipo de dato está identificado con una V al inicio seguido
de un código numérico, para impedir que datos que nos correctos puedan
ingresarse creamos este nuevo constraint.
14
ALTER TABLE [dbo].[ReoVisita]
hora_ingreso, hora_salida
Se creará un Check Constraint para establecer que la de hora_ingreso debe ser
diferente a hora_salida.
Luego se creará un Check Constraint para establecer que hora_ingreso debe ser
menor que hora_salida.
i) Tabla Tatuajes
IdTatuaje
Se creará un Check Constraint para el id de los tatuajes para que este sea un
número natural.
j) Tabla TatuajesReo
IdTatuaje
Se creará un Check Constraint para el id de los tatuajes para que este sea un
número natural.
15
ALTER TABLE [dbo].[TatuajesReo] ADD CONSTRAINT CK_TatuajesReo CHECK
(idTatuaje>0)
9.2. Consultas
Autores
16
n.nombre_nac,d.nombre_del from reo as r
inner join Nacionalidad as n on n.idNacionalidad = r.nacionalidad_reo
inner join ReoDelito as rd on rd.idReo = r.idReo
inner join Delito as d on d.idDelito = rd.idDelito
where datediff(year,r.fecha_nacimiento_reo,getdate()) < (select
avg(datediff(year,r.fecha_nacimiento_reo,getdate())) as Edad from Reo as r)
and n.nombre_nac in('Perú','Venezuela')
order by concat(r.nombre_reo,' ',r.apellido_paterno_reo,' ',r.apellido_materno_reo);
Salida de la consulta 1
17
Gráfico del Plan de ejecución de consulta no optimizada número 1
18
Compute Scalar Sort
● Luego, aparece el operador Compute Scalar. Este operador es usado para calcular nuevos valores basados en
valores de otras columnas. Estos nuevos valores son calculados mediante una operación de nombre “cálculo
19
escalar”. Tal como se ve en la gráfica del plan de ejecución, tiene como input al output del operador anterior. Esto se
debe a que se calcularán nuevos valores para la fecha de nacimiento del reo a partir de la columna
‘fecha_nacimiento_reo’ de la tabla ‘Reo’. En SQL Server, se señala que el tipo de dato a obtener en este Compute
Scalar es datetimeoffset.
● Seguidamente, encontramos al operador Stream Aggregate (Aggregate). Tiene una sola entrada y una sola salida
y, normalmente, el número de filas como output es mucho menor que el input porque devuelve solo una fila para
cada grupo de filas recibidas como input. Recordar que usa datos que han sido ordenados previamente para realizar
la agregación de una forma rápida. Los tipos de agregación más habituales son SUM y AVG y, justamente, SUM es
la agregación que aparece al ejecutar mostrar el Plan de ejecución, exactamente en
datediff(year,r.fecha_nacimiento_reo,getdate()), al querer sumar los valores de diferencia entre ‘year’ y
‘fecha_nacimiento_reo’.
● Nuevamente, aparece un Compute Scalar. Esto se debe a que calculará nuevos valores basados en valores de
otras columnas, en este caso, convierte los valores output del operador anterior (Stream Aggregate (Aggregate)).
● En la línea inferior, se aprecia otro Clustered index scan (Clustered), que también hace referencia a la tabla Reo y
su primary key ‘idReo’. Sin embargo, este es de tipo ORDERED FORWARD SCAN, el cual devuelve los datos en el
orden que se especificó cuando se creó el índice. Seguidamente, aparece un operador Compute Scalar, del cual ya
comprendemos su rol en el Plan de ejecución.
● Ambos operadores Compute Scalar de las 2 líneas analizadas son nodos hijos del nodo Nested Loops (Inner
Join), este último viene a ser el nodo padre. Este operador realiza las operaciones de JOIN y se realizan búsquedas
en la tabla interna por cada fila de otra tabla externa. Se devolverán las filas que cumplen con un predicado:
(datediff(year,[Expr1013],CONVERT_IMPLICIT(datetimeoffset(3),getdate(),0))<[Expr1006])), siendo Expr1006 el
output tras ejecutar el Compute Scalar de la línea superior y Expr1013, el de la línea inferior.
20
Se aprecia que se obtiene un porcentaje de 101% (55 de 54). Tal como señala Ariely (2020), “este error en el cálculo
del costo de la operación ocurre raramente y se debe a un error de la herramienta de cálculo de porcentajes de costo
por el lado del cliente”.
● En un tercer nivel, aparece un operador Clustered index seek (Clustered), el cual se usa cuando el requisito es
obtener datos filtrados. Si una tabla tiene una clave principal (índice agrupado) y se escribe una consulta para filtrar
algunos registros con la ayuda del índice agrupado, se realizará la operación de búsqueda del índice agrupado
[Clustered index seek]. En este caso, se está buscando la nacionalidad de un reo, accediendo por lo tanto, a la tabla
Nacionalidad y haciendo uso de su primary key ‘PK_Nacionalidad’.
● Después, se muestra que Clustered index seek (Clustered) (analizado en el punto anterior) y un primer Nested
Loops son inputs al siguiente Nested Loops. Ello ocurre por lo especificado en la consulta, exactamente en la 4ta
línea, en inner join Nacionalidad as n on n.idNacionalidad = r.nacionalidad_reo, donde se consultan los datos de la
tabla Reo y la tabla Nacionalidad. Estas se comparan primero debido al orden en el que fue escrita la consulta. Al
realizarse este Inner Join, se obtiene como output un conjunto de datos filtrado en primera instancia (Reos que sean
de Perú o Venezuela).
● Luego, se muestra el operador Sort. Este se encargará de ordenar los datos recopilados siguiendo el orden
establecido en la consulta, que viene a ser order by concat(r.nombre_reo,' ',r.apellido_paterno_reo,'
',r.apellido_materno_reo). ¡Nótese que se obtiene un costo de 1% y se obtiene un 462% (37 de 8)!. Ello puede ser
resultado de un error de cálculo del porcentaje del costo (explicado en puntos anteriores, citando a Ariely).
21
tabla que no tiene un índice agrupado. Ello puede comprobarse al usar el comando ‘EXECUTE sp_helpindex
ReoDelito’, obteniendo este resultado. Esta operación tiene un costo de 11% y se han leído 3700 filas para un
estimado de 771 filas, representando un porcentaje de 479%.
Esto fue para un object [centropenitenciario].[dbo].[ReoDelito].[rd], del cual se obtuvo un output
[centropenitenciario].[dbo].[ReoDelito].idReo, [centropenitenciario].[dbo].[ReoDelito].idReo. Aquí se relacionan tanto
la tabla ReoDelito y Delito para obtener los resultados esperados de la consulta.
● Tanto el Sort como el Table Scan son nodos hijos del nodo padre Nested Loops a continuación. Mediante la
operación Inner Join, se obtendrá un filtro de los datos que cumplan el predicado
‘[centropenitenciario].[dbo].[ReoDelito].[idReo] as [rd].[idReo] = [centropenitenciario].[dbo].[Reo].[idReo] as
[rd].[idReo]’.
c. ShowPlan Text
Mediante este comando ‘SET SHOWPLAN_TEXT ON’, se muestra en formato de texto el Plan de ejecución que se mostró
gráficamente en SSMS. Para esta consulta, el texto obtenido es el mostrado en la página siguiente. Este muestra con
mayor detalle el proceso llevado a cabo en el Plan de ejecución de la consulta.
22
23
ii) Consultando la persona que visita y a quien visita, junto con las horas
visitadas, ubicación de la celda y pabellón. Adicionalmente se le agregó
un indicador que dice si el horario está por encima de las 3 horas
permitidas.
Creemos que la seguridad es muy importante en un centro penitenciario, sin
embargo muchas veces, aprovechando el horario de visita los familiares o
conocidos de un reo. ingresan objetos ilícitos que los reos usan para
actividades ilícitas como extorsiones desde la cárcel, órdenes a sicarios, etc.
Además del ingreso de objetos a veces se suele aprovechar este tiempo de
visita para coordinar de forma directa o indirecta actividades ilícitas.
Esta consulta tiene como propósito el poder consultar de una forma sencilla
información que nos puede ser de utilidad para investigar posibles actos
ilícitos ya que la consulta nos brinda información relevante como la cantidad
de horas que visita una persona a un preso, la ubicación del preso además
de indicarnos si la cantidad de horas de visita excede el número máximo de
horas permitidas.
Autores
24
Gráfico del Plan de ejecución de consulta no optimizada número 2
25
Análisis del Plan de ejecución de consulta no optimizada #2:
a. Operadores e íconos del plan de ejecución
Los íconos representan a distintos operadores, los cuales, para el presente
plan de ejecución, son:
● Aparece el “Clustered index seek” que tiene como función leer valores para
encontrar entradas que coinciden, dando como lista de output “nombre_vis”,
“apellido_paterno_vis” y “apellido_materno_vis”.
● Del hash match y el clustered index seek, ocurre un “nested loops” o bucles
anidados, en donde se busca el resultado desde una tabla y después
seleccionar otra tabla por cada fila de la primera, siendo el idVisitante la
26
referencia y seleccionando las tablas “Visitante”, “ReoVisita”, “ReoUbicacion”,
“PabellonCelda”.
● Vemos otro nested loops, que toma como referencia “idReo” y pasando por
las tablas “Reo”, “ReoUbicacion”, “PabellonCelda”.
c. ShowPlan Text
Mediante este comando ‘SET SHOWPLAN_TEXT ON’, se muestra en
formato de texto el Plan de ejecución que se mostró gráficamente en SSMS.
27
b) Consultas con optimización
i) Consultando a los reos que sean peruanos o venezolanos y que se
encuentren por debajo de la edad promedio.
28
Creación de una columna adicional en la tabla Reo
Empecemos optimizando la consulta dandonos cuenta que las palabras resaltadas
en amarillo suelen repetirse mucho, estas lienas nos ayudan a poder calcular la
edad de los presos. Para optimizar esto sería más lógico que en vez de estar
calculando esto tantas veces, esa columna con la información de la edad del preso
debería crearse en la tabla Reo.
USE centropenitenciario;
ALTER TABLE Reo
ADD Edad as datediff(year,Reo.fecha_nacimiento_reo,getdate());
29
A continuación, crearemos una función con la siguiente instrucción:
GO
CREATE FUNCTION promedio_edad ()
RETURNS FLOAT
AS
BEGIN
DECLARE @promedioEdad FLOAT;
SET @promedioEdad = (select avg(Reo.edad) from Reo);
return @promedioEdad
END;
Haciendo uso del plan de consulta analizado previamente, podemos darnos cuenta
de un detalle, en la tabla ReoDelito para hacer la consulta se está recorriendo cada
fila de la tabla, esto como se vio en clase es muy ineficiente. Esto puede ser
solucionado de una forma sencilla y es creando un índice, para esto en el buscador
de objetos buscamos si es que en esta tabla existe o no un índice.
30
Como vemos no existe ningún índice, entonces para poder agilizar aún más la
consulta podemos hacer uso de un índice clustered, ya que como se explicó en
clase una tabla sólo puede tener un índice de este tipo. Para ello usamos esta
consulta SQL para crear el índice mencionado anteriormente.
31
ii) Consultando la persona que visita y a quien visita, junto con las horas
visitadas, ubicación de la celda y pabellón. Adicionalmente se le agregó
un indicador que dice si el horario está por encima de las 3 horas
permitidas.
32
Esta consulta crea el campo ‘duracion’ en la tabla ReoVisita, una vez
realizada procedemos a hacer uso de este nuevo campo en la consulta que
deseamos optimizar.
33
10. Comandos de administración de base de datos
-- Usuario Adriana
USE [master]
GO
DEFAULT_DATABASE=[centropenitenciario]
-- Usuario Edward
USE [master]
GO
DEFAULT_DATABASE=[centropenitenciario]
-- Usuario Juan
USE [master]
GO
DEFAULT_DATABASE=[centropenitenciario]
-- Usuario Jonathan
USE [master]
GO
34
DEFAULT_DATABASE=[centropenitenciario]
-- Usuario Kevin
USE [master]
GO
DEFAULT_DATABASE=[centropenitenciario]
USE [centropenitenciario]
GO
USE [centropenitenciario]
GO
USE [centropenitenciario]
GO
35
USE [centropenitenciario]
GO
USE [centropenitenciario]
GO
Para esta parte se considero los roles brindados por la documentación oficial de
SQL Server de Microsoft, a continuación el enlace de donde nos basamos:
USE [centropenitenciario]
USE [centropenitenciario]
USE [centropenitenciario]
36
-- Asignación de un rol al usuario s_Jonathan
USE [centropenitenciario]
USE [centropenitenciario]
USE [centropenitenciario]
USE [centropenitenciario]
USE [centropenitenciario]
37
10.5. Creación de un plan de mantenimiento para la BD
38
- Ahora marcamos las tareas de mantenimiento que se realizarán en nuestra
base de datos.
39
40
- Nos informará en donde se guardará el informe acerca del plan de
mantenimiento, si no estamos de acuerdo con la ubicación se puede cambiar.
41
- Ahora, podemos ver que se creó en la carpeta de “Planes de mantenimiento”.
42
10.6.2. CTE - Datos de un reo asociado a su delito
43
10.6.4. CTE - Duración Visita
Esta tabla CTE nos permitirá obtener el tiempo durante el cual una visita
permaneció en el centro penitenciario, esto podrá ser muy relevante en un futuro por
si es que sucedieron problemas o para revelar posibles actos ilícitos.
10.7.1. Triggers
a) Trigger
44
b) Trigger
Este trigger resulta útil para ubicar a un reo en una celda dentro del centro
penitenciario. Este disparador se activará después de la operación de
inserción de datos. Se verifica que la celda que será asignada al reo no
supere el límite de 4 reos. Si se cumple ello, el reo es ingresado en otra celda
que no supere los 4 reos, con sus datos idReo e idCelda.
a) Stored Procedures
Este procedimiento nos ayudará a poder calcular los meses de condena que
aún le quedan a un preso, para ello haremos uso de el código como dato de
entrada y como dato de salida tendremos los meses que le faltan de condena
al preso.
45
b) Stored Procedures
46
11. Conclusiones
● La creación del plan de mantenimiento conforman las tareas que van a velar
por asegurar que los activos de una organización mantengan los niveles de
funcionamiento y uso para los que fueron adquiridos. Esto es realmente
importante debido a que su implementación en un ambiente real puede
ayudarnos a que los tiempos de carga mejoren mucho, prevenir pérdidas de
datos, etc. Esta herramienta brindada por SQL Sever fue usada por primera
vez en el grupo ya que la BD originalmente fue realizada en MySQL.
Creemos como grupo que esta herramienta es de mucha utilidad y aún más
el poder hacer uso de esta de forma gráfica.
● El uso del análisis del plan de ejecución nos ayudó a poder optimizar las
consultas, sin embargo esto no fue lo único, ya que también se utilizaron
recomendaciones que se dieron durante las clases del curso. Como equipo
consideramos que esta herramienta sumada a las recomendaciones
brindadas durante clases son muy importantes y aplicables en un ámbito
profesional, ya que en estos tiempos se hace la búsqueda de cada vez mayor
rapidez con el costo mínimo.
● Los temas vistos a lo largo del curso serán fundamentales de cara al futuro,
para poder implementar estos conocimientos ya sea en la base de datos
creada para el proyecto o para futuros proyectos con el objetivo de poder
tener mejoras y facilidades cuando hagamos la creación de dichas Bases de
Datos.
47
12. Recomendaciones
● Si Ud. (por su cuenta o con un equipo de trabajo) desea realizar una base de
datos y son consideradas un gran número de entidades, recomendamos que
organice sus datos y tablas aplicando la Normalización. Ello le facilitará la
creación de consultas que involucren distintas tablas, así como las
optimizaciones de consultas que lo requieran. Esto fue aplicado en el
presente trabajo y ayudó considerablemente al equipo para consultar datos
de las diferentes tablas e interpretar los datos de estas de una manera
sencilla.
48
13. Referencias
● Ariely, R. (2020, 18 agosto). SQL Server Execution Plan shows cost of more
than 100 percentage. Recuperado el 11 de agosto del 2022 de
https://ariely.info/Blog/tabid/83/EntryId/272/SQL-Server-Execution-Plan-shows
-cost-of-more-than-100-percentage.aspx
49