Vous êtes sur la page 1sur 27

Introducción:

El objetivo principal de la tercera y última etapa del proyecto semestral es


implementar un modelo mejorado de la base de datos a través de normalización y responder
nuevas consultas.

Por consiguiente como en la segunda entrega daremos paso a la revisión de algunos


errores que tuvimos en algunas consultas en la segunda parte del proyecto.
Corrección:

Consultas:

Q2
SELECT Viaje.Fecha, Realizar.Origen, Realizar.Destino
FROM Viaje JOIN Tener ON Viaje.Id_Viaje= Tener.Id_Viaje JOIN Realizar ON
Tener.Id_Viaje = Realizar.Id_Viaje
WHERE ( Tener.Rut_Chofer = '8.712.200-K' and Viaje.Fecha BETWEEN '2017-09-01'
AND '2017-09-30';

Q3
SELECT *
FROM chofer
WHERE chofer.rut_chofer IN (select chofer.rut_chofer FROM (SELECT chofer.rut_chofer,
MAX(c) FROM (SELECT chofer.rut_chofer, COUNT(chofer.rut_chofer) AS c FROM
chofer JOIN tener ON chofer.rut_chofer = tener.rut_chofer NATURAL JOIN viaje WHERE
EXTRACT(year FROM viaje.fecha)=2016 GROUP BY chofer.rut_chofer ) AS v GROUP
BY chofer.rut_chofer) AS t);

Q5
SELECT Id_Bus
FROM Bus
WHERE Fecha_mantencion NOT BETWEEN current_date-90 AND current_date ;

Q6
SELECT *
FROM (SELECT pasajero.rut_pasajero ,count(*) as cant
FROM pasajero JOIN realizar ON pasajero.rut_pasajero = realizar.rut_pasajero NATURAL
JOIN viaje
WHERE extract(year FROM viaje.fecha)= extract (year FROM current_date)
GROUP BY pasajero.rut_pasajero) as v NATURAL JOIN pasajero
WHERE cant = (select max(cant)
FROM (SELECT pasajero.rut_pasajero,count(*) as cant
FROM pasajero JOIN realizar ON pasajero.rut_pasajero = realizar.rut_pasajero NATURAL
JOIN viaje
WHERE extract(year FROM viaje.fecha)= extract (year FROM current_date)
GROUP BY pasajero.rut_pasajero) v );
Q7
SELECT Chofer.Rut_Chofer, Chofer.Nombre
FROM Chofer JOIN Tener ON Chofer.Id_Chofer = Tener.Id_Chofer
JOIN Viaje ON Tener.Id_Viaje= Viaje.Id_Viaje
WHERE (Viaje.Fecha BETWEEN current_date-30 AND current_date)
AND Tener.Nro_EV > 0;
Descripción enunciado parte 3:

En esta entrega se deberá ajustar el modelo de BD de la empresa de buses,


considerando aspectos de normalización. Por otro lado, se deberá ampliar el set de consultas
que la BD que responderá la BD.
Normalización de la Base de Datos.

Tabla Asistente

-Se encuentra en 1FN ya que la tabla “Asistente” no presentan atributos multivariados.


-Se encuentra en 2FN, “nombre”, “fc_asistente”, “direccion” y “ f_nacimiento” dependen del
“rut_asistente”.
-Se encuentra en 3FN, “nombre”, “fc_asistente”, “direccion” y “ f_nacimiento” no se
encontró dependencia entre ellos.
Tabla Bus

-Se encuentra en 1FN ya que la tabla “Bus” no presenta atributos multivariados.


-Se encuentra en 2FN, “patente”, “capacidad”, “tipo” y “ fecha_mantencion” dependen
netamente del “id_bus”.
-Se encuentra en 3FN, “patente”, “capacidad”, “tipo” y “ fecha_mantencion” no se encontró
dependencia entre ellas.
Tabla Chofer

-Se encuentra en 1FN ya que la tabla “Chofer” no se presenta atributos multivariados.


-Se encuentra en 2FN, “nombre”, “fc_chofer”, “direccion” y “ f_nacimiento”, dependen
netamente del “rut_chofer”.
-Se encuentra en 3FN,“nombre”, “fc_chofer”, “direccion” y “ f_nacimiento” no se encontró
dependencia entre estas.
Tabla Disponer

-Se encuentra en 1FN ya que la tabla “Disponer” no presenta atributos multivariados.


-Se encuentra en 2FN, ”origen”, “destino” e “intermedio”, dependen netamente
de“id_terminal” e “id_recorrido”.
-Se encuentra en 3FN,”origen”, “destino” e “intermedio” no se encontró dependencia entre
ellas.
Tabla Pasajero

-Se encuentra en 1FN ya que la tabla “pasajero” no presenta atributos multivariados.


-Se encuentra en 2FN, “nombre”, “telefono”, “nom_contacto” y “tel_contacto” dependen
netamente de “rut_pasajero”.
-Se encuentra en 3FN, “nombre”, “telefono”, “nom_contacto” y “tel_contacto”, no se
encontró dependencia entre estos.
Tabla Realizar

-Se encuentra en 1FN ya que la tabla “realizar” no presenta atributos multivariados.


-Se encuentra en 2FN, “destino”, “origen” y “asiento” dependen netamente de “rut_pasajero”
y de “id_viaje”.
-Se encuentra en 3FN, “destino”, “origen” y “asiento” , no se encontró dependencia entre
ellos.
Tabla Recorrido

-Se encuentra en 1FN ya que la tabla “recorrido” no presenta atributos multivariados.


-Se encuentra en 2FN “tiempo_estimado” y “total_km” dependen netamente de
“id_recorrido”
-Se encuentra en 3FN “tiempo_estimado”, “total_km” , no se encontró dependencia entre
estos.
Tabla Tarifa

-Se encuentra en 1FN ya que la tabla “tarifa” no presenta atributos multivariados.


-Se encuentra en 2FN, “ciudad_origen”, “ciudad_destino”, “p_final” y “p_intermedio” e
“id_recorrido” dependen netamente de “id_pasajero”
-Se encuentra en 3FN, “ciudad_origen”, “ciudad_destino”, “p_final” , “p_intermedio” y
“id_recorrido”, no se encontró dependencia entre estos atributos.
Tabla Telefono

-Se encuentra en 1FN ya que la tabla “telefono” no presenta atributos multivariados.


-Se encuentra en 2FN, no presenta atributos no claves ya que ambos atributos que se
presentan en la tabla son la clave primaria (id_terminal, telefono).
-Se encuentra en 3FN, no presenta atributos no claves por ende no presenta dependencias en
los mismos.
Tabla Tener

-Se encuentra en 1FN ya que la tabla “Tener” no presenta atributos multivariados.


-Se encuentra en 2FN, “nro_ev”, “hora_inicio”, “hora_fin” y “km_recorridos” dependen
netamente de “rut_chofer” e “id_viaje”.
-Se encuentra en 3FN, “nro_ev”, “hora_inicio”, “hora_fin” y “km_recorrido”, no se encontró
dependencia entre estos atributos.
Tabla Terminal

-Se encuentra en 1FN ya que la tabla “terminal no presenta atributos multivariados.


-Se encuentra en 2FN, “direccion”, “telefono”, “encargado” y “rut_pasajero” dependen
netamente de “id_terminal”.
-Se encuentra en 3FN, “direccion”, “telefono”, “encargado” y “rut_pasajero”, no se encontró
dependencia.
Tabla Viaje

-Se encuentra en 1FN ya que la tabla “viaje no presenta atributos multivariados.


-Se encuentra en 2FN, “fecha”, “tiempo”, “km_inicial”, ”km_final”, “rut_asistente”,
“id_bus”, “id_recorrido” dependen netamente de “id_viaje”
-Se encuentra en 3FN, “fecha”, “tiempo”, “km_inicial”, ”km_final”, “rut_asistente”,
“id_bus”, “id_recorrido”, no se encontró dependencia entre estos.
A continuación se alteran las tablas Viaje, Bus, Realizar y Tener para mostrar resultados en
las consultas solicitadas.

update viaje set id_bus='U062' Where id_viaje='T998';


update viaje set id_bus='U062' Where id_viaje='R900';
update viaje set id_bus=’X261' Where id_viaje='Q549';
update bus set fecha_mantencion='2017-12-10' where id_bus='X261';

UPDATE realizar
SET rut_pasajero='11.730.879-0', destino='Chillán', origen='Santiago'
WHERE id_viaje= 'D567' or id_viaje= 'I423' or id_viaje='L643' or id_viaje= 'N622' or
id_viaje= 'T024' ;

update tener set km_recorridos=12000 where id_viaje= 'M752';


update viaje set fecha= '2017-09-17' where id_viaje='M752';
Vistas

1.-Una vista que entregue los datos de cada chofer (nombre, rut) y por cada año
registrado en la BD los kms. recorridos y la cantidad de excesos de velocidad
que han tenido en dicho año.

CREATE VIEW datoChofer AS


SELECT c.nombre as nombre, c.rut_chofer as rut_chofer, t.nro_ev as exceso_de_velocidad,
t.km_recorridos as km_recorrido, EXTRACT(year from v.fecha) as anio
FROM (chofer as c JOIN tener as t ON c.rut_chofer=t.rut_chofer) JOIN viaje as v ON
t.id_viaje=v.id_viaje;
2.-Crear una vista que contenga la cantidad de viajes mensuales realizados por
los empleados de la empresa. Por cada empleado contendrá: rut, nombre, mes,
número de viajes realizados.

create view VxEmpl as


SELECT C.Rut_Chofer, C.Nombre as Nombre_Chofer, A.Rut_Asistente, A.Nombre as
Nombre_Asistente, Date_part ('month', V.fecha) as Mes, Count(*) as NroViajes
FROM (((Chofer as C JOIN Tener as T ON C.Rut_Chofer = T.Rut_Chofer) JOIN Viaje as V
ON T.Id_Viaje = V.Id_Viaje) JOIN Asistente as A ON V.rut_asistente = A.Rut_Asistente)
GROUP BY C.Rut_Chofer, C.Nombre, A.Rut_Asistente, A.Nombre, Mes;

3.-Crear una vista que contenga información sobre los buses de la empresa cuya
última mantención se realizó hace más de 2 meses. Por cada bus se deberá
incluir: patente, capacidad, y número de viajes realizados desde la última
mantención.

create view InfoBusAux1 as


(select b.patente as patente, b.capacidad as capacidad, b.id_bus as id_bus
from (bus as b join viaje as v on v.id_bus=b.id_bus)
where b.fecha_mantencion between current_date-60 and current_date);

create view nro_viajes_aux1 as


(select b.id_bus as id_bus ,count(*) as nro_viajes
from (bus as b join viaje as v on v.id_bus=b.id_bus)
where b.fecha_mantencion between current_date-60 and current_date
group by b.id_bus order by count(*));

/*informacion de los buses*/


create view Informacion_buses as
select distinct i.patente, i.capacidad, n.nro_viajes
from(InfoBusAux1 as i join nro_viajes_aux1 as n on i.id_bus=n.id_bus);
Consultas

Q1: Obtener los datos de los empleados (choferes y/o auxiliares) que no han
realizado ningún viaje cuyo destino final sea “Puerto Montt”.

Select C.Rut_Chofer as Rut_Chofer, C.Nombre as Nombre_Chofer,C.f_nacimiento as


FeNac_Chofer,A.Rut_Asistente as Rut_Asistente , A.Nombre as Nombre_Asistente,
A.f_nacimiento as FeNac_Asistente
From ((((Chofer as C JOIN Tener as T ON C.Rut_Chofer = T.Rut_Chofer) JOIN Viaje as V
ON T.Id_Viaje = V.Id_Viaje) JOIN Asistente as A ON V.rut_asistente = A.Rut_Asistente)
JOIN Realizar as R ON R.id_viaje = V.Id_Viaje)
Where ( R.Destino <> 'Puerto Montt');
Q2: Una consulta que muestre
el nombre y rut de los choferes que han conducido
más de 10.000 KM durante el año 2017 y no han tenido ningún exceso de velocidad en el
mismo periodo.

select c.nombre, c.rut_chofer


from ((chofer as c join tener as t on c.rut_chofer=t.rut_chofer)join viaje as v on
v.id_viaje=t.id_viaje)
where (t.km_recorridos>10000 and (select extract(year from v.fecha)=2017 and t.nro_ev=0));

Q3: Obtener el nombre y el rut de los pasajeros que son considerados frecuentes en
un tramo. Considere pasajero frecuente a aquellos pasajeros que han realizado
el viaje de un tramo más de 10 veces. Se considera un mismo tramo, los
siguientes casos: Origen = Chillán – Destino = Santiago | Origen = Santiago –
Destino = Chillán.

SELECT Pasajero.Nombre, Pasajero.Rut_pasajero


FROM Pasajero NATURAL JOIN Realizar
WHERE (origen=realizar.origen AND destino=realizar.destino) OR (origen=realizar.destino
AND destino=realizar.origen)
GROUP BY rut_pasajero
HAVING count(*)>= 5;
Q4: Una consulta que muestre el ID del viaje, la patente del bus, el nombre del
terminal de origen y el nombre del terminal de destino, de aquellos viajes en
donde la cantidad de kms reales de viaje es igual a la cantidad de kms
establecidos para el recorrido del viaje y la cantidad de pasajeros de ese viaje
fue igual a la capacidad del bus.

SELECT viaje.id_viaje, Bus.patente, disponer.origen as Terminal_Origen, disponer.destino


as Terminal_Destino
FROM
Bus JOIN Viaje on Viaje.id_bus=Bus.Id_bus
JOIN Recorrido on Recorrido.id_recorrido=Viaje.id_recorrido
JOIN tener on tener.id_viaje= viaje.id_viaje
JOIN Recorrido as R2 on viaje.id_recorrido=R2.id_recorrido
JOIN Disponer on R2.id_recorrido= disponer.id_recorrido
JOIN Bus as B2 on Viaje.id_bus=B2.Id_bus
WHERE recorrido.Total_Km= tener.Km_recorridos
GROUP BY viaje.id_viaje, Bus.patente, Terminal_Origen,Terminal_Destino, bus.capacidad
HAVING count(*)=bus.capacidad;
Q5: Una consulta que muestre los buses que requieren mantención urgente, estos
son aquellos que exceden los 4 meses de su última mantención y que han
realizado más de 100 viajes desde su última mantención.

select s.patente,s.capacidad,s.max as ultima_mantencion,s.id_bus,count(id_viaje)as


nro_viajes
from(select * from (select id_bus,max(fecha_mantencion) from bus group by id_bus) l
natural join bus
where max <(select current_date - 120 )order by l.id_bus)as s,
(select id_viaje, fecha,id_bus from viaje) as l
where s.max <l.fecha and s.id_bus=l.id_bus
group by s.patente,s.capacidad,s.max,s.id_bus
having count(id_viaje)>=1;

Q6: Obtener los datos de los asistentes que han trabajado con el Chofer “Leilani Rowe” en el
Bus patente “GQRS48” durante el último año.

select a.rut_asistente, a.nombre, a.direccion, a.fc_asistente, a.f_nacimiento


from ((((asistente as a join viaje as v on v.rut_asistente=a.rut_asistente) join bus as b on
b.id_bus=v.id_bus) join tener as t on t.id_viaje=v.id_viaje) join chofer as c on
c.rut_chofer=t.rut_chofer)
where b.patente ='GQRS48' and c.nombre='Leilani Rowe' and (v.fecha BETWEEN
current_date-360 AND current_date);
Q7: Generar una consulta que por cada chofer indique la cantidad de Kms recorrido
en el año en curso, ordenados de mayor a menor.

SELECT Chofer.Rut_Chofer, Chofer.Nombre, Tener.Km_Recorridos


FROM Chofer Natural Join Tener NATURAL JOIN Viaje
WHERE EXTRACT( year FROM viaje.fecha) = EXTRACT(year FROM current_date)
ORDER BY Km_Recorridos DESC;
Q8: Obtener los datos de aquellos viajes (id, origen, destino) en los que solo ha
conducido un chofer (rut y nombre).

create view contar_choferes as


select count(*) as cant_viajes, t.rut_chofer, t.id_viaje
from (chofer as c join tener as t on c.rut_chofer=t.rut_chofer)
group by t.rut_chofer, t.id_viaje having count(*)=1 order by count(*);

select r.id_viaje, r.destino, r.origen


from( (realizar as r join viaje as v on r.id_viaje=v.id_viaje)join contar_choferes as c on
v.id_viaje=c.id_viaje);
Conclusión

En conclusión las bases de datos exigen ciertos criterios o reglas al momento de


diseñar y pasar del modelo Entidad-Relacion al Modelo Relacional con la prioridad de
eliminar perdida de memoria por redundancia o datos irrelevantes. Además el proceso de
normalización nos permite hacer que esos errores que el modelo entidad-relación nos pueden
crear, sean eliminados de cierta forma sin afectar los datos de nuestra base demas nos
permitirá manipular con mayor frecuencia los datos, cabe mencionar el necesario uso y
aplicación de nuestro propio sentido común para que a los usuarios y operadores de la base
les permita trabajar de buena manera.

En vista a el trabajo realizado tanto en las partes 1, 2 y 3 del proyecto semestral, como
conclusión de la tercera parte y final podemos denotar algunos puntos:

● La base de datos debe ser regida por normas para llegar a su estado óptimo, nos
referimos a un estado óptimo, a tablas que no presenten pérdidas de memoria.

● Otro punto a destacar, que a pesar de que no tuvimos grandes cambios al normalizar
nos dimos cuenta de algunos errores como se ven las tablas optimizadas.

● Por último nos dimos cuenta que al tener las tablas en 3FN realizar las consultas y
vistas se hizo relativamente más sencillo a pesar de que eran algunas consultas
bastante complejas.

Vous aimerez peut-être aussi