Está en la página 1de 15

CASO DE ESTUDIO ALQUILER DE VIDEOS

Diseño de la base de datos

Descripción del problema


Una empresa de alquiler de videos desea informatizar la gestión de los préstamos que realiza dia a día a sus
clientes, con ello busca llevar un adecuado control de la información de videos y préstamos realizados,
ofrecer un mejor servicio a sus clientes, y contar con una base de datos que le permita conocer el estado de
su negocio.

Se ha planteado entonces la necesidad de construir un sistema para el alquiler de videos y con ello construir
una base de datos para almacenar toda la información generada por este proceso.

Requisitos de datos
• Gestión de información de videos disponibles incluidos su género, por cada video además del nombre
debe guardarse la foto de su portada.
• Gestión de los prestamos realizados, llevando el control de a quien se realiza el préstamo, la fecha de
alquiler y la fecha de devolución. Por cada video alquilado se registra un préstamo, es decir si un
mismo cliente solicita 2 videos se registrarían dos préstamos.
• Cada cliente puede alquilar varios videos y un video puede ser alquilado a varios clientes en fechas
distintas.
• Cuando el cliente devuelve un video debe registrarse la fecha de devolución y actualizar su estado de
“Alquilado” a “Devuelto”
• Por cada cliente se requiere conocer sus datos personales y de contacto
• En todo momento se debe poder conocer los videos que están disponibles para alquilar.

Transacciones de datos

Transacción Tipo Freq.


Mensual
1 Administrar Clientes Actualización 20
2 Administrar Videos Actualización 50
3 Registrar alquiler de video Actualización 900
4 Registrar devolución de video Actualización 900
5 Reporte de alquiler de videos por cada mes, ordenados por fecha de alquiler Consulta 60
6 Listar información de videos disponibles incluido el género Consulta 1200
8 Reporte de alquiler de videos por el género más solicitado. Consulta 10
9 Reporte de clientes que más videos han alquilado. Consulta 15
Información inicial de partida
El negocio ya viene operando desde hace 6 meses y por lo tanto ya cuenta con información de inventario y
transacciones registradas en ese tiempo:

• 2000 videos en stock. Donde cada video está asociado en promedio a 3 géneros.
• 200 clientes registrados
• 5000 préstamos realizados

Diseño de la Base de Datos

Diseño Conceptual

Diagrama E-R

Diccionario de datos
Tipo Entidad/Relación Atributo Obligatorio Restricción de Dominio Adicional Valor por defecto
cliente apellido X
cliente nombre X
video genero X
video nombre X
Tres posibles valores:
“D” (disponible),
video estado X “D”
“N” (no disponible),
“B” (dado de baja)
Fecha actual al
alquila fechapre X Debe ser mayor a 1970 momento del
registro
alquila dias X
Tres posibles valores:
“A” (alquilado),
alquila estado X “A”
“V” (vencido),
“D” (devuelto)
Debe ser mayor o igual a fecha de
alquila fechadev
préstamo

Diseño Lógico
Tipo Base de Datos: RELACIONAL

Diagrama relacional (tablas)


Desarrollado con Oracle SQL Developer Data Modeler

* Indica que el campo es obligatorio

Diccionario de datos

Tabla Columna Restricción de Dominio Adicional Valor por defecto


Tres posibles valores:
“D” (disponible),
videos estado “D”
“N” (no disponible),
“B” (dado de baja)
Fecha actual al momento del
prestamos fechapre Debe ser mayor a 1970
registro. Fecha del sistema.
prestamos dias Debe ser mayor a 0
Tres posibles valores:
“A” (alquilado),
prestamos estado “A”
“V” (vencido),
“D” (devuelto)
prestamos fechadev Debe ser mayor o igual a fecha de préstamo

Otras restricciones de Integridad:

Un video obligadamente debe tener asociado al menos un genero.

Diseño físico

SGBD Seleccionado: Oracle 11g

1. Traducción modelo lógico a SGBD


Script DDL inicial
CREATE TABLE clientes
(
cedula CHAR(10) NOT NULL ,
apellido VARCHAR2(50) NOT NULL ,
nombre VARCHAR2(50) NOT NULL,
direccion VARCHAR2(150), telefono
VARCHAR2(15),
CONSTRAINT "clientes_pk" PRIMARY KEY (cedula)
);

CREATE TABLE generos


(
idgenero INTEGER NOT NULL ,
genero VARCHAR2(50) NOT NULL,
CONSTRAINT "generos_pk" PRIMARY KEY (idgenero)
) ;

CREATE TABLE prestamos


(
cedula CHAR(10) NOT NULL ,
idvideo INTEGER NOT NULL, dias
INTEGER NOT NULL,
estado CHAR(1) DEFAULT 'A' NOT NULL,
fechapre DATE DEFAULT sysdate NOT NULL,
fechadev DATE ,
CONSTRAINT "prestamos_pk" PRIMARY KEY (cedula, idvideo)
) ;

CREATE TABLE videos


(
idvideo INTEGER NOT NULL,
nombre VARCHAR2(100) NOT NULL,
foto VARCHAR2(255),
estado CHAR(1) DEFAULT 'D' NOT NULL,
CONSTRAINT "videos_pk" PRIMARY KEY (idvideo)
) ;

CREATE TABLE video_generos


(
idvideo INTEGER NOT NULL,
idgenero INTEGER NOT NULL ,
CONSTRAINT "video_generos_pk" PRIMARY KEY (idvideo, idgenero)
) ;

ALTER TABLE.prestamos ADD CONSTRAINT "prestamos_vid_fk"


FOREIGN KEY (idvideo) REFERENCES videos (idvideo);

ALTER TABLE prestamos ADD CONSTRAINT "prestamos_cli_fk"


FOREIGN KEY (cedula) REFERENCES clientes (cedula);

ALTER TABLE video_generos ADD CONSTRAINT "video_generos_vid_fk"


FOREIGN KEY (idvideo) REFERENCES videos (idvideo);

ALTER TABLE video_generos ADD CONSTRAINT "video_generos_gen_fk"


FOREIGN KEY (idgenero) REFERENCES generos (idgenero);
ALTER TABLE prestamos ADD CONSTRAINT "fechapre_chk"
CHECK (fechapre >= to_date('1970-01-01','yyyy-mm-dd')) ENABLE;

ALTER TABLE prestamos ADD CONSTRAINT "fechadev_chk"


CHECK (fechadev >= fechapre) ENABLE;

ALTER TABLE videos add constraint "estado_video_chk"


CHECK (estado IN ('D','N','B')) ENABLE;

ALTER TABLE prestamos add constraint "estado_prestamo_chk"


CHECK (estado IN ('A','V','D')) ENABLE;
Restricciones de integridad NO implementables mediante DDL en el SGBD seleccionado.

“Un video obligadamente debe tener asociado al menos un género”. Está restricción se la deberá
controlar a nivel de aplicación de usuario final.

2. Organización física de los datos

2.1. Análisis transaccional

TABLAS
Freq.
Transacción
Mensual
clientes prestamos videos video_generos generos

Administrar Clientes 20 CA

Administrar Videos 50 CA CA C

Registrar alquiler de video 900 C CA CA

Registrar devolución de video 900 C CA CA

Reporte de alquiler de videos por


cada mes, ordenados por fecha de 60 C C C
alquiler
Listar información de videos
disponibles incluido el género 1200 C C C

Reporte de alquiler de videos por el


género más solicitado. 10 c c c C

Reporte de clientes que más videos


han alquilado en un mes. 10 c c c

Operaciones de Actualización 20 1800 1850 50

Operaciones de Consulta 1890 1880 3130 1260 1260

Total de Operaciones 1910 3680 4980 1310 1260

Resultado del análisis

Tabla con más accesos


Videos
proyectados
Tablas con más operaciones de
Videos
consulta
Tabla con más operaciones de
Clientes
actualización

2.2. Espacio en disco requerido

Tomando en consideración la estructura de las tablas, la frecuencia de las transacciones del negocio y la carga
de datos inicial que se debe realizar, calcular el espacio en disco requerido proyectado a 5 años. Usted
determine la unidad de medida más apropiada para expresar los cálculos, indicarlo en la tabla.

CALCULO DE ESPACIO EN DISCO PARA LA BASE DE DATOS PROYECTADO A 5 AÑOS

ESPACIO DE TABLAS
Tamaño Crecimiento proyectado a
Carga Inicial Espacio total
aproximado 5 años
Tabla en disco
de cada Espacio en Espacio en
#Registros #Registros (MB)
registro disco(Bytes) disco(Bytes)
GENEROS 54 20 1080 Bytes 0 0 0,00108 MB
VIDEOS 360 2000 720000 3000 1080000 1,8 MB
Bytes Bytes
VIDEO_GENEROS 8 6000 48000 Bytes 1800 14400 Bytes 0,0144 MB
CLIENTES 275 200 55000 Bytes 1200 330000 0,385 MB
Bytes
PRESTAMOS 33 5000 165000 54000 1782000 1,728 MB
Bytes Bytes
Subtotal 3,92848 MB
+ 20% 0,785696
(Reservado para actualizaciones y metadata)
T1 -Total espacio para tablas 4,714176
ESPACIO ADICIONAL

Tamaño Crecimiento proyectado a


Carga Inicial
promedio 5 años Espacio total
Ítem
de cada Espacio en Espacio en en disco(MB)
#Ítems #Ítems
ítem disco disco
Imágenes de la
portada de cada video 200KB 2000 400000 3000 600000 1000

T2 - Total espacio adicional 1000


Total espacio tablas + adicional (T1+T2) 1004,71
+50% 502,35
(Para índices y otros)
TOTAL DE ESPACIO MÍNIMO REQUERIDO PARA LA BASE DE DATOS*
1507,07
* A este espacio se le deberá aumentar el espacio que ocupa el sistema operativo, el software del SGBD y otros
servicios que se vayan a ejecutar en el mismo servidor.

2.3. Organización de los archivos de datos


Con base en el espacio de tablas calculado en el punto anterior, realizar lo siguiente:
• Crear un Tablespace para almacenar las tablas, con las siguientes características:
o Ubicación: C:\BD_ALQUILER_VIDEOS\u01
o Nombre Tablespace: TS_VIDEOS_DAT
o El tablespace tendrá dos datafiles: VIDEOS_DAT_01.DBF y VIDEOS_DAT_02.DBF
• Crear en Oracle un Tablespace para almacenar los índices, con las siguientes características:
o Ubicación: C:\BD_ALQUILER_VIDEOS\u02 o Nombre Tablespace: TS_VIDEOS_IDX
o El tablespace tendrá un datafile: VIDEOS_IDX_01.DBF
o El tamaño de este tablespace debe ser el 40% del tamaño del TS para tablas
• Ir Modificando el Script DDL para que, al crear cada tabla e índice, estos se almacenen en el tablespace
respectivo

TableSpaces

TableSpace Tamaño Datafiles / Tamaño Ubicación Finalidad TS


TS
TS_VIDEOS_DAT 5, 98 G VIDEOS_DAT_01.DBF/ 7.01 G C:\BD_ALQUILER_VIDEOS\u01 Tablas
TS_VIDEOS_IDX 0,97 G VIDEOS_IDX_01.DBF/ 0,97G C:\BD_ALQUILER_VIDEOS\u02

DDL creación de tablespaces

CREATE TABLESPACE TS_VIDEOS_DAT


DATAFILE
'C:\BD_ALQUILER_VIDEOS\u01\VIDEOS_DAT_O1.DBF' SIZE 11.97 G ,
'C:\BD_ALQUILER_VIDEOS\u01\VIDEOS_DAT_02.DBF' SIZE 11.97 G;
CREATE TABLESPACE TS_VIDEOS_IDX
DATAFILE
'C:\BD_ALQUILER_VIDEOS\u02\VIDEOS_IDX_01.DBF' SIZE 1G;

3. Índices

• Identificar los índices secundarios que se deben crear.


• No olvide que asumiremos que tanto llaves primarias como foráneas siempre tendrán índice.
• Incorporar al Script DDL las sentencias DDL que permitirán crear los índices identificados. Y que
almacenen en el tablespace creado para el efecto.
• Para identificar las columnas que se deben indexar recuerde que se buscan aquellas que serán usadas
frecuentemente para filtrar, combinar, ordenar o agrupar consultas.

Índices secundarios para crear

Transacción de negocio Tabla Columna(s) a indexar


Listar información de videos VIDEOS Nombre
disponibles incluido el género
Reporte de alquiler de videos por cada PRESTAMOS Fechapre
mes, ordenados por fecha de alquiler

Reporte de los estados de los préstamos PRESTAMOS Fechapre


de cada cliente
Listar información de videos más GENEROS Genero
alquilados por género.
Reporte de clientes que más videos CLIENTES Apellido
han alquilado por mes.

Script DDL creación de índices

CREATE INDEX videos_idx ON videos.videos (nombre);


CREATE INDEX prestamos_idx ON videos.prestamos (fechapre);
CREATE INDEX generos_idx ON videos.generos (genero);
CREATE INDEX clientes_idx ON videos.clientes (apellido);

4. Vistas de usuario
En el caso de las vistas de usuario asuma que decidimos que, para cada transacción de consulta, la aplicación
accederá a una vista de base de datos con la información requerida. Escriba aquí la sentencia SQL de creación
de cada una de esas vistas.

Vistas
Nombre de la vista Descripción Transacción que la usa
V_Adm_Clientes Mostrar y eliminar información Administrar Clientes
acerca de los clientes
V_Adm_Videos Mostrar y eliminar información Administrar Videos
acerca de los videos
V_Reporte_Alquiler Mostrar los reportes de los Reporte de alquiler de videos
videos alquilados, con fecha de por cada mes, ordenados por
alquiler fecha de alquiler
V_Videos_Disponibles La vista genera el reporte de los Listar información de videos
videos con su género y cuáles disponibles incluido el género
de los videos están disponibles
y los ordena en forma
ascendente
V_Clientes_Mayoritarios Ver que clientes son los que Reporte de información de
alquilan con más frecuencia clientes que más han alquilado
por mes
V_Videos_Solicitados Ver cuáles son los videos más Listar información de videos
solicitados y su genero más alquilados por género.

Script DDL creación de vistas


CREATE ANY VIEW TO "VIDEOS" ;
GRANT DROP ANY VIEW TO "VIDEOS" ;
CREATE VIEW V_VIDEOS_SOLICITADO
(NOMBRES, APELLIDOS, VIDEOS, FECHA_PRESTAMO, GENERO) AS
SELECT c.nombre, c.apellido, v.nombre, pr.fechapre, g.genero FROM
CLIENTES c INNER JOIN PRESTAMOS pr ON pr.cedula = c.cedula
INNER JOIN VIDEOS v ON v.idvideo = pr.idvideo
INNER JOIN VIDEO_GENEROS vg ON vg.idvideo = v.idvideo
INNER JOIN GENEROS g ON g.idgenero = vg.idgenero
ORDER BY pr.fechapre ASC;
CREATE VIEW V_GENEROS_DISPONIBLES
(VIDEO_NOMBRE, ESTADO_VIDEO, GENERO_VIDEO)
AS
SELECT v.nombre, v.estado, g.genero
FROM
VIDEOS v INNER JOIN VIDEO_GENEROS vg ON v.idvideo = vg.idvideo
INNER JOIN GENEROS g ON g.idgenero = vg.idgenero
WHERE v.estado = 'D'
ORDER BY g.genero ASC;
SELECT * FROM videos.V_VIDEOS_SOLICITADO;
SELECT * FROM videos. V_REPORTE_ALQUILER;

5. Mecanismos y restricciones de seguridad


Diga cuales son las medidas que usted propondría se implementen para garantizar la seguridad de la base de
datos en todos sus niveles. Asuma que la tienda de videos requiere una disponibilidad de sus sistemas todos
los días de 07h00 a 22h00, excepto domingos. Y en caso de fallo la tienda podría operar manualmente hasta
por un día.
- Tiene que haber mecanismos de protección que avisen al administrador de la base de datos.
- Utilizar técnicas de cifrado de datos.
- Comprobar la seguridad tanto física como lógica de la base de datos - Revisar contraseñas
vulnerables de los diferentes usuarios.
- Las acciones de los usuarios deben ser monitoreados, de modo que se pueda saber si realizan una
acción incorrecta.

SCRIPT DDL FINAL

Incluir aquí el script DDL completo para la implementación de la base de datos Oracle, donde se incluya la
creación y definición de usuarios, tablespaces, tablas, índices, vistas, etc.
1. CREATE USER videos IDENTIFIED BY videos
2. DEFAULT TABLESPACE "USERS"; 4.
5. --> PERMISOS PARA EL USUARIO
6. GRANT CONNECT, RESOURCE TO videos; 7.
8.
9. CREATE TABLE videos.clientes
10. (
11. cedula CHAR(10) NOT NULL ,
12. apellido VARCHAR2(50) NOT NULL ,
13. nombre VARCHAR2(50) NOT NULL,
14. direccion VARCHAR2(150),
15. telefono VARCHAR2(15),
16. CONSTRAINT "clientes_pk" PRIMARY KEY (cedula)
17. );
18.
19. CREATE TABLE videos.videos
20. (
21. idvideo INTEGER NOT NULL,
22. nombre VARCHAR2(100) NOT NULL,
23. foto VARCHAR2(255),
24. estado CHAR(1) DEFAULT 'D' NOT NULL,
25. CONSTRAINT "videos_pk" PRIMARY KEY (idvideo)
26. ) ; 28.
29.
30. CREATE TABLE videos.generos
31. (
32. idgenero INTEGER NOT NULL ,
33. genero VARCHAR2(50) NOT NULL,
34. CONSTRAINT "generos_pk" PRIMARY KEY (idgenero)
35. );
36.
37.
38. CREATE TABLE videos.video_generos
39. (
40. idvideo INTEGER NOT NULL,
41. idgenero INTEGER NOT NULL ,
42. CONSTRAINT "video_generos_pk" PRIMARY KEY (idvideo, idgenero),
43. CONSTRAINT "video_generos_vid_fk" FOREIGN KEY (idvideo) REFERENCES videos.videos (idvideo),
44. CONSTRAINT "video_generos_gen_fk" FOREIGN KEY (idgenero) REFERENCE S videos.generos
(idgenero) ) ;
45.
46.
47.
48.
49. CREATE TABLE videos.prestamos
50. (
51. cedula CHAR(10) NOT NULL ,
52. idvideo INTEGER NOT NULL,
53. dias INTEGER NOT NULL,
54. estado CHAR(1) DEFAULT 'A' NOT NULL,
55. fechapre DATE DEFAULT SYSDATE NOT NULL,
56. fechadev DATE ,
57. CONSTRAINT "prestamos_pk" PRIMARY KEY (cedula, idvideo),
58. CONSTRAINT "prestamos_vid_fk" FOREIGN KEY (idvideo) REFERENCES videos.videos (idvideo),
59. CONSTRAINT "prestamos_cli_fk" FOREIGN KEY (cedula) REFERENCES videos.clientes (cedula)
60.
61. );
62.
63. ALTER TABLE videos.prestamos ADD CONSTRAINT "fechapre_chk"
64. CHECK (fechapre >= TO_DATE('1970-01-01','yyyy-mm-dd')) ENABLE;
65.
66.
67. ALTER TABLE videos.prestamos ADD CONSTRAINT "fechadev_chk"
68. CHECK (fechadev >= fechapre) ENABLE;
69.
70.
71. ALTER TABLE videos.videos ADD CONSTRAINT "estado_video_chk"
72. CHECK (estado IN ('D','N','B')) ENABLE;
73.
74.
75. ALTER TABLE videos.prestamos ADD CONSTRAINT "estado_prestamo_chk"
76. CHECK (estado IN ('A','V','D')) ENABLE;
77.
78. --> CREACION TABLESPACE
79. CREATE TABLESPACE TS_VIDEOS_DAT
80. DATAFILE
81. 'C:\BD_ALQUILER_VIDEOS\u01\VIDEOS_DAT_O1.DBF' SIZE 11.97 G ,
82. 'C:\BD_ALQUILER_VIDEOS\u01\VIDEOS_DAT_02.DBF' SIZE 11.97 G; 83.
84. CREATE TABLESPACE TS_VIDEOS_IDX
85. DATAFILE
86. 'C:\BD_ALQUILER_VIDEOS\u02\VIDEOS_IDX_01.DBF' SIZE 1G;
87.
88.
89.
90. --> CREACION DE INDICES
91. CREATE INDEX videos_idx ON videos.videos (nombre);
92. CREATE INDEX prestamos_idx ON videos.prestamos (fechapre);
93. CREATE INDEX generos_idx ON videos.generos (genero);
94. CREATE INDEX clientes_idx ON videos.clientes (apellido);
95.
96.
97. --> Privilegios De Vistas Al Usuario Videos
98. GRANT CREATE ANY VIEW TO "VIDEOS" ;
99. GRANT DROP ANY VIEW TO "VIDEOS" ;
100.
101. CREATE VIEW V_VIDEOS_SOLICITADO
102. (NOMBRES, APELLIDOS, VIDEOS, FECHA_PRESTAMO, GENERO)
103. AS
104. SELECT c.nombre, c.apellido, v.nombre, pr.fechapre, g.genero 105. FROM
106. CLIENTES c INNER JOIN PRESTAMOS pr ON pr.cedula = c.cedula
107. INNER JOIN VIDEOS v ON v.idvideo = pr.idvideo
108. INNER JOIN VIDEO_GENEROS vg ON vg.idvideo = v.idvideo
109. INNER JOIN GENEROS g ON g.idgenero = vg.idgenero
110. ORDER BY pr.fechapre ASC;
111.
112. CREATE VIEW V_GENEROS_DISPONIBLES
113. (VIDEO_NOMBRE, ESTADO_VIDEO, GENERO_VIDEO)
114. AS
115. SELECT v.nombre, v.estado, g.genero
116. FROM
117. VIDEOS v INNER JOIN VIDEO_DISPONIBLE vg ON v.idvideo = vg.idvideo
118. INNER JOIN GENEROS g ON g.idgenero = vg.idgenero
119. WHERE v.estado = 'D'
120. ORDER BY g.genero ASC;
121. --> Consultando las vistas creadas
122. SELECT * FROM videos.V_VIDEOS_SOLICITADO;
123. SELECT * FROM videos.V_VIDEO_DISPONIBLES;