Sie sind auf Seite 1von 16

Teoría y Diseño de

Bases de Datos

Trabajo de Campo
Entrega Final

Relloso, Juan
Facultad de Economía
Lic. en Ciencias de la Computación
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

Descripción del Dominio

FAF Asociados SRL es una empresa nacida en 1988, dedicada a los servicios de
seguridad.
Algunos de ellos son: vigilancia privada, transporte de caudales, investigaciones
privadas, instalación y monitoreo de alarmas, diagramación, instalación y monitoreo
satelital de vehículos, servicio de control en yacimientos petroleros, instalación de circuitos
cerrados de televisión, etc.
Se desea almacenar toda la información referida a los servicios de monitoreo de
alarmas y de vigilancia ofrecidos, así como los datos de los clientes, empleados y
servicios ya brindados.
Las personas interesadas en los servicios de la empresa, pueden solicitar un
presupuesto, el cual puede ser para un servicio de vigilancia o para un servicio de
alarmas. Estos presupuestos, dados en una fecha, y que poseen un importe total según el
servicio consultado, serán guardados, en caso de que el cliente se decida a contratar el
servicio o no, ya que pueden servir para futuras estadísticas. Para los presupuestos de
vigilancia se pedirá al cliente la cantidad de horas aproximada que necesitará vigilancia,
mientras que para los de alarmas se necesita saber la dimensión del lugar, y la cantidad
de elementos estimativos que se colocaran (sensores, cámaras, etc). Un cliente puede
pedir varios presupuestos, pero cada uno pertenece a un cliente.
Si se aprueba un presupuesto, se genera un servicio correspondiente a la necesidad
del cliente (servicio de vigilancia o alarmas), el cual estará asociado a un único cliente,
tendrá una fecha de inicio y un lugar o dirección en donde se realizará. Un cliente puede
tener varios servicios a su nombre.
Para los servicios de vigilancia es necesario saber los días y horarios, los cuales serán
asignados luego a aquellos vigilantes de la empresa que estén disponibles. Un vigilante
tendrá varios horarios (día, hora de inicio y hora final) que pueden pertenecer a distintos
servicios, siempre y cuando los horarios no se superpongan. En el caso de los servicios
de alarmas, se registrarán la dimensión del lugar, la cantidad de sensores y de cámaras
que se usarán.
Para estos servicios, la empresa cuenta con varios empleados; en este caso se tendrán

1 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

en cuenta el grupo de los técnicos y el de los vigilantes. En ambos casos se guardará la


fecha de ingreso a la empresa, el sueldo actual, y los datos personales.
Los vigilantes están asignados a algún servicio de vigilancia, con un determinado
horario. Al mismo servicio pueden asignarse varios vigilantes, todo depende de los
requerimientos del cliente. Cuando se asigna por primera vez un vigilante a un servicio, se
busca aquellos que esten disponibles para los horarios solicitados.
Los técnicos son los encargados de hacer las instalaciones cuando se solicita un
servicio de alarmas. También realizan un control mensual a cada cliente, para asegurarse
de que todo este en correcto funcionamiento. Este control se emite en la fecha
correspondiente a cada servicio (1 vez por mes después de la fecha de inicio) y tiene una
fecha limite; mientras no se haya hecho, queda como control pendiente. Cuando el control
es realizado, se registra la fecha del día, el estado del servicio, la conformidad del cliente
y las observaciones. Cada control mensual esta identificado por un número y por el
servicio al que pertenece, y además es realizado por un único técnico. Un técnico puede
haber realizado controles pertenecientes a distintos servicios, pero cada control lo realizó
sólo ese técnico.
La empresa también necesita controlar el stock de los equipos con los que dispone.
Estos tendrán un código que los identifica, y además su descripción, tipo, modelo y
disponibilidad. Los equipos pueden ser de personal o técnico. Los equipos personales son
aquellos con los que cuentan los vigilantes, así como uniformes, calzado, linterna u otro
elemento que necesiten para su tarea. Un vigilante puede tener varios elementos, pero
cada uno es usado por una sola persona. No es necesario conocer la fecha en la que usó
un elemento, ya que ese elemento se le asigna sólo a ese vigilante para siempre. Se
guarda un detalle que puede referirse por ejemplo al estado de un uniforme o a algún
problema que tenga un instrumento. Los equipos técnicos son las alarmas, sensores y
todo aquello que se pueda llegar a usar en un servicio de alarmas, por lo cual es
necesario saber su precio y estado (actual). Pueden usarse varios en un servicio, pero
estarán asignados sólo a ese servicio.

2 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

Diagrama de Clases del Dominio

3 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

ODL del Diagrama de Clases

interface Persona( key(dni) )


{ attribute String dni;
attribute String nombre;
attribute String apellido;
attribute String direccion;
attribute String localidad;
attribute String telefono;
};

interface Cliente:Persona (extent Clientes)


{ attribute String cuil;
attribute String cuit;
relationship Set<Presupuesto>solicitaPresupuesto inverse Presupuesto::solicitadoPor;
relationship Set<Servicio>tieneServicio inverse Servicio:: perteneceCliente;
};

interface Empleado:Persona (extent Empleados)


{ attribute Integer sueldo;
attribute String fechaIngreso;
};
interface Tecnico:Empleado (extent Tecnicos)
{ relationship Set<ControlMensual>realizaControl inverse ControlMensual:: realizadoPor;
};
interface Vigilante:Empleado (extent Vigilantes)
{ relationship Set<Trabaja>realizaTrabajo inverse Trabaja:: perteneceVigilante;
relationship Set<EquipoPersonal>usaEquipo inverse EquipoPersonal:: usadoPor;
};

interface Presupuesto( extent Presupuestos key(idPresupuesto))


{ attribute String idPresupuesto;
attribute String fecha;
attribute Integer importeTotal;
relationship <Cliente>solicitadoPor inverse Cliente:: solicitaPresupuesto;
};

4 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

interface PresupuestoVigilancia: Presupuesto ( extent PresupuestosVigilancia)


{ attribute Integer cantHoras;
relationship <ServicioVigilancia>tieneServicio inverse ServicioVigilancia:: tienePresupuesto;
};
interface PresupuestoAlarmas: Presupuesto (extent PresupuestosAlarmas)
{ attribute Integer cantElementos;
attribute String metrosCuadrados;
relationship<ServicioAlarmas>tieneServicio inverse ServicioAlarmas:: tienePresupuesto;
};

interface Servicio( key(idServicio) )


{ attribute String idServicio;
attribute String fechaInicio;
attribute String lugar;
relationship Set<Cliente> perteneceCliente inverse Cliente:: tieneServicio;
};
interface ServicioVigilancia: Servicio (extent ServiciosVigilancia)
{ relationship Set<Trabaja>tieneTrabajo inverse Trabaja:: perteneceServicio;
relationship<PresupuestoVigilancia>tienePresupuesto inverse PresupuestoVigilancia:: tieneServicio;
};
interface ServicioAlarmas: Servicio (extent ServiciosAlarmas)
{ attribute Integer cantSensores;
attribute Integer cantCamaras;
attribute String dimensiones;
relationship <PresupuestoAlarmas>tienePresupuesto inverse PresupuestoAlarmas:: tieneServicio;
relationship Set <ControlMensual>tieneControl inverse ControlMensual:: perteneceServicio;
relationship Set <EquipoTecnico>usaEquipo inverse EquipoTecnico:: usadoPor;
};

interface ControlMensual( extent ControlesMensuales key(nroControl, perteneceServicio) )


{ attribute String nroControl;
attribute String fechaEmision;
relationship <ServicioAlarmas>perteneceServicio inverse ServicioAlarmas:: tieneControl;
relationship <Tecnico>realizadoPor inverse Tecnico:: realizaControl;
relationship <Estado>tieneEstado inverse Estado:: tieneControlMensual;
};

5 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

interface Estado
{ relationship <ControlMensual>tieneControlMensual inverse ControlMensual:: tieneEstado;
};
interface EstadoPendiente: Estado
{ attribute String fechaLimite;

}:
interface EstadoRealizado: Estado
{ attribute String fechaControl;
attribute String estadoServicio;
attribute String observaciones;
attribute String conformidad;
};

interface Equipo( key(idEquipo))


{ attribute String idEquipo;
attribute String descripcion;
attribute String disponibilidad;
attribute String modelo;
attribute String tipo;
};
interface EquipoPersonal: Equipo (extent EquiposPersonales)
{ attribute String detalles;
relationship <Vigilante>usadoPor inverse Vigilante:: usaEquipo;
};
interface EquipoTecnico: Equipo (extent EquiposTecnicos)
{ attribute String estado;
attribute Integer costo;
relationship <ServicioAlarmas>usadoPor inverse ServicioAlarmas:: usaEquipo;
};

interface Trabaja (extent Trabajos key(dia, horaInicio, horaFin))


{ attribute String dia;
attribute String horaInicio;
attribute String horaFin;
relationship <ServicioVigilancia>perteneceServicio inverse ServicioVigilancia:: tieneTrabajo;
relationship <Vigilante>perteneceVigilante inverse Vigilante:: realizaTrabajo;
};

6 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

Modelo Entidad-Relación del Dominio

7 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

DDL (SQL) del Modelo Entidad-Relación

CREATE TABLE Cliente (


dni VARCHAR(10) PRIMARY KEY,
nombre VARCHAR(20) NOT NULL,
apellido VARCHAR(20) NOT NULL,
direccion VARCHAR(30) NOT NULL,
localidad VARCHAR(20) NOT NULL,
telefono VARCHAR(20) NOT NULL,
cuil VARCHAR(25),
cuit VARCHAR(25),
);

CREATE TABLE Empleado (


dni VARCHAR(10) PRIMARY KEY,
nombre VARCHAR(20) NOT NULL,
apellido VARCHAR(20) NOT NULL,
direccion VARCHAR(30) NOT NULL,
localidad VARCHAR(20) NOT NULL,
telefono VARCHAR(20) NOT NULL
);

CREATE TABLE Tecnico (


dni VARCHAR(10) REFERENCES dni(Empleado),
PRIMARY KEY (dni),
nombre VARCHAR(20) NOT NULL,
apellido VARCHAR(20) NOT NULL,
direccion VARCHAR(30) NOT NULL,
localidad VARCHAR(20) NOT NULL,
telefono VARCHAR(20) NOT NULL
);

CREATE TABLE Vigilante (


dni VARCHAR(10) REFERENCES dni(Empleado),
PRIMARY KEY (dni),
nombre VARCHAR(20) NOT NULL,
apellido VARCHAR(20) NOT NULL,

8 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

direccion VARCHAR(30) NOT NULL,


localidad VARCHAR(20) NOT NULL,
telefono VARCHAR(20) NOT NULL
);

CREATE TABLE PresupuestoAlarmas (


idPresupuesto VARCHAR(10) PRIMARY KEY,
fecha DATE NOT NULL,
importeTotal DECIMAL(6,2),
cantElementos INT,
metrosCuadrados INT,
dni VARCHAR(10) REFERENCES Cliente(dni)
ON DELETE CASCADE
ON UPDATE CASCADE,
);

CREATE TABLE PresupuestoVigilancia (


idPresupuesto VARCHAR(10) PRIMARY KEY,
fecha DATE NOT NULL,
importeTotal DECIMAL(6,2),
dni CHAR(20) REFERENCES Cliente(dni)
ON DELETE CASCADE
ON UPDATE CASCADE,
);

CREATE TABLE ServicioVigilancia (


idServicio VARCHAR(10) PRIMARY KEY,
fechaInicio DATE NOT NULL,
lugar VARCHAR(30),
idPresupuesto VARCHAR(10) REFERENCES PresupuestoAlarmas(idPresupuesto)
ON DELETE SET NULL
ON UPDATE CASCADE,
dni VARCHAR(20) REFERENCES Cliente(dni)
ON DELETE RESTRICT
ON UPDATE CASCADE
);

9 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

CREATE TABLE ServicioAlarmas (


idServicio VARCHAR(10) PRIMARY KEY,
fechaInicio DATE NOT NULL,
lugar VARCHAR(30),
dimensiones VARCHAR(10),
cantSensores INT,
cantAlarmas INT,
idPresupuesto VARCHAR(10) REFERENCES PresupuestoVigilancia(idPresupuesto)
ON DELETE SET NULL
ON UPDATE CASCADE,
dni VARCHAR(10) REFERENCES Cliente(dni)
ON DELETE RESTRICT
ON UPDATE CASCADE
);

CREATE TABLE EquipoTecnico (


idEquipo VARCHAR(10) PRIMARY KEY,
descripcion VARCHAR(30) NOT NULL,
modelo VARCHAR(20),
tipo VARCHAR(20),
disponibilidad BIT(1),
costo DECIMAL(5,2),
estado VARCHAR(10),
asignadoA VARCHAR(10) REFERENCES ServicioAlarmas(idServicio)
ON DELETE SET NULL
ON UPDATE CASCADE
);
CREATE TABLE EquipoPersonal (
idEquipo VARCHAR(10) PRIMARY KEY,
descripcion VARCHAR(30) NOT NULL,
modelo VARCHAR(20),
tipo VARCHAR(20),
disponibilidad BIT(1),
detalles VARCHAR(30),
enUsoPor VARCHAR(10) REFERENCES Vigilante(dni)
ON DELETE SET NULL
ON UPDATE CASCADE
);

10 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

CREATE TABLE ControlPendiente (


fechaEmision DATE,
nroControl VARCHAR(6),
idServicio VARCHAR(10) REFERENCES ServicioAlarmas(idServicio)
ON DELETE RESTRICT
ON UPDATE CASCADE,
PRIMARY KEY (nroControl,idServicio),
dniTecnico VARCHAR(10) REFERENCES Tecnico(dni)
ON DELETE CASCADE
ON UPDATE CASCADE,
fechaLimite DATE
);

CREATE TABLE ControlRealizado (


fechaEmision DATE,
nroControl VARCHAR(6),
idServicio VARCHAR(10) REFERENCES ServicioAlarmas(idServicio)
ON DELETE RESTRICT
ON UPDATE CASCADE,
dniTecnico VARCHAR(10) REFERENCES Tecnico(dni)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (nroControl,idServicio),
fechaControl DATE NOT NULL,
estadoServicio VARCHAR(20) NOT NULL,
conformidad VARCHAR(10) NOT NULL,
observaciones VARCHAR(30)
);

CREATE TABLE Trabaja (


dia DATE,
horaInicio TIME,
horaFin TIME,
dniVigilante VARCHAR(10) REFERENCES Vigilante(dni),
PRIMARY KEY(horaInicio,horaFin,dniVigilante),
idServicio VARCHAR(10) REFERENCES ServicioVigilancia(idServicio)
);

11 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

Consultas SQL (DML)

1. Realizar todas las operaciones necesarias para insertar un vigilante en un servicio de


vigilancia contratado por un cliente (considerar que la BD esta vacía).

INSERT INTO Cliente (dni, apellido, nombre, direccion, localidad, telefono)


VALUES ('22.222.222', 'Castro', 'Carlos', 'San Martin 2000', 'Neuquen', '4443321');
INSERT INTO Vigilante (dni, apellido, nombre, direccion, localidad, telefono)
VALUES ('21.123.123', 'Perez', 'Jose', 'Av. Argentina 123', 'Neuquen', '4401234');
INSERT INTO PresupuestoVigilancia(idPresupuesto, fecha, importeTotal, dni)
VALUES ('P123', '20/12/2007', 150, '22.222.222');
INSERT INTO ServicioVigilancia(idServicio, fechaInicio, lugar, idPresupuesto, dni)
VALUES ('S123', '1/1/2008', 'Neuquen', 'P123', '22.222.222');
INSERT INTO Trabaja (dia, horaInicio, horaFin, dniVigilante, idServicio)
VALUES ('10/10/2008', '8:00', '18:00', '21.123.123', 'S123');

2. Realizar todas las operaciones necesarias para modificar el equipo asignado a los
vigilantes que vivan en Neuquén.

UPDATE EquipoPersonal SET disponibilidad=0


WHERE dniVigilante IN (SELECT dni FROM Vigilante WHERE localidad='Neuquen')

3. Realizar todas las operaciones necesarias para eliminar un vigilante (ojo con la
integridad referencial).

DELETE FROM Trabaja WHERE dniVigilante='21.123.123';


DELETE FROM Vigilante WHERE dni='21.123.123';

4. Listar los vigilantes cuyo nombre comience con la letra A y que no tengan asignado
ningún servicio.

SELECT v
FROM Vigilante v
WHERE v.nombre LIKE 'A%' AND v.dni NOT IN (SELECT dniVigilante FROM Trabaja)

12 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

5. Listar la información de los equipos técnicos y en el caso de que estén asignados a un


servicio de alarmas, listar también la cantidad de sensores y la identificación del servicio.

SELECT e, idServicio, cantSensores


FROM (EquipoTecnico e) LEFT OUTER JOIN ServicioAlarmas ON e.asignadoA=idServicio

6. Listar los servicios de alarmas que no hayan tenido su control mensual.

SELECT sa
FROM ControlPendiente, ServicioAlarma sa
WHERE ControlPendiente.idServicio=sa.idServicio

En la consulta anterior devuelvo los controles que quedaron pendientes.


Si quisiera saber los controles que no se hicieron en octubre:

SELECT sa
FROM ControlPendiente, ServicioAlarma sa
WHERE ControlPendiente.idServicio=sa.idServicio
AND (fechaEmision>='1/11/2008' OR fechaEmision<='30/9/2008')

7. Listar la cantidad de presupuestos para servicios de alarmas que haya pedido un cliente
y que lo haya efectivamente contratado.

SELECT COUNT (pa.idPresupuesto), Cliente.dni, nombre, apellido


FROM PresupuestoAlarmas pa, ServicioAlarmas sa, Cliente
WHERE pa.dni=Cliente.dni AND Cliente.dni=sa.dni AND pa.idPresupuesto=sa.idPresupuesto
GROUP BY Cliente.dni

8. Listar los vigilantes que hayan realizado más de 10 horas extras el mes pasado en un
servicio de Nqn.

Suponiendo que un vigilante trabaja por ejemplo 170 horas al mes, buscaremos aquellos que han
trabajado más de 180 horas.
Observación: Se podría haber usado el tipo DATE para los horarios de los vigilantes y usar
operaciones de SQL para ese tipo; no se usan para no complicar la consulta y suponemos que la
diferencia entre horarios nos da el número de horas diarios de trabajo.

13 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

SELECT v
FROM Vigilante v,
( SELECT sv.idServicio
FROM ServicioVigilancia sv
WHERE sv.Lugar = 'Neuquen'), (*1)
( SELECT dniVigilante, idServicio, SUM ((horaFin – horaInicio)) AS nroHoras
FROM Trabaja
WHERE dia<'1/12/2008' AND dia>'31/10/1984'
GROUP BY Cliente.dni ) (*2)
WHERE v.dni = dniVigilante AND idServicio = sv.IdServicio AND nroHoras>180

*1 Selecciona los servicios hechos en Neuquén


*2 Suma las horas de trabajo de los vigilantes hechas en el mes de octubre

9. Realizar una afirmación que controle que la fecha del control mensual sea siempre
mayor a la fecha de inicio del servicio al cual pertenece.

CREATE ASSERTION fechaControlMensual CHECK


NOT EXISTS ( SELECT * FROM ControlMensual c, ServicioAlarmas s
WHERE o.idServicio=s.idServicio AND c.fechaEmision<=s.fechaInicio);

10. Realizar una afirmación que controle que todo servicio contratado por un cliente haya
tenido previamente un presupuesto efectuado.

CREATE ASSERTION presupuestoyServicioAlarmas CHECK


NOT EXISTS ( ( SELECT pa.dni, pa.idPresupuesto FROM PresupuestoAlarmas pa )
NOT IN
( SELECT s.dni, s.idPresupuesto FROM ServicioAlarmas s)
);

CREATE ASSERTION presupuestoyServicioVigilancia CHECK


NOT EXISTS ( ( SELECT pv.dni, pv.idPresupuesto FROM PresupuestoVigilancia pv )
NOT IN
( SELECT s.dni, s.idPresupuesto FROM ServicioVigilancia s)
);

14 Relloso, Juan
 Teoría y Diseño de Bases de Datos                         
                                                     
   Trabajo de Campo
   

Consultas OQL

11. Listar los controles mensuales de los empleados técnicos cuya dirección comience con
Av. de Nqn.

SELECT c
FROM ControlesMensuales c
WHERE c.realizadoPor.localidad='Neuquen' AND c.realizadoPor.direccion LIKE 'Av. %'

12. Listar los técnicos que no realizaron ningún control mensual.

(SELECT t
FROM Tecnicos t)
EXCEPT
(SELECT DISTINCT c.realizadoPor
FROM ControlesMensuales c)

13. Listar los servicios de vigilancia contratados por un cliente específico junto con el
vigilante y su equipo de trabajo.

Servicios contratados por el cliente con dni 20.000.000 junto con los vigilantes y su equipo

SELECT s.idServicio, s.perteneceCliente.nombre, s.tieneTrabajo.perteneceVigilante.dni,


s.tieneTrabajo.perteneceVigilante.usaEquipo
FROM ServicioVigilancia s
WHERE s.perteneceCliente.dni='20.000.000'

Otra forma

SELECT s, cliente, vigilante, equipo


FROM ServicioVigilancia s, s.perteneceCliente.nombre cliente,
s.tieneTrabajo.perteneceVigilante.dni vigilante,
s.tieneTrabajo.perteneceVigilante.usaEquipo equipo
WHERE s.perteneceCliente.dni='20.000.000'

15 Relloso, Juan

Das könnte Ihnen auch gefallen