Sei sulla pagina 1di 15

Bases de Datos 1

Práctica – 2
Alquileres de Coches

Eugenio Novás Cortés – infenc00


Jose Ricardo de Juan Cajide # infjdc01
1.1. Descripción del Dominio
La temática que se va a elaborar trata sobre el alquiler de vehículos de una empresa.
En un principio la empresa contendrá, un parque de automoviles en el cual guardaremos la información
de los vehiculos que puede alquilar.

Los alquileres se podrán realizar desde distintas oficinas repartidas en distintas localidades. En cada
oficina podremos alquilar determinados modelos que se encuentren en ese momento disponibles en esa
localidad.

Para realizar un alquiler se daran dos opciones, en la primera el cliente, del cual conoceremos sus datos
personales, podrá obtener el coche en el momento, y como segunda opción podrá realizar una reserva con
antelación, informando de la oficina y modelo de automovil.

A la hora de realizar dicha reserva, el cliente tendra que concretar con la empresa datos como, fecha de
inicio del alquilar y fecha de devolución . También conoceremos en todo momento la oficina en la cual se
dispondrá del vehiculo, y la oficina en la cual debemos entregarlo en la fecha de devolución concretada. A
la hora de empezar la reserva, esta pasará a ser alquiler, el cliente podrá alquilar más de un vehiculo,
guardando la misma información para cada uno de ellos. En el momento de devolver el vehiculo en la
oficina concretada, se procederá a entregar una factura, en la cual se conocer todos los detalles del alquiler
asi como su precio final. Si existen clientes habituales la factura se le pasará al final de mes, en la que
habrá una/as línea/as de factura indicando el precio de cada alquiler.

En cuanto un cliente realiza la reserva se conoceran los mismos datos que a la hora de realizar el alquier,
sumandole la fecha en la cual se concreta la reserva. La empresa de esta manera asegurara que el vehiculo
elegido estara disponible y en la localidad acordada en la fecha de inicio del alquiler. También en la
reserva se podrá concretar el alquiler de más de un vehiculo y como en el alquiler se le pasará una factura
al final del mes o de la reserva, según sea el tipo de cliente.

Además, el dominio permite detectar las incidencias ocurridas durante el alquiler de cada coche, donde se
indica la descripción de la incidencia que le ha ocurrido al coche.
1.2. Diagrama E#R
1.3. Modelo Relacional
'Tabla de clientes:
Esta tabla guarda la información personal de todos los clientes de la empresa.
CLI (DNI, NOM, DIR TELF, NUMC)
'DNI(CHAR(9)): Documento Nacional de Identidad, como es único por persona lo
usamos como llave de la tabla.
'NOM(VARCHAR2(50)): Nombre y apellidos del cliente.
'DIR(VARCHAR2(50)): Dirección de residencia actual del cliente.
'TELF(NUMBER(9)): Número de teléfono del cliente.
'NUMC(NUMBER(20)): Número de cuenta, por si es necesario realizar los cobros por
medio del banco.

Dependencias Llaves Forma Llaves Foráneas:


Funcionales: Candidatas: Normal:
'F:{DNI → NOM
DNI → DIR FNBC N/A
DNI → TELF ' DNI
DNI → NUMC}

'Tabla de oficinas:
Esta tabla guarda la información necesaria de todas las oficinas.
OFI (CO, NOMOF, CIUDAD)
'CO(NUMBER(3)): Código Oficina, es único y se va a usar como llave de la tabla.
'NOMOF(VARCHAR2(30)): Nombre de la oficina.
'CIUDAD(VARCHAR2(30)): Ciudad en la que se encuentra la oficina.
Dependencias Funcionales: Llaves Candidatas: Forma Llaves Foráneas:
F:{CO → NOMOF Normal:
CO → CIUDAD} 'CO FNBC N/A

'Tabla de las reservas:


'Tabla de las reservas:
Esta tabla guarda la información necesaria de todas las reservas.
RES(CR, FECHA_I_R, FECHA_F_R, PRE, DNI, CO1, CO2, MO)
'CR(NUMBER(4)): Código Reserva, es único porque cada reserva es diferente y se va a usar
como llave de la tabla.
'FECHA_I_R(DATE): Fecha Inicio Reserva.
'FECHA_F_R(DATE): Fecha Finalización Reserva.
'PRE(NUMBER(10)): Precio acordado de la reserva.
DNI(NUMBER(9)): Documento Nacional de Identidad
CO1(NUMBER(3)): Código Oficina 1 desde la que se realiza la reserva.
CO2(NUMBER(3)): Código Oficina 2 en la que se termina la reserva.
MO(VARCHAR2(15)): Modelo del coche del que se realiza la reserva.
Dependencias Funcionales: Llaves Candidatas: Forma Normal: Llaves Foráneas:
F:{CR → FECHA_I_R
CR → FECHA_F_R 'CLI(DNI)
CR → PRE OFI(CO1)
CR → DNI 'CR FNBC OFI(CO2)
CR → CO1 MODELO(MO)
CR → CO2
CR → MO}

'Tabla de alquileres:
Esta tabla guarda la información necesaria de todos los alquileres.
ALQ (CA, FECHA_I_A, FECHA_F_A, DNI, CO1, CO2, NM, CR)
'CA (NUMBER(4)): Código Alquiler, es único porque cada reserva es diferente y se va a
usar como llave la tabla.
'FECHA_I_A (DATE): Fecha Inicio Alquiler.
'FECHA_F_A(DATE): Fecha Finalización Alquiler.
DNI(NUMBER(9)): Documento Nacional de Identidad
CO1(NUMBER(3)): Código Oficina 1 desde la que se realiza el alquiler.
CO2(NUMBER(3)): Código Oficina 2 en la que se termina el alquiler.
NM(VARCHAR2(7)): Número Matrícula del coche del que se realiza el alquiler.
CR(NUMBER(4)): Código Reserva.
Dependencias Funcionales: Llaves Forma Normal: Llaves Foráneas:
F:{CA → FECHA_I_A Candidatas:
CA → FECHA_F_A CLI(DNI)
CA → DNI OFI(CO1)
CA → CO1 FNBC
'CA OFI(CO2)
CA → CO2 COCHE (NM)
CA → NM
CA → CR
CR → CA}
'Tabla de los coches:
Esta tabla guarda la información necesaria de todos los coches.
COCHES (NM, COLOR, KM, MO)
'NM (VARCHAR2(7)): Número Matrícula, es único ya que cada coche tiene su propia
matrícula y no puede ser igual, por lo tanto la tanto la usamos como llave de la tabla.
'COLOR (VARCHAR2(20)): El tipo de color del coche.
'KM (NUMBER(6)): Los Kilómetros recorridos por el coche.
MO (VARCHAR2(15)): Modelo del coche.
Dependencias Funcionales: Llaves Candidatas: Forma Normal: Llaves Foráneas:
F:{ NM → MO
NM → COLOR 'NM FNBC MODELO(MO)
NM → KM }

'Tabla de modelos de coche:


Esta tabla guarda la información necesaria de todos los tipos de modelos de coche.
MODELO (MO,PO,MA, PR)
'MO (VARCHAR2(15)): El modelo del coche.
'PO (NUMBER(3)): Potencia del coche.
'MA (VARCHAR2(10)): Marca del coche.
'PR(NUMBER(4)): Precio/Día coche.
Dependencias Funcionales: Llaves Candidatas: Forma Normal: Llaves Foráneas:
F:{MO → MA
MO → PO 'MO FNBC N/A
MO → PR}

'Tabla de incidencias:
Esta tabla guarda la información necesaria de las incidencias de los coches después del
alquiler.
INC (CI, DESC, NM, CA)
'CI (NUMBER(4)): Código de Incidencia, lo usamos como llave de la tabla.
'DES (VARCHAR2(50)): Descripción de la incidencia.
NM (VARCHAR2(7)): Número Matrícula del coche, el cual se produjo la incidencia.
CA (NUMBER(4)): Código Alquiler.

Dependencias Funcionales: Llaves Candidatas: Forma Normal: Llaves Foráneas:


F:{CI → DES
CI → NM 'CI FNBC 'COCHE (NM):
CI → CA} 'ALQ(CA):

'Tabla de cada una de las lineas de factura:


'Tabla de cada una de las lineas de factura:
Esta tabla guarda la información necesaria para poder imprimir una factura de cada alquiler.
L.FAC (NL,PRECIO, CA, NF)
'NL (NUMBER(4)): Número Línea de la factura, lo usamos como llave de la tabla
'PRECIO (NUMBER(6)): Cantidad de dinero que hay en la línea de factura.
'CA (NUMBER(4)):Código Alquiler.
NF (NUMBER(4)): Número Factura, en la que se encuentra cada línea de factura.

Dependencias Funcionales: Llaves Candidatas: Forma Normal: Llaves Foráneas:


F:{NL → PRECIO
NL → NF 'ALQ(CA):
'NL, CA FNBC 'FAC(NF):
NL → CA
CA → NL}

'Tabla de facturas:
Esta tabla guarda la información necesaria que debe de pagar un cliente.
FAC (NF, FECHA, TOTAL, IVA, DNI)
'NF (NUMBER(4)): Número Factura, la usamos como llave de la tabla porque cada factura
es única.
'FECHA (DATE): Fecha en la cual se imprime la factura.
'TOTAL (NUMBER(6)): Cantidad total de dinero de la factura.
'IVA (NUMBER(4)): Impuesto de Valor Añadido.
'DNI (NUMBER(9)): Documento Nacional de Identidad
Dependencias Funcionales: Llaves Candidatas: Forma Normal: Llaves Foráneas:
F:{NF → FECHA
NF → TOTAL 'NF FNBC 'CLI(DNI):
NF → IVA
NF → DNI}

El modelo relacional contiene todas las tablas en FNBC y hemos considerado en no


desnormalizar ninguna tabla.

1.4. Implementación física


1.4. Implementación física

CREATE TABLE cli (


dni CHAR(9) NOT null,
nom VARCHAR2(50),
dir VARCHAR2(50),
telf NUMBER(9),
numc NUMBER(20),
CONSTRAINT cli_pkey PRIMARY KEY (dni)

CREATE INDEX in_cli_dni ON cli (dni);

CREATE TABLE ofi (


co NUMBER(3) NOT null,
nomof VARCHAR2(30),
ciudad VARCHAR2(30),
CONSTRAINT ofi_pkey PRIMARY KEY (co)

CREATE INDEX in_ofi_co ON ofi (co);

CREATE TABLE modelos (


mo VARCHAR2(15) NOT null,
po NUMBER(3),
ma VARCHAR2(10),
pr NUMBER(4),
CONSTRAINT modelos_pkey PRIMARY KEY (mo)

CREATE INDEX in_modelos_mo ON modelos (mo);

CREATE TABLE coches (


nm VARCHAR2(7) NOT null,
color VARCHAR2(20),
km NUMBER(6),
mo VARCHAR2(15),
CONSTRAINT coches_pkey PRIMARY KEY (nm),
CONSTRAINT coches_mo_fkey FOREIGN KEY (mo) REFERENCES modelos(mo)

CREATE INDEX in_coches_nm ON coches (nm);


ALTER TABLE coches ADD CONSTRAINT ck_coche_km CHECK (km >= 0);

CREATE TABLE res (


CREATE TABLE res (
cr NUMBER(4) NOT null,
fecha_i_r DATE,
fecha_f_r DATE,
pre NUMBER(10),
dni CHAR(9),
co1 NUMBER(3),
co2 NUMBER(3),
mo VARCHAR2(15),
CONSTRAINT res_pkey PRIMARY KEY (cr),
CONSTRAINT res_dni_fkey FOREIGN KEY (dni) REFERENCES cli(dni),
CONSTRAINT res_co1_fkey FOREIGN KEY (co1) REFERENCES ofi(co),
CONSTRAINT res_co2_fkey FOREIGN KEY (co2) REFERENCES ofi(co),
CONSTRAINT res_mo_fkey FOREIGN KEY (mo) REFERENCES modelos(mo)

CREATE INDEX in_res_cr ON res (cr);


ALTER TABLE res ADD CONSTRAINT ck_res_pre CHECK (pre > 0);

CREATE TABLE alq (


ca NUMBER(4) NOT null,
fecha_i_a DATE,
fecha_f_a DATE,
dni CHAR(9),
co1 NUMBER(3),
co2 NUMBER(3),
nm VARCHAR2(7),
cr NUMBER(4),
CONSTRAINT alq_pkey PRIMARY KEY (ca),
CONSTRAINT alq_dni_fkey FOREIGN KEY (dni) REFERENCES cli(dni),
CONSTRAINT alq_co1_fkey FOREIGN KEY (co1) REFERENCES ofi(co),
CONSTRAINT alq_co2_fkey FOREIGN KEY (co2) REFERENCES ofi(co),
CONSTRAINT alq_nm_fkey FOREIGN KEY (nm) REFERENCES coches(nm),
CONSTRAINT alq_cr_fkey FOREIGN KEY (cr) REFERENCES res(cr)

CREATE INDEX in_alq_ca ON alq (ca);


CREATE TABLE inc (
ci NUMBER(4) NOT null,
des VARCHAR2(20),
nm VARCHAR2(7),
ca NUMBER(4),
CONSTRAINT inc_pkey PRIMARY KEY (ci),
CONSTRAINT inc_nm_fkey FOREIGN KEY (nm) REFERENCES coches(nm),
CONSTRAINT inc_ca_fkey FOREIGN KEY (ca) REFERENCES alq(ca)

CREATE INDEX in_inc_ci ON inc (ci);
CREATE TABLE fac(
nf NUMBER(4) NOT null,
fecha DATE,
total NUMBER(6),
iva NUMBER(4),
dni CHAR(9),
CONSTRAINT fac_pkey PRIMARY KEY (nf),
CONSTRAINT fac_dni_fkey FOREIGN KEY (dni) REFERENCES cli(dni)

CREATE INDEX in_fac_nf ON fac (nf);

CREATE TABLE lfac(


nl NUMBER(4) NOT null,
precio NUMBER(4),
ca NUMBER(4),
nf NUMBER(4),
CONSTRAINT lfac_pkey PRIMARY KEY (nl),
CONSTRAINT lfac_ca_fkey FOREIGN KEY (ca) REFERENCES alq(ca),
CONSTRAINT lfac_nf_fkey FOREIGN KEY (nf) REFERENCES fac(nf)

CREATE INDEX in_lfac_nl ON lfac (nl);


ALTER TABLE lfac ADD CONSTRAINT ck_lfac_precio CHECK (precio > 0);
1.5. Consultas
–. Consulta 1: Obtener todos los datos de todos los modelos.
SQL:
SELECT *
FROM modelos; ¡ ¢
Álgebra Relacional: ∏ * Modelos

–. Consulta 2: Lista los nombres de las oficinas ordenadas inversamente.


SQL:
SELECT nomof
FROM ofi
ORDER BY nomof DESC; ¡ ¢
Álgebra Relacional: ∏ n om of ofi
*Nota: En álgebra relacional el orden descendente no se puede resolver.
–. Consulta 3: Obtén el número de matrícula de los coches que su color termine en 'O' y tengan
mas de 0 KM recorridos.
SQL:
SELECT NM
FROM coches
WHERE color LIKEÃ'%O' AND km > 0; !
¡ ¢
Álgebra Relacional: ∏ nm σ¡km >0 ¢∧ ¡co lo r='%O'¢ coches

–. Consulta 4: ¿Cuantas incidencias tiene la el coche con mátricula 0001ABC?


SQL:
SELECT COUNT (CI)
FROM inc
WHERE nm LIKE '0001ABC'; ¡ ¡ ¢¢
Álgebra Relacional: ∏ co u nt¡ci¢ σn m = '0 0 0 1ABC ' inc
–. Consulta 5: Obtén las reservas del DNI: 12345678F
SQL:
SELECT r.*
FROM res r JOIN cli c
ON r.dni = c.dni
WHERE r.dni LIKE '12345678F';
¡ ¡ ¡ ¢ ¢¢
ÁlgebraRelacional: ∏ res.* σres.dn i='1 2 3 4 5 6 7 8F ' res ⋈res.d ni = cli.d ni cli
–. Consulta 6: Lista el código reserva, el código alquiler y el DNI del cliente de aquellos
alquileres que fueron reservados con antelación.
SQL:
SELECT r.cr, a.ca, a.dni
FROM alq a JOIN res r
ON r.cr = a.cr; ³ ³ ´ ´
Álgebra Relacional: ∏ res.cr,alq.ca,alq .d ni res ⋈res.cr =alq .cr alq

–. Consulta 7: Obtén los modelos de coche cuya potencia es mayor a la del coche de potencia
200 ordenado por precio.
SQL:
SELECT *
FROM modelos
WHERE po > (SELECT po
FROM modelos
WHERE po = 200)
ORDER BY pr; Ã !
¡ ¢
Álgebra Relacional: ∏ * σp o> ¡
∏po
¡
σpo=
¡ ¢¢¢ Modelos
200 M o delos

*Nota: En álgebra relacional el orden ascendente no se puede resolver.

Captura de las consultas:


SQL> START p02
SQL> SELECT *
2 FROM modelos;
MO PO MA PR
''''''''''''''' '''''''''' '''''''''' ''''''''''
MODELO01 100 MARCA01 10
MODELO02 200 MARCA02 20
MODELO03 300 MARCA03 30
MODELO04 400 MARCA04 40
MODELO05 110 MARCA01 50
MODELO06 202 MARCA02 60
MODELO07 309 MARCA03 70
MODELO08 460 MARCA04 80
8 filas seleccionadas.
SQL>
SQL>
SQL>
SQL> SELECT nomof
2 FROM ofi
3 ORDER BY nomof DESC;
NOMOF
''''''''''''''''''''''''''''''
OFICINA06
OFICINA05
OFICINA04
OFICINA03
OFICINA02
OFICINA01
6 filas seleccionadas.
SQL>
SQL>
SQL> SELECT NM
2 FROM coches
3 WHERE color LIKE '%O' AND km > 0;
NM
'''''''
0003ABC
0008ABC
SQL>
SQL>
SQL> SELECT COUNT (CI)
2 FROM inc
3 WHERE nm LIKE '0001ABC';
COUNT(CI)
''''''''''
2
SQL>
SQL> SELECT r.*
2 FROM res r JOIN cli c
3 ON r.dni = c.dni
4 WHERE r.dni LIKE '12345678F';
CR FECHA_I_R FECHA_F_R PRE DNI CO1 CO2 MO
'''''''''' '''''''''' '''''''''' '''''''''' ''''''''' '''''''''' '''''''''' '''''''''''''''
1 2010'01'01 2010'01'02 50 12345678F 1 2 MODELO05
SQL>
SQL> SELECT r.cr, a.ca, a.dni
2 FROM alq a JOIN res r
3 ON r.cr = a.cr;
CR CA DNI
'''''''''' '''''''''' '''''''''
2 2 12345678B
SQL>
SQL>
SQL> SELECT *
2 FROM modelos
3 WHERE po > (SELECT po
4 FROM modelos
5 WHERE po = 200)
6 ORDER BY pr;
MO PO MA PR
''''''''''''''' '''''''''' '''''''''' ''''''''''
MODELO03 300 MARCA03 30
MODELO04 400 MARCA04 40
MODELO06 202 MARCA02 60
MODELO07 309 MARCA03 70
MODELO08 460 MARCA04 80
SQL> spool off

Potrebbero piacerti anche