1. DISEÑO DE UNA BASE DE
DATOS
ONEIDA MARSEL CAMACHO FORERO
INGENIERA DE SISTEMAS
FUNDACION UNIVERSITARIA
PANAMERICANA
2. CONTENIDO
1. Problema propuesto ¨Empresa de mudanzas¨
2. Diagrama Entidad Relación ¨DER¨
3. Tablas SQL
4. Consultas.
5. Diagrama de relaciones.
6. Interfaz de entrada.
7. Interfaz de salida.
8. Agradecimientos.
3. 1. EMPRESA DE MUDANZAS
En la página Web http://www.puealfinalmemudo.dadbd se pub licitan distintas
empresas de mudanza que ofrecen sus servicios y productos en España.
En la misma página Web puedes rellenar solicitudes de servicios a las distintas
empresas que, posteriormente, pueden ser aceptadas o rechazadas tanto por el
cliente como por la empresa de mudanzas. Esta página Web necesita
almacenar toda esta información en una base de datos y por eso nos ha pedido
ayuda.
Después de varias entrevistas con los gerentes de las empresas de mudanza,
pudimos recoger la siguiente información:
De las empresas de mudanza nos interesa guardar información sobre el nombre
de la empresa (único), su dirección completa, teléfonos de contacto y una lista
de poblaciones (nombre de población y provincia) a las que ofrece sus servicios o
productos.
Las empresas de mudanza pueden ofertar distintos servicios, como transporte,
embalaje,
desmontar/montar muebles, grúas, etc. No todas las empresas ofertan los
mismos servicios ni en las mismas poblaciones. Es decir, cada empresa puede
ofrecer distintos servicios en distintas poblaciones, por lo que un cliente tendrá
que mirar bien con qué empresa contacta.
Todos los servicios se identifican con un nombre de servicio (común para todo el
sector de mudanzas). Además, de todos ellos se desea almacenar el precio/hora
del servicio ofrecido por cada empresa de mudanzas en cada población (puede
tener diferentes precios de servicios dependiendo de la población).
4. Los distintos servicios de transporte que las empresas pueden ofertar está regulado
por ley en base a los kg, definiéndose unos intervalos por peso para cada transporte de
forma estándar. Respecto al precio de los servicios de transporte, además de contar
con el precio/hora del servicio, existe un plus de aumento de precio si la carga supera
una cantidad de kg que fija cada empresa independientemente de la población donde
se realice el servicio. Por ejemplo, 10% más si la carga supera los 500kg, 15% más si la
carga supera los 750kg, etc.
En cuanto a las grúas, interesa almacenar el tamaño de las mismas (tamaño de la
base, para comprobar en qué espacios se puede utilizar; y alto de la grúa, para ver a
qué piso puede llegar).
También existe un plus de aumento de precio según el alto de la grúa
independientemente de la población donde se realiza el servicio.
Cuando un cliente quiere hacer una mudanza, éste ha rellenar una solicitud
(identificada por un código único en nuestra Web) indicando a qué empresa de
mudanzas le pide qué servicios y las direcciones de inicio del servicio y que destino si
el servicio lo requiere. Estas direcciones deberán, por supuesto, estar dentro de las
poblaciones donde la empresa presta sus servicios. Además de la fecha de solicitud, se
desea almacenar la fecha de resolución de la solicitud, indicando si la solicitud ha sido
aceptada o no y el precio total, así como los precios de cada servicio solicitado.
5. Los clientes están identificados por un código único y se desea
conocer su NIF, dirección, nombre completo y teléfonos de contacto.
Una vez aceptada la solicitud, también se deseará almacenar
información sobre la fecha real en la que realizaron los servicios
solicitados, el tiempo que se ha tardado en cada servicio y qué
empleados de la empresa de mudanza han trabajado en los
servicios de dicha solicitud.
En cuanto a los empleados, la empresa almacena información
sobre su NIF, dirección, nombre completo, teléfono de contacto,
teléfono de empresa, tipo de empleado (conductor, grúa, jefe de
mudanza, etc.) y el sueldo. Aunque existen muchos tipos de
empleado, cada uno con su especialidad, en las empresas de
mudanza todos pueden realizar cualquier trabajo en algún
momento dado, por lo que no será necesario comprobar que
únicamente los conductores son los que conducen los vehículos en
las mudanzas. Además, un mismo empleado puede serlo de varias
empresas de mudanza en distintos momentos, por lo que será
necesario guardar esta información.
6. Para facilitar la gestión económica de esta base de datos, suponemos que todos
los pagos de los
clientes se efectúan a priori.
II. APARTADOS A REALIZAR
1. (4 puntos) Realizar el diseño utilizando el modelo E/R, indicando todos los
supuestos semánticos complementarios al enunciado que sea necesario
introducir,
así como todos aquellos que no pueden ser recogidos en el diagrama E/R.
NOTA: Es necesario entregarlo en formato electrónico utilizando cualquier
programa
mientras que respete la notación del modelo E/R estudiado en clase. Para los
alumnos que utilicen Visio Microsoft, en la página de la asignatura se ofrece
una
biblioteca con los símbolos del modelo E/R.
2. (2 puntos) Transformar el esquema E/R en un esquema relacional (grafo
relacional),
en el que se han de indicar las claves primarias, candidatas y las claves ajenas
con
sus opciones de integridad referencial, así como si el atributo permite valores
nulos.
7. Si es necesario, se debe incluir las restricciones de verificación (checks), aserciones y
disparadores que permitan captar toda la semántica del enunc iado (no es obligatoria
la sintaxis en SQL).
3. Creación de la base de datos en Oracle, generar el script, introducir datos en las
tablas generadas, suficientes para hacer las pruebas de las siguientes consultas y
disparadores en SQL (sintaxis de Oracle).
· (2 puntos) CONSULTAS:
1. Qué tipo de servicios ha pedido un cliente dado (“Pepito Pérez”) en el
último mes.
2. Cuál es la empresa que ofrece más servicios en la población
“Burguillo” de la provincia de “Toledo”.
3. Qué empleados (nombre y apellidos) han trabajado para “Pepito
Pérez” en el último mes.
4. Cuántas solicitudes se han aceptado en el último año, el nombre del
cliente que la realizó, las poblaciones de origen y destino (en el caso
de que hubiera) y el precio total de cada solicitud.
· (2 puntos) DISPARADORES:
1. Atributo derivado “precio total” en la solicitud de un cliente.
2. Disparador que compruebe la exclusividad en los distintos servicios
que ofrece una empresa de mudanza.
3. Aserción que compruebe que la empresa puede realizar la mudanza
solicitada por un cliente según la dirección de inicio y la dirección de
destino.
9. 3. TABLAS SQL
TABLA CLIENTE: AGRUPAR DATOS(GROUP BY)
Este método sirve para agrupar
Para crear una tabla solo
Los registros cuando son repetidos.
escribe el nombre de la
Ejemplo:
tabla con sus respectivos
select Nombre
campos y al final en la
from CLIENTE
primary key se coloca el id
group by Nombre;
de la tabla. Ejemplo.
Aquí estamos agrupando el campo Nombre
De la tabla cliente. Fig 1
create table CLIENTE (
Id-cliente int (15),
Id-empresa int 15),
Cedula int (15),
Telefono int (15),
Direccion varchar (15),
Nombre varchar (25),
primary key(Id-cliente));
Fig 1
10. TABLA SERVICIOS: (GROUP BY)
Create Table SERVICIOS ( select Tipo de servicio
Id-Servicios int (15), from SERVICIOS
Id-Empresa int (15), group by Tipo de servicio;
Id-Provincia int (15),
Precio int (15), Aquí se esta agrupando
Hora del servicio string (15), el tipde servicio dela
Tipo de servicio string (25), tabla servicio.
primary key (Id-Servicios)); Fig 2
Fig 2
11. TABLA EMPLEADO: GROUP BY:
select Direccion
Create Table EMPLEADO ( from EMPLEADO
Id-Empleado int (15), group by Direccion;
Id-Empresa int (15), En esta tabla se esta agrupando
Tipo- de- emplado string (15), La direccion.
Direccion int (15), Fig 3
Sueldo int (25),
Nombre string (15),
Telefono int (25),
primary key (Id-Empleado));
Fig 3
12. TABLA VEHICULO:
GROUP BY:
create table VEHICULO(
SELECT Placa
Id-Vehiculo int (15),
FROM VEHICULOS
Id-Empresa int 15),
GROUP BY Placa;
Id-Servicios int (15),
En esta tabla se esta agrupando
Placa int (15),
el campo placa.
Altura int (15),
Fig 4.
primary key(Id-Vehiculo));
Fig 4
13. TABLA PROVINCIA: GROUP BY:
Create Table PROVINCIA ( SELECT Nombre
Id-Provincia int (15), FROM PROVINCIA
Departamento (25), GROUP BY Nombre;
Nombre string (25),
primary key (Id-Provincia)); Aqui estamos
agrupando el campo
nombre de la tabla
provincia.
Fig 5.
Fig 5
14. TABLA SOLICITUD: GROUP BY:
create table SOLICITUD ( SELECT Destino
Id-Solicitud int (15), FROM SOLICITUD
Id-Empleado int 15), GROUP BY Destino;
Id-Servicio int (15),
Id-Provincia int (15), En esta tablase esta agrupando
Id-Cliente (15), El destino de la tabla solicitud.
Destino varchar (25), Fig 6
Peso int (15),
Fecha de servicio string (25),
Solicitud aceptada string (15),
primary key(Id-Solicitud));
Fig 6
15. TABLA EMPRESA: GROUP BY:
Create Table EMPRESA ( SELECT Direccion
Id-Empresa int (15), FROM EMPRESA
Id-Empleado int (15), GROUP BY Direccion;
Direccion int (15),
Nombre string (15), Aqui estamos agrupando la direccion
Telefono int (25), De la tabla empresa. Fig 7
primary key (Id-Empresa));
Fig 7
16. 4. CONSULTAS
1. Solicitudes de mudanzas que se hicieron antes del 15 de febrero de
2009.
SELECT SOLICITUD.[Id-Solicitud], SOLICITUD.[Fecha de servicio],
SOLICITUD.Destino
FROM SOLICITUD
WHERE (((SOLICITUD.[Id-Solicitud])=151813));
Para crear este tipó de consultas hacer clic en crear que se encuentra en la
parte superior de la base de datos, luego se hace clic en diseño de consultas
ver fig 01
Despues te aparecerá una ventana como la fig 02
Y tu eliges las tablas que necesitas para hacer tus consultas y al finalizar le
das depurar y te aparecen tus consultasen una tabla como esta fig 11.
Fig 01
Fig 11
Fig 02
17. 2. Nombre del empleado que cubrió la solicitud 151813 indicando el
origen, destino y monto cobrado.
SELECT SOLICITUD.[Id-Solicitud], EMPLEADO.Nombre,
SOLICITUD.Destino, SERVICIOS.Precio
FROM SERVICIOS INNER JOIN (EMPLEADO INNER JOIN SOLICITUD
ON EMPLEADO.[Id-Empleado] = SOLICITUD.[Id-Empleado]) ON
SERVICIOS.[Id-Servicios] = SOLICITUD.[Id-Servicio]
WHERE (((SOLICITUD.[Id-Solicitud])=151813));
18. 3. Empresa que ofrece el servicio de embalaje Bogotá-Cali y su tarifa.
SELECT EMPRESA.[Id-Empresa], EMPRESA.Nombre, SERVICIOS.[Tipo de
servicio], SERVICIOS.Precio, SOLICITUD.Destino
FROM (EMPRESA INNER JOIN SERVICIOS ON EMPRESA.[Id-
Empresa]=SERVICIOS.[Id-Empresa]) INNER JOIN SOLICITUD ON
SERVICIOS.[Id-Servicios]=SOLICITUD.[Id-Servicio]
WHERE (((EMPRESA.[Id-Empresa])=111)) OR (((EMPRESA.[Id-
Empresa])=222));
19. 4. Tarifa cobrada en el servicio Bobota-Barranquilla el día 15 de
febrero de 2009 cuyo peso era de 600 kg indicando el numero de la
solicitud, nombre del cliente y hora en la que se realizo el servicio.
SELECT SOLICITUD.[Id-Solicitud], SOLICITUD.[Fecha de servicio],
SOLICITUD.Destino, SOLICITUD.Peso, SERVICIOS.[Hora del servicio],
SERVICIOS.Precio, CLIENTE.Nombre
FROM CLIENTE INNER JOIN (SERVICIOS INNER JOIN SOLICITUD ON
SERVICIOS.[Id-Servicios] = SOLICITUD.[Id-Servicio]) ON CLIENTE.[Id-
cliente] = SOLICITUD.[Id-Cliente]
WHERE (((SOLICITUD.[Id-Solicitud])=151814 Or (SOLICITUD.[Id-
Solicitud])=151815));
20. 5. Solicitud de los empleados con sueldo y cargo y nombre de las
empresas en la que trabaja.
SELECT EMPRESA.[Id-Empresa], EMPRESA.Nombre, EMPLEADO.[Tipo de
empleado], EMPLEADO.Nombre, EMPLEADO.Sueldo
FROM EMPRESA INNER JOIN EMPLEADO ON EMPRESA.[Id-Empresa] =
EMPLEADO.[Id-Empresa]
WHERE (((EMPRESA.[Id-Empresa])=111 Or (EMPRESA.[Id-Empresa])=222
Or (EMPRESA.[Id-Empresa])=333 Or (EMPRESA.[Id-Empresa])=444 Or
(EMPRESA.[Id-Empresa])=555 Or (EMPRESA.[Id-Empresa])=666));
21. 6. Consulta de la fotocopia (4). Cuantas solicitudes se han aceptado en el
ultimo año, el nombre del cliente que la realizo, las poblaciones de origen
y destino (en el caso que hubiera) y el precio total de cada solicitud.
SELECT SOLICITUD.[Solicitud aceptada], SOLICITUD.[Fecha de servicio],
SOLICITUD.Destino, CLIENTE.Nombre, PROVINCIA.[Id-Provincia],
PROVINCIA.Departamento, PROVINCIA.Nombre, SERVICIOS.Precio
FROM ((CLIENTE INNER JOIN SOLICITUD ON CLIENTE.[Id-cliente] =
SOLICITUD.[Id-Cliente]) INNER JOIN PROVINCIA ON SOLICITUD.[Id-
Provincia] = PROVINCIA.[Id-Provincia]) INNER JOIN SERVICIOS ON
(PROVINCIA.[Id-Provincia] = SERVICIOS.[Id-Provincia]) AND (SOLICITUD.[Id-
Servicio] = SERVICIOS.[Id-Servicios])
WHERE (((SOLICITUD.[Solicitud aceptada])="Si" Or (SOLICITUD.[Solicitud
aceptada])="Si"));