Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MARCOS
FACULTAD DE INGENIERÍA DE SISTEMAS E INFORMÁTICA
INTEGRANTES:
PROFESOR:
Sotelo Bedón, Marcos
En el presente informe se abordará el proyecto PyOficio como un medio de apoyo para miles
de vecinos de San Martín de Porres, que se han visto afectados por la emergencia sanitaria
mundial, que tienen oficios y por lo tanto servicios que ofrecer y es difícil establecer contacto
con los clientes. A continuación se detalla el problema, la solución y se procede a detallar las
etapas que fueron necesarias para construir la página web, como son: diagramas UML,
diagrama E-R; los queries de creación de tablas, consultas, etc. Para ello utilizamos base de
datos Sql server, python con framework Django; para la interfaz gráfica los lenguajes
utilizados serán html, css y javascript.
1.1 Problemática
A causa del covid, el Ejecutivo ha estimado la pérdida de empleo de más de 1 millón de
trabajadores entre las microempresas (menos de 10 trabajadores) y las pequeñas empresas
(familias desempleadas). Según algunos especialistas, eso se debe principalmente a la falta de
liquidez para continuar con el negocio.
Las alternativas que tendrán las empresas serán el despido, la suspensión del contrato de
trabajo o la reducción de tiempo de trabajo, por ende reducción de sueldo. Ninguna de las
posibilidades es alentadora para la situación económica ya que se elevará la tasa de
desempleo.
3
1.2 Solución
Esta situación del trabajo en conjunto con el aislamiento social plantean un futuro diferente
para el empleo en nuestro país. Hay algunas ocupaciones y áreas que ya tienen una plataforma
para conseguir trabajo como el área de la informática, contabilidad, etc. Sin embargo hay
otras que no tienen esta facilidad, por lo tanto nuestro proyecto va dedicado a aquellos que les
afectó gravemente en su economía.
Las diez ocupaciones que más se demandarían bajo esta modalidad serían:
1. Carpintería
2. Albañilería
3. Pintura
4. Jardinería
5. Cerrajería
6. Sastrería
7. Gasfitería
8. Electricidad en el hogar
9. Mecánico de bicicletas
10. Servicio doméstico
Esto es un ejemplo de una plataforma similar a lo que queremos diseñar
5
2.1.1 Diagrama SQLServer
--Create tables
CREATE TABLE Distrito(
id_distrito VARCHAR(10) PRIMARY KEY,
nombre VARCHAR(50),
)
7
)
9
insert into Persona
values('PE-03','Nathalia','Malaga','F','990972172','nm_grr@unmsms.com','SMP-3')
insert into Persona
values('PE-04','Roger','Federer','M','992004358','rf47@yahoo.com','SMP-4')
insert into Persona values('PE-05','Eva','Ayllon','F','997486298','ea69@upc.com','SMP-5')
11
insert into Portafolio values('PO-13','Cambio de tuberia por piso',2,210,'PF-04')
insert into Portafolio values('PO-14','Cambio de tuberia por piso',3,170,'PF-09')
insert into Portafolio values('PO-15','Cambio de tuberia por piso',2,200,'PF-14')
13
where genero = 'M';
select 'Descripcion: El servicio de ' + Descrip + ' dura ' + tiempo + 's de trabajo y' + ' cuesta
en promedio menos de 100 soles)' from Portafolio
where Costo_prom < 100;
-- Queries usando having: este método solo lo podemos usar en este atributo y esta tabla ya
que es el único de tipo entero--
select Descrip,avg(Costo_prom) from Portafolio where Tiempo = 1
group by Descrip
having avg(Costo_prom) > 100
select Descrip,sum(Costo_prom) from Portafolio where Tiempo = 3
group by Descrip
having sum(Costo_prom) != 170
-- Queries usando inner join --
select nombres,apellidos,titulo,tempo_exp,Descrip,Costo_prom from Persona join Perfil on
Persona.DNI = Perfil.DNI1
join Portafolio on Perfil.id_perfil = Portafolio.id_perfil3
Tabla critica: tabla con información sensible que no podemos arriesgarnos a perder en este
caso como ejemplo tomaremos la tabla Persona
Primero hacemos un SP para mostrar sólo datos de la tabla Persona los cuales deseamos
que el usuario tenga acceso
Sin embargo existen sentencias que permiten saber que hay dentro de un SP; los datos de
cómo fue creado, las relaciones entre tablas, etc. Información a la que solo debería tener
acceso el administrador de la base de datos, información que podría resultar perjudicial en
las manos equivocadas. Sentencias como por ejemplo:
sp_help tablaCritica
Sin parámetros nos muestra todos los objetos de la base de datos seleccionada, incluidos
los procedimientos
15
sp_helptext tablaCritica
sp_stored_procedures tablaCritica
sp_depends tablaCritica
1) nombre, tipo, campos, etc. de los objetos de los cuales depende el objeto enviado.
Para poder restringir el acceso a esta información es necesario realizar una encriptación o
cifrado del SP.
Podemos eliminar (drop) el SP y volverlo a crear (create) o simplemente podemos alterarlo
mediante un alter, como a continuación:
sp_helptext tablaCritica
Si le damos click izquierdo a dicha sub pestaña podemos visualizar que la opción modificar
se encuentra deshabilitada
17
2.6 Elabore un SP orientado a toma de decisiones (utilice cursor)
CREATE PROCEDURE Mostrar_Personas_x_Urbanizacion
AS
BEGIN
declare cursorCP cursor
for select id_urb, Descrip from Urbanizacion
open cursorCP
declare @id varchar(10), @descrip varchar(50)
fetch next from cursorCP into @id,@descrip
while @@fetch_status=0
begin
print 'Urbanizacion : ' + @descrip
print '=================================='
declare cursorCP1 cursor
for select DNI, nombres, apellidos, genero, telefono, email from Persona where
id_urb1=@id
open cursorCP1
declare @dni varchar(50), @nomb varchar(50), @ape varchar(50), @gen char(1),
@tel varchar(10), @email varchar(30)
fetch next from cursorCP1 into @dni, @nomb, @ape, @gen, @tel, @email
while @@fetch_status=0
begin
print 'Dni : ' + @dni
print 'Nombres : ' + @nomb
print 'Apellidos : ' + @ape
print 'Genero : ' + @gen
print 'Telefono : ' + @tel
print 'Email : ' + @email
fetch next from cursorCP1 into @dni, @nomb, @ape, @gen, @tel, @email
end
close cursorCP1
deallocate cursorCP1
-- EJECUTAR PROCEDURE
EXEC Mostrar_Personas_x_Urbanizacion
19
id_portafolio VARCHAR (10),
Descrip VARCHAR(50),
Tiempo VARCHAR(10),
Costo_prom INTEGER,
id_perfil4 VARCHAR(10),
UPDATED_AT DATETIME NOT NULL,
USUARIO VARCHAR(50),
OPERATION CHAR(3) NOT NULL,
CHECK(OPERATION='INS' OR OPERATION='DEL' or OPERATION='UPD')
)
21
GETDATE(),
USER_NAME(USER_ID()),
'INS'
FROM
inserted i
WHERE NOT EXISTS(SELECT * FROM deleted)
UNION ALL
SELECT
d.id_portafolio,
d.Descrip,
d.Tiempo,
d.Costo_prom,
d.id_perfil4,
GETDATE(),
USER_NAME(USER_ID()),
'DEL'
FROM
deleted d
WHERE NOT EXISTS(SELECT * FROM INSERTED)
UNION ALL
SELECT
i.id_portafolio,
i.Descrip,
i.Tiempo,
i.Costo_prom,
i.id_perfil4,
GETDATE(),
USER_NAME(USER_ID()),
'UPD'
FROM INSERTED i
WHERE EXISTS (SELECT * FROM DELETED)
END
2.8 Aplicación (prototipo) que muestre la integración con la BD
Crear entorno Django y el proyecto
• Crear entorno virtual
$ virtualevn “Testing”
• Entrar
$ Source testing// activar entorno
• Instalar Django
$ pip install django
• Verificar instalacion con pip Freeze
$ pip freeze
• Crear proyecto
$ Django-admin startproject laboratorio5
• Ejecutar Servidor
$ Python.py runserver
• Crear app
$ python manage.py startapp talento
Mapeo Django
Creando modelos
Distrito
class PyDistrito(models.Model):
name = models.CharField(_("Nombre"), max_length=80)
description = models.TextField(_("Description"), blank=True,
null=True)
def __str__(self):
return format(self.name)
23
class Meta:
verbose_name = _("Distrito")
verbose_name_plural = _("PyDistrito")
Oficio
class PyOficio(models.Model):
name = models.CharField(_("Name"), max_length=80)
description = models.TextField(_("Description"), blank=True,
null=True)
img = models.ImageField(
max_length=255,
storage=RenameImage(),
upload_to=image_path,
blank=True,
null=True,
default='oficio/default_oficio.png'
)
def __str__(self):
return format(self.name)
class Meta:
verbose_name = _("Oficio")
verbose_name_plural = _("PyOficio")
Persona
class PyUser(AbstractUser):
'''Modelo de los usuarios
'''
username = None
email = models.EmailField(_("Email"), max_length=254, null=False,
db_index=True, unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = PyUserManager()
def __str__(self):
return '{} {}'.format(self.first_name, self.last_name)
def get_full_name(self):
return '%s %s' % (self.first_name, self.last_name)
class Meta:
verbose_name = _('Person')
verbose_name_plural = _('People')
Persona Oficio
class PyPersonaOficio(models.Model):
persona = models.OneToOneField(PyUser,
blank = False,
null = False,
verbose_name=_("Usuario"),
25
on_delete=models.PROTECT)
oficios = models.ManyToManyField(PyOficio,
blank = False,
null = False,
verbose_name=_("Oficios"))
def __str__(self):
return format(self.persona)
class Meta:
verbose_name = _("PersonaOficio")
verbose_name_plural = _("PyPersonaOficio")
PARTE I: PRIVILEGIOS
En cada celda de la matriz, consigne los privilegios para cada usuario y luego implemente en
el gestor de BD.
Usr/Objeto PuestoSol1 CompSol calProductos) callRegister()
27
3.3 Gestión de riesgos
29
de trabajo, se crea un riesgo
innecesario
Proceso Calidad - Si los requerimientos no han sido Definición de Validar los requerimientos
de Software definidos adecuadamente, es requerimientos definidos mediante prototipos a los
proyecto probable que se exceda el usuarios finales
cronograma y el costo.
ESCALA PROBABILIDAD
ESCALA IMPACTO
31
ID Riesgo Probabilidad Impacto Evaluación
R1 Malware 4 4 16
R4 Definición de requerimientos 1 4 4
R5 Falta de presupuesto 1 3 3
R6 Gestión de cambio 2 2 4
R7 Capacidad de desarrolladores 1 1 1
MATRIZ DE RIESGO
P
R
O
B 4 R1
A
B
I 3 R2 R3
L
I
D 2 R6
A 1 R7 R5 R4
D
1 2 3 4
IMPACTO
Recomendaciones:
2. Utilice una cláusula WHERE, para filtrar y devolver solo las filas necesarias
Ejemplo:
33
Hacer las consultas lo más simples posibles, o sea obtener un resultado sin un gran
nivel de complejidad, ejemplo, si queremos visualizar los datos de la tabla Personas
con sus respectivas dirección de la tabla Urbanización.
AS
BEGIN
open cursorCP
while @@fetch_status=0
begin
print '=================================='
for select DNI, nombres, apellidos, genero, telefono, email from Persona
where id_urb1=@id
open cursorCP1
fetch next from cursorCP1 into @dni, @nomb, @ape, @gen, @tel, @email
while @@fetch_status=0
begin
fetch next from cursorCP1 into @dni, @nomb, @ape, @gen, @tel, @email
end
close cursorCP1
deallocate cursorCP1
end
close cursorCP
deallocate cursorCP
END
EXEC Mostrar_Personas_x_Urbanizacion
35
---------------------------------Plan de ejecución-------------------------------
37
Método B – usando iner join
Select DNI, nombres, apellidos, genero, telefono, email, Descrip from Persona join
Urbanizacion on Persona.id_urb1 = Urbanizacion.id_urb
---------------------------------Plan de ejecución-------------------------------
Plan de ejecución
Es importante aprender a leer que significa cada icono para poder monitorear bien el
camino que está tomando el SQL en relación a las consultas, a continuación algunos
iconos que apreciamos en nuestra consulta.
El icono clustured table_scan, recorre toda la tabla de página en página buscando el
dato, lo cual no es una manera óptima de hacer la consulta. Esto se da cuando la
tabla es creada a partir de los datos sin tener en cuenta llaves primarias, foráneas, y
estar referenciados por índices.
Como nuestra tabla no tiene mucha data cargada no se puede llegar a diferenciar la
diferencia entre Clustured Index_seek y clustured table_scan, sin embargo cuando
hay data extensa si se visualiza la diferencia ya que mientras uno solo busca en
base a índices el otro tiene que recorrer toda la tabla para ubicar los datos
solicitados
39
1 INNER Persona ⋂ Productos
2 LEFT Persona⟕Productos
3 RIGHT Persona⟖Productos
9 SELF persona!
41
Capítulo IV. Conclusiones
Durante el tiempo que nos tomó desarrollar el proyecto PYOFICIO, el mismo que fue
abordado por etapas nos ayudó a parte de añadir funcionalidades , darle seguridad a nuestra
base de datos, aquí la importancia. Asimismo la álgebra operacional nos ayudó a trabajar de
manera exacta y nos brindó las habilidades necesarias para recabar información de nuestro
interés.
Por lo tanto el temas de Bases de Datos nos ayudó tener un sistema para conectar usuarios y
trabajadores, así el usuario solo tiene vista de los productos, pero si desea puede loguearse y
ser partícipe del staff de trabajadores que brindan sus servicios.
43