Bdatos Libro
Bdatos Libro
Bdatos Libro
Mercedes Marqués
Col·lecció Sapientia, 18
Primera edició, 2011
www.sapientia.uji.es
ISBN: 978-84-693-0146-3
2. Modelo relacional 13
2.1. Modelos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2. Estructura de datos relacional . . . . . . . . . . . . . . . . . . . 16
2.2.1. Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2.2. Propiedades de las relaciones . . . . . . . . . . . . . . . . 19
2.2.3. Tipos de relaciones . . . . . . . . . . . . . . . . . . . . . 20
2.2.4. Claves . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3. Esquema de una base de datos relacional . . . . . . . . . . . . . 22
2.4. Reglas de integridad . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4.1. Nulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4.2. Regla de integridad de entidades . . . . . . . . . . . . . 25
2.4.3. Regla de integridad referencial . . . . . . . . . . . . . . . 26
2.4.4. Reglas de negocio . . . . . . . . . . . . . . . . . . . . . . 28
3. Lenguajes relacionales 29
3.1. Manejo de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2. Álgebra relacional . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3. Cálculo relacional . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.1. Cálculo orientado a tuplas . . . . . . . . . . . . . . . . . 37
3.3.2. Cálculo orientado a dominios . . . . . . . . . . . . . . . 39
3.4. Otros lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4. Lenguaje SQL 41
4.1. Bases de datos relacionales . . . . . . . . . . . . . . . . . . . . . 42
4.2. Descripción de la base de datos . . . . . . . . . . . . . . . . . . 42
4.3. Visión general del lenguaje . . . . . . . . . . . . . . . . . . . . . 44
4.3.1. Creación de tablas . . . . . . . . . . . . . . . . . . . . . 45
iii
iv
vi
Introducción y objetivos
El inicio de un curso sobre bases de datos debe ser, sin duda, la definición
de base de datos y la presentación de los sistemas de gestión de bases de datos
(el software que facilita la creación y manipulación de las mismas por parte
del personal informático). Algunos de estos sistemas, ampliamente utilizados,
son PostgreSQL, MySQL y Oracle.
Ya que este texto está dirigido a estudiantado de las ingenierías informá-
ticas, es interesante conocer qué papeles puede desempeñar el personal infor-
mático en el entorno de una base de datos. Éstas han tenido sus predecesores
en los sistemas de ficheros y tienen por delante un amplio horizonte, por lo
que antes de comenzar su estudio resulta conveniente ubicarse en el tiempo
haciendo un recorrido por su evolución histórica. El capítulo termina con una
exposición sobre las ventajas y desventajas que las bases de datos conllevan.
Al finalizar este capítulo, el estudiantado debe ser capaz de:
10
11
12
Modelo relacional
Introducción y objetivos
En este capítulo se presentan los principios básicos del modelo relacional,
que es el modelo de datos en el que se basan la mayoría de los SGBD en uso
hoy en día. En primer lugar, se presenta la estructura de datos relacional y a
continuación las reglas de integridad que deben cumplirse sobre la misma.
Al finalizar este capítulo, el estudiante debe ser capaz de:
13
14
15
2.2.1. Relaciones
Definiciones informales
El modelo relacional se basa en el concepto matemático de relación, que
gráficamente se representa mediante una tabla. Codd, que era un experto ma-
temático, utilizó una terminología perteneciente a las matemáticas, en concreto
de la teoría de conjuntos y de la lógica de predicados.
Una relación es una tabla con columnas y filas. Un SGBD sólo necesita
que el usuario pueda percibir la base de datos como un conjunto de tablas.
Esta percepción sólo se aplica a la estructura lógica de la base de datos, no se
aplica a la estructura física de la base de datos, que se puede implementar con
distintas estructuras de almacenamiento.
Un atributo es el nombre de una columna de una relación. En el mode-
lo relacional, las relaciones se utilizan para almacenar información sobre los
objetos que se representan en la base de datos. Una relación se representa
gráficamente como una tabla bidimensional en la que las filas corresponden a
registros individuales y las columnas corresponden a los campos o atributos de
esos registros. Los atributos pueden aparecer en la relación en cualquier orden.
Por ejemplo, la información de los clientes de una empresa determinada se
representa mediante la relación CLIENTES de la figura 2.1, que tiene columnas
para los atributos codcli (código del cliente), nombre (nombre y apellidos
del cliente), dirección (calle y número donde se ubica el cliente), codpostal
(código postal correspondiente a la dirección del cliente) y codpue (código de
la población del cliente). La información sobre las poblaciones se representa
16
PUEBLOS
codpue nombre codpro
07766 Burriana 12
12309 Castellón 12
17859 Enramona 12
46332 Soneja 12
53596 Vila-real 12
Figura 2.1: Relaciones que almacenan los datos de los clientes y sus poblaciones.
Figura 2.2: Dominios de los atributos de la relación que almacena los datos de los clientes.
17
Definiciones formales
Una relación R definida sobre un conjunto de dominios D1 , D2 , . . . , Dn
consta de:
Cabecera: conjunto fijo de pares atributo:dominio
18
Los dominios sobre los que se definen los atributos son escalares, por
lo que los valores de los atributos son atómicos. De este modo, en cada
tupla, cada atributo toma un solo valor. Se dice que las relaciones están
normalizadas.
19
Relaciones base. Son relaciones reales que tienen nombre, y forman parte
directa de la base de datos almacenada. Se dice que las relaciones base
son relaciones autónomas.
2.2.4. Claves
Ya que en una relación no hay tuplas repetidas, éstas se pueden distinguir
unas de otras, es decir, se pueden identificar de modo único. La forma de
identificarlas es mediante los valores de sus atributos. Se denomina superclave a
un atributo o conjunto de atributos que identifican de modo único las tuplas de
una relación. Se denomina clave candidata a una superclave en la que ninguno
de sus subconjuntos es una superclave de la relación. El atributo o conjunto
de atributos K de la relación R es una clave candidata para R si, y sólo si,
satisface las siguientes propiedades:
Cuando una clave candidata está formada por más de un atributo, se dice
que es una clave compuesta. Una relación puede tener varias claves candidatas.
Por ejemplo, en la relación PUEBLOS de la figura 2.1, el atributo nombre no
es una clave candidata ya que hay pueblos en España con el mismo nombre
que se encuentran en distintas provincias. Sin embargo, se ha asignado un
código único a cada población, por lo que el atributo codpue sí es una clave
candidata de la relación PUEBLOS. También es una clave candidata de esta
relación la pareja formada por los atributos nombre y codpro, ya que no hay
dos poblaciones en la misma provincia que tengan el mismo nombre.
Para identificar las claves candidatas de una relación no hay que fijarse en
un estado u ocurrencia de la base de datos. El hecho de que en un momento
dado no haya duplicados para un atributo o conjunto de atributos, no garanti-
za que los duplicados no sean posibles. Sin embargo, la presencia de duplicados
20
21
codpue
CLIENTES −→ PUEBLOS : Población del cliente.
codpue
VENDEDORES −→ PUEBLOS : Población del vendedor.
codjefe
VENDEDORES −→ VENDEDORES : Jefe del vendedor.
codpro
PUEBLOS −→ PROVINCIAS : Provincia en la que se encuentra la po-
blación.
codcli
FACTURAS −→ CLIENTES : Cliente al que pertenece la factura.
codven
FACTURAS −→ VENDEDORES : Vendedor que ha realizado la venta.
codfac
LÍNEAS_FAC −→ FACTURAS : Factura en la que se encuentra la línea.
codart
LÍNEAS_FAC −→ ARTÍCULOS : Artículo que se compra en la línea de
factura.
22
VENDEDORES
codven nombre dirección codpostal codpue codjefe
5 Guillén Vilar, Natalia Sant Josep, 110 12597 53596 105
105 Poy Omella, Paloma Sanchis Tarazona, 103-1 12257 46332
155 Rubert Cano, Diego Benicarló Residencial, 154 12425 17859 5
455 Agost Tirado, Jorge Pasaje Peñagolosa, 21-19 12914 53596 5
PUEBLOS
codpue nombre codpro
07766 Burriana 12
12309 Castellón 12
17859 Enramona 12
46332 Soneja 12
53596 Vila-real 12
23
ARTÍCULOS
codart descrip precio stock stock_min dto
IM3P32V Interruptor magnetotérmico 4p, 2 27.01 1 1
im4P10L Interruptor magnetotérmico 4p, 4 32.60 1 1 15
L14340 Bases de fusibles cuchillas T0 0.51 3 3
L17055 Bases de fusible cuchillas T3 7.99 3 3
L76424 Placa 2 E. legrand serie mosaic 2.90 5 2
L85459 Tecla legrand marfil 2.80 0 4
L85546 Tecla difusores legrand bronce 1.05 13 5 5
L92119 Portalámparas 14 curvo 5.98 2 1
ME200 Marco Bjc Ibiza 2 elementos 13.52 1 1
N5072 Pulsador luz piloto Niessen trazo 1.33 11 2
N8017BA Reloj Orbis con reserva de cuerda 3.40 7 4
P605 Caja 1 elem. plastimetal 1.65 16 9
P695 Interruptor rotura brusca 100 A M 13.22 1 1
P924 Interruptor marrón dec. con visor 2.39 8 3
REF1X20 Regleta fluorescente 1x36 bajo F 8.71 1 1
S3165136 Bloque emergencia Satf 150 L 4.81 6 3
T4501 Tubo empotrar 100 2.98 0 5
TE7200 Doble conmutador Bjc Ibiza blanco 13.22 1 1
TFM16 Curva tubo hierro 11 0.33 23 13
TH11 Curva tubo hierro 29 1.42 20 3
THC21 Placa mural Felmax 1.56 1 1
ZNCL Base T,t lateral Ticino S, Tekne 41.71 1 1 10
FACTURAS
codfac fecha codcli codven iva dto
6643 16/07/2010 333 105 18 10
6645 16/07/2010 336 105 0 20
6654 31/07/2010 357 155 8 0
6659 08/08/2010 342 5 0 0
6680 10/09/2010 348 455 8 0
6723 06/11/2010 342 5 18 0
6742 17/12/2010 333 105 8 20
LÍNEAS_FAC
codfac linea cant codart precio dto
6643 1 6 L14340 0.51 20
6643 2 1 N5072 1.33 0
6643 3 2 P695 13.22 0
6645 1 10 ZNCL 41.71 0
6645 2 6 N8017BA 3.40 0
6645 3 3 TE7200 13.22 0
6645 4 4 L92119 5.98 0
6654 1 6 REF1X20 8.71 50
6659 1 8 THC21 1.56 0
6659 2 12 L17055 7.99 25
6659 3 9 L76424 2.90 0
6680 1 12 T4501 2.98 0
6680 2 11 im4P10L 32.60 0
6723 1 5 L85459 2.80 5
6742 1 9 ME200 13.52 0
6742 2 8 S3165136 4.81 5
24
2.4.1. Nulos
Cuando en una tupla un atributo es desconocido, se dice que es nulo. Un
nulo no representa el valor cero ni la cadena vacía ya que éstos son valores
que tienen significado. El nulo implica ausencia de información, bien porque al
insertar la tupla se desconocía el valor del atributo, o bien porque para dicha
tupla el atributo no tiene sentido.
Ya que los nulos no son valores, deben tratarse de modo diferente, lo que
causa problemas de implementación. De hecho, no todos los SGBD relacionales
soportan los nulos.
25
Regla de los nulos: «¿Tiene sentido que la clave ajena acepte nulos?»
26
27
28
Lenguajes relacionales
Introducción y objetivos
La tercera parte de un modelo de datos es la de la manipulación de los
datos. En este capítulo se presentan el álgebra relacional y el cálculo relacional,
definidos por E. F. Codd como la base de los lenguajes relacionales.
Al finalizar este capítulo, el estudiante debe ser capaz de:
Emplear los operadores del álgebra relacional para responder a cualquier
consulta de datos.
29
30
Ejemplo 3.1 Obtener todos los artículos que tienen un precio superior a 10 e.
Resultado:
codart descrip precio stock stock_min dto
IM3P32V Interruptor magnetotérmico 4p, 2 27.01 1 1
im4P10L Interruptor magnetotérmico 4p, 4 32.60 1 1 15
ME200 Marco Bjc Ibiza 2 elementos 13.52 1 1
P695 Interruptor rotura brusca 100 A M 13.22 1 1
TE7200 Doble conmutador Bjc Ibiza blanco 13.22 1 1
ZNCL Base T,t lateral Ticino S, Tekne 41.71 1 1 10
Resultado:
codart descrip precio stock stock_min dto
IM3P32V Interruptor magnetotérmico 4p, 2 27.01 1 1
im4P10L Interruptor magnetotérmico 4p, 4 32.60 1 1 15
L14340 Bases de fusibles cuchillas T0 0.51 3 3
L17055 Bases de fusible cuchillas T3 7.99 3 3
L85459 Tecla Legrand marfil 2.80 0 4
... ... ... ... ...
31
Resultado:
codven nombre codpostal
5 Guillén Vilar, Natalia 12597
105 Poy Omella, Paloma 12257
155 Rubert Cano, Diego 12425
455 Agost Tirado, Jorge 12914
Ejemplo 3.4 Obtener los códigos de las poblaciones donde hay clientes.
Ejemplo 3.5 Obtener los nombres de las poblaciones en las que hay clientes.
32
Unión: R UNION S
La unión de dos relaciones R y S, con P y Q tuplas respectivamente,
es otra relación que tiene como mucho P + Q tuplas siendo éstas las
tuplas que se encuentran en R o en S o en ambas relaciones a la vez.
Para poder realizar esta operación, R y S deben ser compatibles para
la unión.
Se dice que dos relaciones son compatibles para la unión si ambas tienen
la misma cabecera, es decir, si tienen el mismo número de atributos y éstos
se encuentran definidos sobre los mismos dominios en ambas tablas respecti-
vamente. En muchas ocasiones será necesario realizar proyecciones para hacer
que dos relaciones sean compatibles para la unión.
Ejemplo 3.6 Obtener un listado de los códigos de las poblaciones donde hay
clientes o vendedores.
Diferencia: R EXCEPT S
La diferencia obtiene una relación que tiene las tuplas que se encuen-
tran en R y no se encuentran en S. Para realizar esta operación, R y
S deben ser compatibles para la unión.
33
Ejemplo 3.8 Obtener los datos de las poblaciones en las que hay clientes.
Ejemplo 3.9 Obtener un listado de todos los clientes (código y nombre) y las
facturas que se les han realizado. Si no tienen facturas también deben aparecer
en el resultado.
34
Intersección: R INTERSECT S
La intersección obtiene como resultado una relación que contiene
las tuplas de R que también se encuentran en S. Para realizar esta
operación, R y S deben ser compatibles para la unión.
Ejemplo 3.10 Obtener clientes que han realizado compras a todos los vende-
dores.
Los cálculos que se pueden realizar sobre los grupos de filas son: suma
de los valores de un atributo (SUM(ap )), media de los valores de un atributo
(AVG(ap )), máximo y mínimo de los valores de un atributo (MAX(ap ), MIN(ap ))
y número de tuplas en el grupo (COUNT(*)). La relación resultado tendrá tantas
filas como grupos se hayan obtenido.
35
Resultado:
codfac cant_total
6643 9
6645 23
6654 6
6659 29
6680 23
6723 5
6742 17
36
x WHERE F(x)
RANGE OF AX IS ARTÍCULOS
Para expresar la consulta «obtener todas las tuplas AX para las que F(AX) es
cierto», se escribe la siguiente expresión:
AX WHERE F(AX)
donde F es lo que se denomina una fórmula bien formada. Por ejemplo, para
expresar la consulta «obtener los datos de los artículos con un precio superior
a 10e» se puede escribir:
RANGE OF AX IS ARTÍCULOS
AX WHERE AX.precio > 10
AX.precio se refiere al valor del atributo precio para la tupla AX. Para que
se muestren solamente algunos atributos, por ejemplo, codart y descrip, en
lugar de todos los atributos de la relación, se deben especificar éstos en la lista
de objetivos:
RANGE OF AX IS ARTÍCULOS
AX.codart, AX.descrip WHERE AX.precio > 10
Hay dos cuantificadores que se utilizan en las fórmulas bien formadas para
indicar a cuántas instancias se aplica el predicado. El cuantificador existencial
∃ (existe) se utiliza en las fórmulas bien formadas que deben ser ciertas para
al menos una instancia.
37
Ejemplo 3.12 Obtener un listado de los clientes que tienen facturas con des-
cuento.
Esta petición se puede escribir en términos del cálculo: «un cliente debe salir
en el listado si existe alguna tupla en FACTURAS que tenga su código de cliente
y que tenga descuento (dto)».
RANGE OF CX IS CLIENTES
RANGE OF FX IS FACTURAS
CX WHERE ∃FX (FX.codcli = CX.codcli AND FX.dto > 0)
38
39
40
Lenguaje SQL
Introducción y objetivos
Las siglas SQL corresponden a Structured Query Language, un lenguaje
estándar que permite manejar los datos de una base de datos relacional. La
mayor parte de los SGBD relacionales implementan este lenguaje y mediante él
se realizan todo tipo de accesos a la base de datos. En este capítulo se hace una
presentación del lenguaje SQL, haciendo énfasis en la sentencia de consulta de
datos, la sentencia SELECT.
Al finalizar este capítulo, el estudiante debe ser capaz de:
41
42
43
44
[ CONSTRAINT nombre_restricción ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY | CHECK (expr) |
REFERENCES tablaref [ ( columnaref ) ]
[ ON DELETE acción ] [ ON UPDATE acción ] }
[ DEFERRABLE | NOT DEFERRABLE ]
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
y restricción_tabla es:
[ CONSTRAINT nombre_restricción ]
{ UNIQUE ( nombre_columna [, ... ] ) |
PRIMARY KEY ( nombre_columna [, ... ] ) |
CHECK ( expr ) |
FOREIGN KEY ( nombre_columna [, ... ] )
REFERENCES tablaref [ ( columnaref [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL ]
[ ON DELETE acción ] [ ON UPDATE acción ] }
45
Restricción de columna:
REFERENCES tablaref [ ( columnaref ) ]
[ ON DELETE acción ] [ ON UPDATE acción ]
Restricción de tabla:
FOREIGN KEY ( nombre_columna [, ... ] )
REFERENCES tablaref [ ( columnaref [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL ]
[ ON DELETE acción ] [ ON UPDATE acción ]
La restricción de columna REFERENCES permite indicar que la columna
hace referencia a una columna de otra tabla. Si la referencia apunta a
la clave primaria, no es necesario especificar el nombre de la columna a
46
47
SELECT *
FROM facturas;
En primer lugar aparece la palabra SELECT, que indica que se va a realizar una
consulta. A continuación, el * indica que se desea ver el contenido de todas
las columnas de la tabla consultada. El nombre de esta tabla es el que aparece
tras la palabra FROM, en este caso, la tabla facturas.
Esta sentencia es, sin lugar a dudas, la más compleja del lenguaje de manejo
de datos y es por ello que gran parte de este capítulo se centra en su estudio.
48
49
SELECT *
FROM clientes
ORDER BY codpostal DESC, nombre;
4.4.2. Nulos
Cuando no se ha insertado un valor en una columna de una fila se dice que
ésta es nula. Un nulo no es un valor: un nulo implica ausencia de valor. Para
saber si una columna es nula se debe utilizar el operador de comparación IS
NULL y para saber si no es nula, el operador es IS NOT NULL.
Cuando se realiza una consulta de datos, los nulos se pueden interpretar
como valores mediante la función COALESCE(columna, valor_si_nulo). Esta
función devuelve valor_si_nulo en las filas donde columna es nula; si no,
devuelve el valor de columna.
50
DATE: Fecha formada por día, mes y año. Para guardar fecha y hora se
debe utilizar el tipo TIMESTAMP.
Hay que tener siempre en cuenta que el nulo no es un valor, sino que implica
ausencia de valor. El nulo se representa mediante NULL y cuando se imprime
no se muestra nada.
51
52
53
54
Conversiones fecha/hora:
HH Hora del día (1:12).
HH12 Hora del día (1:12).
HH24 Hora del día (1:24).
MI Minuto (00:59).
SS Segundo (00:59).
YYYY Año.
YYY Últimos tres dígitos del año.
YY Últimos dos dígitos del año.
Y Último dígito del año.
MONTH Nombre del mes.
MON Nombre del mes abreviado.
DAY Nombre del día.
DY Nombre del día abreviado.
DDD Número del día dentro del año (001:366).
DD Número del día dentro del mes (01:31).
D Número del día dentro de la semana (1:7 empezando en domingo).
WW Número de la semana en el año (1:53).
W Número de la semana en el mes (1:5).
Q Número del trimestre (1:4).
1
En PostgreSQL se puede escoger el modo de visualizar las fechas mediante SET
DATESTYLE. Para visualizar las fechas con formato día/mes/año se debe ejecutar la orden
SET DATESTYLE TO EUROPEAN, SQL;
55
56
57
4.5.9. Ejemplos
Ejemplo 4.1 Se quiere obtener un listado con el código y la fecha de las fac-
turas del año pasado que pertenecen a clientes cuyo código está entre el 50 y
el 80. El resultado debe aparecer ordenado por la fecha, descendentemente.
58
Ejemplo 4.3 Se quiere obtener un listado con los códigos de los vendedores
que han hecho ventas al cliente cuyo código es el 54.
59
60
61
62
4.6.4. Ejemplos
Ejemplo 4.4 Se quiere obtener el importe medio por factura, sin tener en
cuenta los descuentos ni el IVA.
El importe medio por factura se calcula obteniendo primero la suma del impor-
te de todas las facturas y dividiendo después el resultado entre el número total
de facturas. La suma del importe de todas las facturas se obtiene sumando
el importe de todas las líneas de factura. El importe de cada línea se calcu-
la multiplicando el número de unidades pedidas (cant) por el precio unitario
(precio).
Por lo tanto, la solución a este ejercicio es la siguiente:
SELECT ROUND(SUM(cant*precio)/COUNT(DISTINCT codfac),2)
AS importe_medio
FROM lineas_fac;
63
Ejemplo 4.5 Se quiere obtener la fecha de la primera factura del cliente cuyo
código es el 210, la fecha de su última factura (la más reciente) y el número
de días que han pasado entre ambas facturas.
Ejemplo 4.6 Se quiere obtener un listado con los clientes que tienen más de
cinco facturas con 18 % de IVA, indicando cuántas de ellas tiene cada uno.
Para resolver este ejercicio se deben tomar las facturas (tabla FACTURAS) y
seleccionar aquellas con 18 % de IVA (WHERE). A continuación, se debe agru-
par las facturas (GROUP BY) de manera que haya un grupo para cada cliente
(columna codcli). Una vez formados los grupos, se deben seleccionar aquellos
que contengan más de cinco facturas (HAVING). Por último, se debe mostrar
(SELECT) el código de cada cliente y su número de facturas.
SELECT codcli, COUNT(*) AS facturas
FROM facturas
WHERE iva = 18
GROUP BY codcli
HAVING COUNT(*) > 5;
Ejemplo 4.7 Se quiere obtener un listado con el número de facturas que hay
en cada año, de modo que aparezca primero el año con más facturas. Además,
para cada año se debe mostrar el número de clientes que han hecho compras y
en cuántos días del año se han realizado éstas.
64
Ejemplo 4.8 De los clientes cuyo código está entre el 240 y el 250, mostrar
el número de facturas que cada uno tiene con cada IVA distinto.
65
4.7. Subconsultas
Una subconsulta es una sentencia SELECT anidada en otra sentencia SQL,
que puede ser otra SELECT o bien cualquier sentencia de manejo de datos
(INSERT, UPDATE, DELETE). Las subconsultas pueden anidarse unas dentro de
otras tanto como sea necesario (cada SGBD puede tener un nivel máximo de
anidamiento, que difícilmente se alcanzará). En este apartado se muestra cómo
el uso de subconsultas en las cláusulas WHERE y HAVING otorga mayor potencia
para la realización de restricciones. Además, en este apartado se introduce el
uso de subconsultas en la cláusula FROM.
66
67
expresión IN ( subconsulta )
El operador IN ya ha sido utilizado anteriormente, especificando una lista
de valores entre paréntesis. Otro modo de especificar esta lista de valores
es incluyendo una subconsulta que devuelva una sola columna. En este
caso, el predicado se evalúa a verdadero si el resultado de la expresión es
igual a alguno de los valores de la columna devuelta por la subconsulta.
El predicado se evalúa a falso si no se encuentra ningún valor en la
subconsulta que sea igual a la expresión; cuando la subconsulta no
devuelve ninguna fila, también se evalúa a falso.
Si el resultado de la expresión es un nulo, o ninguno de los valores de la
subconsulta es igual a la expresión y la subconsulta ha devuelto algún
nulo, el predicado se evalúa a nulo.
68
69
70
71
SELECT codpue
FROM clientes
GROUP BY codpue
HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
FROM clientes
GROUP BY codpue );
72
4.7.4. Ejemplos
Ejemplo 4.9 Se quiere obtener los datos completos del cliente al que pertenece
la factura 5886.
Para dar la respuesta podemos hacerlo en dos pasos, es decir, con dos consultas
separadas:
SELECT codcli FROM facturas WHERE codfac = 5886;
codcli
--------
264
SELECT *
FROM clientes
WHERE codcli = 264;
73
SELECT *
FROM clientes
WHERE codcli = ( SELECT codcli
FROM facturas WHERE codfac = 5886 );
Ejemplo 4.10 Se quiere obtener los datos completos de los clientes que tienen
facturas en agosto del año pasado. El resultado se debe mostrar ordenado por
el nombre del cliente.
codcli
--------
105
12
.
.
.
342
309
357
SELECT *
FROM clientes
WHERE codcli IN (105,12,...,342,309,357);
74
SELECT *
FROM clientes
WHERE codcli IN ( SELECT codcli FROM facturas
WHERE EXTRACT(month FROM fecha)=8
AND EXTRACT(year FROM fecha) =
EXTRACT(year FROM CURRENT_DATE)-1 )
ORDER BY nombre;
75
SELECT *
FROM facturas NATURAL JOIN clientes;
Esta sentencia muestra los datos de los clientes que tienen facturas. Puesto
que se ha hecho la concatenación, si hay clientes que no tienen facturas, no se
obtienen en el resultado ya que no tienen ninguna factura con la que concate-
narse.
A continuación, se desea modificar la sentencia anterior para que se obtenga
también el nombre de la población del cliente. Se puede pensar que el nombre
de la población se puede mostrar tras hacer una concatenación natural con la
76
SELECT *
FROM facturas NATURAL JOIN clientes NATURAL JOIN pueblos;
Se obtendrán las facturas de los clientes cuyo nombre completo coincide con
el nombre de su pueblo, cosa poco probable que suceda.
Cuando se quiere concatenar varias tablas que tienen varios nombres de
columnas en común y no todos han de utilizarse para realizar la concatenación,
se puede disponer de la operación INNER JOIN, que permite especificar las
columnas sobre las que hacer la operación mediante la cláusula USING.
77
ARTICULOS VENDEDORES
78
De todas las facturas que hay en dicho mes, aparecen en el resultado sólo algu-
nas. Esto es debido a que las columnas FACTURAS.codcli y FACTURAS.codven
aceptan nulos. Las facturas con algún nulo en alguna de estas columnas son
las que no aparecen en el resultado.
Para evitar estos problemas, se puede hacer uso de la operación OUTER
JOIN con tres variantes: LEFT, RIGHT, FULL. Con LEFT/RIGHT OUTER JOIN,
en el resultado se muestran todas las filas de la tabla de la izquierda/derecha;
aquellas que no tienen nulos en la columna de concatenación, se concatenan
con las filas de la otra tabla mediante INNER JOIN. Las filas de la tabla de la
izquierda/derecha que tienen nulos en la columna de concatenación aparecen
en el resultado concatenadas con una fila de nulos. Con FULL OUTER JOIN se
hacen ambas operaciones: LEFT OUTER JOIN y RIGHT OUTER JOIN.
Teniendo en cuenta que, tanto FACTURAS.codcli como FACTURAS.codven
aceptan nulos, el modo correcto de realizar la consulta en este último ejemplo
será:
79
SELECT *
FROM facturas, clientes;
La sentencia anterior combina todas las filas de la tabla facturas con todas las
filas de la tabla clientes. Si la primera tiene n filas y la segunda tiene m filas,
el resultado tendrá n × m filas.
Para hacer la concatenación de cada factura con el cliente que la ha soli-
citado, se debe hacer una restricción: de las n × m filas hay que seleccionar
aquellas en las que coinciden los valores de las columnas codcli.
SELECT *
FROM facturas, clientes
WHERE facturas.codcli = clientes.codcli;
La siguiente consulta, que utiliza el formato original para realizar las conca-
tenaciones. Obtiene los datos de las facturas con 18 % de IVA y sin descuento,
con el nombre del cliente:
80
4.8.3. Ejemplos
Ejemplo 4.11 Obtener los datos completos del cliente al que pertenece la fac-
tura 5886.
SELECT *
FROM clientes
WHERE codcli = ( SELECT codcli
FROM facturas WHERE codfac = 5886 );
SELECT c.*
FROM facturas f JOIN clientes c USING (codcli)
WHERE f.codfac = 5886;
81
Nótese que ambas concatenaciones deben hacerse mediante ON: la primera por-
que las columnas de concatenación no tienen el mismo nombre, la segunda
porque al concatenar con PUEBLOS hay dos columnas codpue en la tabla de la
izquierda: v.codpue y j.codven.
82
83
84
85
4.9.5. Ejemplos
Ejemplo 4.14 Obtener los datos de las poblaciones donde hay vendedores y
no hay clientes.
SELECT *
FROM ( SELECT codpue FROM vendedores
EXCEPT
SELECT codpue FROM clientes ) AS t
JOIN pueblos USING (codpue)
JOIN provincias USING (codpro);
Ejemplo 4.15 ¿Cuántos clientes hay que entre todas sus facturas no tienen
ninguna con 18 % de IVA?
La siguiente solución utiliza el operador NOT IN. Nótese que es preciso tener
en cuenta dos restricciones: la primera es que en la subconsulta del NOT IN se
debe evitar los nulos, y la segunda es que hay que asegurarse de que los clientes
seleccionados hayan realizado alguna compra (deben tener alguna factura).
86
87
SELECT *
FROM facturas AS f
WHERE 0 < ( SELECT MIN(COALESCE(l.dto,0))
FROM lineas_fac AS l
WHERE l.codfac = f.codfac );
EXISTS ( subconsulta )
La subconsulta se evalúa para determinar si devuelve o no alguna fila. Si
devuelve al menos una fila, se evalúa a verdadero. Si no devuelve ninguna
fila, se evalúa a falso. La subconsulta puede tener referencias externas,
que actuarán como constantes durante la evaluación de la subconsulta.
En la ejecución de la subconsulta, en cuanto se devuelve la primera fila,
se devuelve verdadero, sin terminar de obtener el resto de las filas.
Puesto que el resultado de la subconsulta carece de interés (sólo importa
si se devuelve o no alguna fila), se suelen escribir las consultas indicando
una constante en la cláusula SELECT en lugar de * o cualquier columna:
88
SELECT *
FROM facturas JOIN
( SELECT codfac
FROM lineas_fac
GROUP BY codfac
HAVING MIN(COALESCE(dto,0))>0 ) AS lf
USING (codfac);
89
SELECT *
FROM facturas
WHERE codfac IN ( SELECT codfac
FROM lineas_fac
GROUP BY codfac
HAVING MIN(COALESCE(dto,0))>0 );
4.10.4. Ejemplos
Ejemplo 4.16 ¿Cuántos clientes hay que en todas sus facturas han pagado
18 % de IVA?
La siguiente versión utiliza NOT IN, aunque ya se sabe que puede dar problemas
cuando hay nulos:
90
Ejemplo 4.18 Para proponer ofertas especiales a los buenos clientes, se ne-
cesita un listado con los datos de aquellos que en los últimos quince meses (los
últimos 450 días) han hecho siempre facturas por un importe superior a 400
e.
91
Nótese que con NOT EXISTS el predicado sobre el importe de las facturas es el
único que debe aparecer negado.
92
93
Metodología de diseño
de bases de datos
Introducción y objetivos
Una vez estudiado el modelo relacional de bases de datos, abordamos en
esta segunda parte su diseño. El diseño de una base de datos debe realizarse
siguiendo una metodología que garantice que se tienen en cuenta todos los
requisitos de información y funcionales de la futura aplicación informática
que la utilizará. En este capítulo se revisa el ciclo de vida de los sistemas
de información ya que el diseño de la base de datos es una de sus etapas. A
continuación se introduce brevemente la metodología de diseño que se abordará
en detalle en los tres capítulos que siguen a éste.
Al finalizar este capítulo, el estudiante debe ser capaz de:
94
95
La base de datos.
El SGBD.
96
6. Diseño de la aplicación.
7. Prototipado.
8. Implementación.
10. Prueba.
11. Mantenimiento.
97
98
99
5.2.8. Implementación
En esta etapa se crean las definiciones de la base de datos a nivel conceptual,
externo e interno, así como los programas de aplicación. La implementación de
la base de datos se realiza mediante las sentencias del lenguaje de definición de
datos del SGBD escogido. Estas sentencias se utilizan para crear el esquema
físico de la base de datos, los ficheros en donde se almacenarán los datos de la
base de datos y las vistas de los usuarios.
Los programas de aplicación se implementan utilizando lenguajes de terce-
ra o cuarta generación. Partes de estas aplicaciones son transacciones sobre la
base de datos, que se implementan mediante el lenguaje de manejo de datos
del SGBD. Las sentencias de este lenguaje se pueden embeber en un lenguaje
de programación anfitrión como Visual Basic, Delphi, C, C++ o Java, entre
otros. En esta etapa también se implementan los menús, los formularios para
la introducción de datos y los informes de visualización de datos. Para ello, el
SGBD puede disponer de lenguajes de cuarta generación que permiten el desa-
rrollo rápido de aplicaciones mediante lenguajes de consultas no procedurales,
generadores de informes, generadores de formularios, generadores de gráficos
y generadores de aplicaciones.
En esta etapa también se implementan todos los controles de seguridad
e integridad. Algunos de estos controles se pueden implementar mediante el
lenguaje de definición de datos y otros puede que haya que implementarlos
mediante utilidades del SGBD o mediante los programas de aplicación.
100
5.2.10. Prueba
En esta etapa se prueba y valida el sistema con los requisitos especificados
por los usuarios. Para ello, se debe diseñar una batería de test con datos reales,
que se deben llevar a cabo de manera metódica y rigurosa. Es importante darse
cuenta de que la fase de prueba no sirve para demostrar que no hay fallos,
sirve para encontrarlos. Si la fase de prueba se lleva a cabo correctamente,
descubrirá los errores en los programas de aplicación y en la estructura de la
base de datos. Además, demostrará que los programas parecen trabajar tal y
como se especificaba en los requisitos y que las prestaciones deseadas parecen
obtenerse. Por último, en las pruebas se podrá hacer una medida de la fiabilidad
y la calidad del software desarrollado.
5.2.11. Mantenimiento
Una vez que el sistema está completamente implementado y probado, se
pone en marcha. Se dice que el sistema está ahora en la fase de mantenimiento,
en la que se llevan a cabo las siguientes tareas:
101
102
103
104
105
Diseño conceptual
Introducción y objetivos
El primer paso en el diseño de una base de datos es la producción del es-
quema conceptual. En este capítulo se presenta una metodología para producir
estos esquemas, denominada entidad-relación.
Al finalizar este capítulo, el estudiante debe ser capaz de:
106
Simplicidad : deben ser simples para que los esquemas sean fáciles de
entender.
entidad relación
atributo identificador
atributo compuesto
jerarquía de generalización
107
6.1.1. Entidades
En primer lugar, hay que definir los principales conceptos que interesan al
usuario. Estos conceptos serán las entidades. Una forma de identificar las enti-
dades es examinar las especificaciones de requisitos de usuario. En estas espe-
cificaciones se buscan los nombres o los sintagmas nominales que se mencionan
(por ejemplo: código del cliente, nombre del cliente, número de la factura, fecha
de la factura, IVA de la factura). También se buscan conceptos importantes
como personas, lugares o conceptos abstractos, excluyendo aquellos nombres
que sólo son propiedades de otros objetos. Por ejemplo, se pueden agrupar el
código del cliente y el nombre del cliente en una entidad denominada cliente,
y agrupar el número de la factura, la fecha de la factura y el IVA de la factura
en otra entidad denominada factura.
Otra forma de identificar las entidades es buscar aquellos conceptos que
existen por sí mismos. Por ejemplo, vendedor es una entidad porque los ven-
dedores existen, sepamos o no sus nombres, direcciones y teléfonos. Siempre
que sea posible, el usuario debe colaborar en la identificación de las entidades.
A veces, es difícil identificar las entidades por la forma en que aparecen
en las especificaciones de requisitos. Los usuarios, a veces, hablan utilizando
ejemplos o analogías. En lugar de hablar de vendedores en general, hablan de
personas concretas, o bien, hablan de los puestos que ocupan esas personas.
Para complicarlo aún más, los usuarios usan, muchas veces, sinónimos y
homónimos. Dos palabras son sinónimos cuando tienen el mismo significado.
Los homónimos ocurren cuando la misma palabra puede tener distintos signi-
ficados dependiendo del contexto.
No siempre es obvio saber si un concepto es una entidad, una relación o un
atributo. El análisis es subjetivo, por lo que distintos diseñadores pueden hacer
distintas interpretaciones, aunque todas igualmente válidas. Todo depende de
la opinión y la experiencia de cada uno. Los diseñadores de bases de datos
108
6.1.2. Relaciones
Una vez definidas las entidades, se debe definir las relaciones existentes
entre ellas. Del mismo modo que para identificar las entidades se buscaban
nombres en las especificaciones de requisitos, para identificar las relaciones se
suelen buscar las expresiones verbales. Por ejemplo: ciudad donde ha nacido
el estudiante y ciudades en que ha residido; cada director tiene a su cargo a
un conjunto de empleados. Si las especificaciones de requisitos reflejan estas
relaciones es porque son importantes para la empresa y, por lo tanto, se deben
reflejar en el esquema conceptual. La mayoría de las relaciones son binarias (en-
tre dos entidades), pero también puede haber relaciones en las que participen
más de dos entidades, así como relaciones recursivas.
Es muy importante repasar las especificaciones para comprobar que todas
las relaciones, explícitas o implícitas, se han encontrado. Si se tienen pocas
109
dirige a (0,n)
(1,n) (0,n)
residido
nacido
(1,1) (0,n)
es dirigido por (1,1)
obligatoria opcional
(a) (b)
110
6.1.3. Atributos
El siguiente paso consiste en identificar los atributos y asociarlos con las en-
tidades y las relaciones en función de su significado. Al igual que ha procedido
con las entidades, para identificar los atributos se buscan nombres en las especi-
ficaciones de requisitos. Son atributos los nombres que identifican propiedades,
cualidades, identificadores o características de entidades o de relaciones.
Lo más sencillo es preguntarse, para cada entidad y cada relación, qué
información se quiere saber de ellas. La respuesta a esta pregunta se debe en-
contrar en las especificaciones de requisitos. Pero, en ocasiones, será necesario
preguntar a los usuarios para que aclaren los requisitos. Desgraciadamente, los
usuarios pueden dar respuestas a esta pregunta que también contengan otros
conceptos, por lo que hay que considerar sus respuestas con mucho cuidado.
Al identificar los atributos, hay que tener en cuenta si son simples o com-
puestos. Por ejemplo, el atributo dirección puede ser simple, teniendo la direc-
ción completa como un solo valor: ‘San Rafael 45, Almazora’; o puede ser un
atributo compuesto, formado por la calle (‘San Rafael’), el número (‘45’) y la
población (‘Almazora’). El escoger entre atributo simple o compuesto depende
de los requisitos del usuario. Si el usuario no necesita acceder a cada uno de
los componentes de la dirección por separado, se puede representar como un
atributo simple. Pero si el usuario quiere acceder a los componentes de forma
individual, entonces se debe representar como un atributo compuesto.
En el esquema conceptual se debe reflejar la cardinalidad mínima y máxima
de cada atributo, ya sea simple o compuesto. La cardinalidad mínima indica si
el atributo es opcional (se expresa con 0) o si es obligatorio (se expresa con 1).
La cardinalidad máxima indica si el atributo tiene, como mucho, un solo valor
(se indica con 1) o si puede tener varios valores, es decir, si es multievaluado (se
indica con n). Puesto que el valor más usual en la cardinalidad de los atributos
es «(1,1)» (tienen un valor y sólo uno), ésta se omite para estos casos, siendo
el valor por defecto.
En esta fase también se debe identificar los atributos derivados o calculados,
que son aquellos cuyo valor se puede calcular a partir de los valores de otros
atributos. Por ejemplo, el número de estudiantes matriculados, la edad de los
estudiantes o el número de ciudades en que residen los estudiantes. Algunos
diseñadores no representan los atributos derivados en los esquemas conceptua-
les. Si se hace, se debe indicar claramente que el atributo es derivado y a partir
de qué atributos se obtiene su valor. El momento en que hay que considerar
los atributos derivados es en el diseño físico.
Cuando se están identificando los atributos, se puede descubrir alguna en-
tidad que no se ha identificado previamente, por lo que hay que volver al
111
112
(1,n) (0,n)
residido
nombre nombre
(0,1)
DNI ESTUDIANTE CIUDAD altitud
carrera habitantes
nacido
(0,1) (0,n)
fecha nacimiento
ciudad
lugar residencia
(1,n)
nombre fecha inicio
DNI EMPLEADO
título (0,n) ciudad
(0,1)
lugar nacimiento
fecha
113
6.1.5. Identificadores
Cada entidad tiene al menos un identificador. En este paso, se trata de
encontrar todos los identificadores de cada una de las entidades. Los identifi-
cadores pueden ser simples o compuestos. De cada entidad se escogerá uno de
los identificadores como clave primaria en la fase del diseño lógico. Todos los
identificadores de las entidades se deben anotar en el diccionario de datos.
Cuando se determinan los identificadores es fácil darse cuenta de si una en-
tidad es fuerte o débil. Si una entidad tiene al menos un identificador, es fuerte
(otras denominaciones son padre, propietaria o dominante). Si una entidad no
tiene atributos que le sirvan de identificador, es débil (otras denominaciones
son hijo, dependiente o subordinada).
114
(1,n) (0,n)
residido
nombre nombre
(0,1)
DNI ESTUDIANTE CIUDAD altitud
carrera habitantes
nacido
(0,1) (0,n)
fecha nacimiento
La figura 6.8 muestra una jerarquía que clasifica las pólizas de una compañía
de seguros. Todas ellas tienen un número que las identifica, una fecha de inicio
115
número
fecha_ini PÓLIZA
fecha_fin
(1,1)
DNI fecha_nacim
nombre
116
O
E CT
PROFESOR RR ASIGNATURA
CO
IN
O
ECT
RR
CO en
IN
SEMESTRE
TO
fecha REC
C OR
IN
117
ESTUDIANTE
O nombre
E CT
RR apellidos
CO fecha_nacim
IN
domicilio
Figura 6.12: No es correcto usar una misma línea para los atributos.
118
Figura 6.14: No es correcto usar los atributos compuestos para expresar rangos de
valores.
Figura 6.15: No es correcto colorear los atributos simples que forman un identificador
compuesto.
119
Figura 6.17: No es correcto colorear los atributos simples que forman parte de un
identificador compuesto.
6.3. Ejemplos
Ejemplo 6.8 Asociación de cines.
120
título
director
(1,n) (1,n)
pasa PELÍCULA protagonista
CINE (1,3)
(1,n) (0,n) género
(1,n)
nombre clasificación
calle tarifa hora
número
teléfono precio tipo
121
«Se desea incorporar un catálogo a un portal web y como primer paso, en este
ejercicio se va a obtener el esquema conceptual de la base de datos que le dará
soporte.
El catálogo se va a organizar como una lista jerárquica de temas. Cada tema
final de la jerarquía tendrá un conjunto de enlaces a páginas web recomendadas.
Por ejemplo, un tema podría ser PostgreSQL. Dentro de la jerarquía, éste
podría ser un subtema (hijo) del tema Sistemas de gestión de bases de
datos. El tema MySQL podría ser otro subtema de este último.
De cada tema final hay varias páginas web recomendadas. En el tema
PostgreSQL una página podría ser www.postgresql.org y otra página po-
dría ser la web donde están colgados estos apuntes. De cada página se guarda
la URL y el título.
Para cada página se almacena una prioridad en cada tema en que se reco-
mienda. Esta prioridad sirve para ordenarlas al mostrar los resultados de las
búsquedas en el catálogo de temas. Por ejemplo, la página www.postgresql.org
tendría una prioridad mayor que la de los apuntes que tienes en tus manos.
Cada tema tiene una serie de palabras clave asociadas, cada una con un
número que permite ordenarlas según su importancia dentro del tema. Por
ejemplo, el tema PostgreSQL podría tener las palabras clave (1) relacional,
(2) multiusuario y (3) libre.
También se quiere guardar información sobre las consultas que se han rea-
lizado sobre cada tema del catálogo. Cada vez que se consulte un tema se
guardará la IP de la máquina desde la que se ha accedido y la fecha y hora de
la consulta.
Algunas páginas web son evaluadas por voluntarios. La calificación que
otorgan es: **** , ***, ** o *. Se debe almacenar información sobre los vo-
luntarios (nombre y correo electrónico) y las evaluaciones que han hecho de
cada página (calificación y fecha en que se ha valorado). Una misma página
puede ser evaluada por distintos voluntarios y, ya que las páginas van cam-
biando su estructura y contenidos, pueden ser valoradas en más de una ocasión
por un mismo voluntario. En el caso de repetir una evaluación de una misma
página por un mismo voluntario, sólo interesa almacenar la última evaluación
realizada (la más reciente).»
A partir de estos requisitos, se ha obtenido el esquema conceptual de la
figura 6.19.
Se han identificado tres entidades: los temas del catálogo, las páginas web
a las que apuntan los temas y los voluntarios que califican las páginas. Se han
considerado atributos del tema su nombre, las palabras clave con su impor-
tancia (atributo compuesto con múltiples valores) y las consultas que se van
realizando (IP e instante de tiempo).
La jerarquía de temas del catálogo se ha representado mediante una relación
de la entidad de los temas consigo misma, de manera que algunas ocurrencias
122
(1,n) (0,n)
URL título email nombre
palabras consultas
123
124
Introducción y objetivos
Una vez realizado el diseño conceptual, y obtenido el esquema correspon-
diente mediante un diagrama entidad-relación, se debe proceder con la etapa
del diseño lógico. En esta etapa se debe decidir el modelo lógico de base de
datos que se va a utilizar para llevar a cabo la implementación. Puesto que el
modelo relacional es el modelo lógico de bases de datos más extendido, en este
capítulo se presenta la metodología de diseño para este modelo.
Al finalizar este capítulo, el estudiante debe ser capaz de:
Obtener un conjunto de tablas a partir de un esquema conceptual (ex-
presado mediante un diagrama entidad-relación) y de las especificaciones
adicionales expresadas en el diccionario de datos.
Establecer para cada tabla: la clave primaria, las claves alternativas, las
claves ajenas y las reglas de integridad para las mismas.
125
126
Especificar las restricciones a nivel de fila de cada tabla, si las hay. Estas
restricciones son aquellas que involucran a una o varias columnas dentro
de una misma fila.
Especificar las reglas de negocio, que serán aquellas acciones que se deba
llevar a cabo de forma automática como consecuencia de actualizaciones
que se realicen sobre la base de datos.
127
ISBN
(1,n) editorial
edición LIBRO
(1,n)
autor
número año idioma
título
128
129
(a) Incluir en una de las tablas (sólo en una de ellas) una clave ajena a la
otra tabla. Esta clave ajena será, a su vez, una clave alternativa, ya que
cada ocurrencia de un lado sólo puede relacionarse con una ocurrencia
del otro lado y viceversa. Además, se deben incluir en la misma tabla los
atributos de la relación.
La clave ajena aceptará nulos o no, en función de la cardinalidad mínima
con la que participe la entidad correspondiente en la relación: si es 0, la
participación es opcional por lo que debe aceptar nulos; si es 1, la parti-
cipación es obligatoria y no debe aceptarlos. Los atributos de la relación
que se han incluido en la tabla sólo aceptarán nulos si son opcionales, o
bien, cuando la clave ajena deba aceptar nulos (participación opcional).
130
fecha_inicio
matrícula modelo codemp nombre
EMPLEADO(codemp, nombre)
VEHÍCULO(matrícula, modelo, codemp, fecha_inicio)
VEHÍCULO.codemp es una clave ajena a EMPLEADO, no acepta
nulos
VEHÍCULO.codemp es también una clave alternativa
(a.2) Aunque la entidad de los vehículos es la entidad hija, al ser una relación
uno a uno, también es posible incluir la relación en la entidad de los
131
VEHÍCULO(matrícula, modelo)
EMPLEADO(codemp, nombre, matrícula, fecha_inicio)
EMPLEADO.matrícula es una clave ajena a VEHÍCULO, acep-
ta nulos
EMPLEADO.matrícula es también una clave alternativa
EMPLEADO.matrícula, EMPLEADO.fecha_inicio son ambas nu-
las o no nulas a la vez
EMPLEADO(codemp, nombre)
VEHÍCULO(matrícula, modelo)
CONDUCE(matrícula, codemp, fecha_inicio)
CONDUCE.matrícula es una clave ajena a VEHÍCULO, no acep-
ta nulos
CONDUCE.codemp es una clave ajena a EMPLEADO, no acepta
nulos
CONDUCE.codemp es también una clave alternativa
Nótese que ninguna de las claves ajenas acepta nulos, aún habiendo una
entidad que participa de manera opcional. Esto es así porque la tabla
CONDUCE almacena ocurrencias de una relación, no de una entidad: si la
relación no se da para algún empleado, éste no aparece en la tabla.
Escoger una u otra opción para representar cada relación uno a uno dependerá,
en gran medida, de cómo se va a acceder a las tablas y del número de ocurren-
cias de las entidades que van a participar en la relación. Se tratará siempre de
favorecer los accesos más frecuentes y que requieran un tiempo de respuesta
menor.
Por ejemplo, en el esquema (a.1) dar de alta un vehículo conlleva ejecutar
una sola sentencia INSERT en la tabla VEHÍCULO, mientras que hacerlo en los
esquemas (a.2) y (b) conlleva ejecutar dos sentencias (un INSERT y un UPDATE,
132
(a) Incluir en la tabla hija (aquella cuya entidad participa con cardinalidad
máxima 1) una clave ajena a la tabla madre, junto con los atributos de
la relación. La clave ajena aceptará nulos o no, en función de la cardina-
lidad mínima con la que participe la entidad hija en la relación: si es 0, la
participación es opcional por lo que debe aceptar nulos; si es 1, la parti-
cipación es obligatoria y no debe aceptarlos. Los atributos de la relación
que se han incluido en la tabla sólo aceptarán nulos si son opcionales, o
bien cuando la clave ajena deba aceptar nulos (participación opcional).
(b) Crear una nueva tabla para almacenar las ocurrencias de la relación.
Esta tabla contendrá una clave ajena a cada una de las tablas correspon-
dientes a las entidades participantes, además de incluir los atributos de
la relación. Ninguna de las claves ajenas aceptará nulos, ya que la tabla
almacena ocurrencias de la relación. La clave primaria será la clave ajena
a la tabla correspondiente a la entidad hija, ya que cada ocurrencia de
ésta sólo puede aparecer una vez en la tabla.
133
fecha_inicio
codpro nombre codest nombre
PROFESOR(codpro, nombre)
ESTUDIANTE(codest, nombre)
TUTORIZA(codest, codpro, fecha_inicio)
TUTORIZA.codest es una clave ajena a ESTUDIANTE, no acep-
ta nulos
TUTORIZA.codpro es una clave ajena a PROFESOR, no acepta
nulos
(a) Si la relación no tiene atributos, la clave primaria está formada por las
dos claves ajenas (será una clave primaria compuesta).
134
(0,n) (0,n)
MÉDICO cita PACIENTE
hora fecha
codmed nombre codpac nombre
MÉDICO(codmed, nombre)
PACIENTE(codpac, nombre)
CITA(codmed, codpac, fecha, hora) � ¡falta escoger la clave
primaria!
CITA.codmed es una clave ajena a MÉDICO, no acepta nulos
CITA.codpac es una clave ajena a PACIENTE, no acepta nulos
Para escoger la clave primaria de la tabla CITA se deben buscar antes las
claves candidatas, que dependerán del significado de la relación:
135
DNI fecha_nacim
nombre
136
Una vez obtenidas las tablas con sus atributos, claves primarias, claves
alternativas y claves ajenas, deben normalizarse. La normalización se utiliza
para mejorar el esquema lógico, de modo que satisfaga ciertas restricciones que
eviten la duplicidad de datos. La normalización garantiza que el esquema re-
sultante se encuentra más próximo al modelo de la empresa, que es consistente
y que tiene la mínima redundancia y la máxima estabilidad.
7.2.5. Normalización
La normalización es una técnica para diseñar la estructura lógica de los
datos de un sistema de información en el modelo relacional, desarrollada por
E. F. Codd en 1972. Es una estrategia de diseño de abajo a arriba: se parte de
los atributos y éstos se van agrupando en tablas según su afinidad. Aquí no se
utilizará la normalización como una técnica de diseño de bases de datos, sino
como una etapa posterior a la correspondencia entre el esquema conceptual y
el esquema lógico, que elimine las dependencias entre atributos no deseadas.
En la mayoría de las ocasiones, una base de datos completamente norma-
lizada no proporciona la máxima eficiencia; sin embargo, el objetivo en esta
etapa es conseguir una base de datos normalizada por las siguientes razones:
137
Los equipos informáticos de hoy en día son cada vez más potentes, por lo
que en ocasiones es más razonable implementar bases de datos fáciles de
manejar (las normalizadas), a costa de un tiempo adicional de proceso.
Dependencia funcional
Uno de los conceptos fundamentales en la normalización es el de dependen-
cia funcional. Una dependencia funcional es una relación entre atributos de
una misma tabla. Si x e y son atributos de la relación R, se dice que y es fun-
cionalmente dependiente de x (se denota por x −→ y) si cada valor de x tiene
asociado un solo valor de y (x e y pueden constar de uno o varios atributos). A
x se le denomina determinante, ya que x determina el valor de y. Se dice que
el atributo y es completamente dependiente de x si depende funcionalmente de
x y no depende de ningún subconjunto de x.
La dependencia funcional es una noción semántica. Si hay o no dependen-
cias funcionales entre atributos, no lo determina una serie abstracta de reglas,
sino, más bien, los modelos mentales del usuario y las reglas de negocio de la
organización o empresa para la que se desarrolla el sistema de información.
Cada dependencia funcional es una restricción y representa una relación de
uno a muchos (o de uno a uno).
En el proceso de normalización debe irse comprobando que cada tabla
cumple una serie de reglas que se basan en la clave primaria y las dependencias
funcionales. Cada regla que se cumple aumenta el grado de normalización. Si
138
PRODUCTO(codprod, nombre)
VERSIÓN(codprod, número, fecha, ventas)
VERSIÓN.codprod es una clave ajena a PRODUCTO
139
ACTIVIDAD(actividad, precio)
INSCRIPCIÓN(estudiante, actividad)
INSCRIPCIÓN.actividad es una clave ajena a ACTIVIDAD
140
141
142
143
7.4. Desnormalización
Una de las tareas que se realizan en el diseño lógico, después de obtener
un esquema lógico normalizado, es la de considerar la introducción de redun-
dancias controladas y otros cambios en el esquema. En ocasiones puede ser
conveniente relajar las reglas de normalización introduciendo redundancias de
forma controlada con objeto de mejorar las prestaciones del sistema.
En la etapa del diseño lógico se recomienda llegar, al menos, hasta la terce-
ra forma normal para obtener un esquema con una estructura consistente y sin
redundancias. Pero a menudo sucede que las bases de datos así normalizadas
no proporcionan la máxima eficiencia, con lo que es necesario volver atrás y
desnormalizar algunas tablas, sacrificando los beneficios de la normalización
para mejorar las prestaciones. Es importante hacer notar que la desnormali-
zación sólo debe realizarse cuando se estime que el sistema no puede alcanzar
las prestaciones deseadas. Y desde luego, el que en ocasiones sea necesario des-
normalizar no implica eliminar la fase de normalización del diseño lógico ya
que la normalización obliga al diseñador a entender completamente cada uno
de los atributos que se han de representar en la base de datos.
Además hay que tener en cuenta los siguientes factores:
La desnormalización hace que la implementación sea más compleja.
La desnormalización hace que se sacrifique la flexibilidad.
La desnormalización puede hacer que los accesos a datos sean más rápi-
dos, pero ralentiza las actualizaciones.
Por regla general, la desnormalización puede ser una opción viable cuando
las prestaciones que se obtienen no son las deseadas y las tablas involucra-
das se actualizan con poca frecuencia pero se consultan muy a menudo. Las
redundancias que se pueden incluir al desnormalizar son de varios tipos: se
pueden introducir datos derivados (calculados a partir de otros datos), se pue-
den duplicar atributos o se puede hacer concatenaciones (JOIN) de tablas. El
incluir redundancias dependerá del coste adicional de almacenarlas y mante-
nerlas consistentes, frente al beneficio que se consigue al realizar consultas.
No se puede establecer una serie de reglas que determinen cuándo desnor-
malizar tablas, pero hay algunas situaciones bastante comunes en donde puede
considerarse esta posibilidad:
Combinar relaciones de uno a uno. Esto puede ser conveniente cuando
hay tablas involucradas en relaciones de uno a uno, se accede a ellas de
manera conjunta con frecuencia y casi no se accede a ellas por separado.
144
145
146
147
148
7.7. Ejemplos
En este apartado se obtendrá el esquema lógico correspondiente a los dos
ejemplos presentados en el apartado 6.3 del capítulo 6 de diseño conceptual.
149
Se han renombrado las columnas que son claves ajenas, de modo que llevan
detrás el nombre de la tabla a la que hacen referencia.
Una vez obtenidas las tablas, se debe pasar a la normalización. Las tablas
CINES y CARTELERA no están en 1fn, por lo que debemos normalizarlas:
CARTELERA(nombre_cine, título_película)
CARTELERA.nombre_cine es clave ajena a CINES
CARTELERA.título_película es clave ajena a PELÍCULAS
PASES(nombre_cine, título_película, hora)
(PASES.nombre_cine, PASES.título_película) es clave ajena
a CARTELERA
Nótese que la clave ajena de PASES a CARTELERA es una clave ajena compuesta.
Las tablas obtenidas están en 1fn y también en 2fn y 3fn, al no haber
dependencias funcionales no deseadas, por lo que el esquema lógico contiene
ya las tablas normalizadas. El diagrama de la figura 7.7 muestra las tablas de
la base de datos. El recuadro superior de cada tabla contiene la clave primaria.
Mediante flechas se han indicado las claves ajenas y sobre estas flechas, se han
indicado las reglas de comportamiento de las mismas.
2
Esta es una cuestión de notación. El diseñador debe escoger una notación para nombrar
tablas, columnas y claves.
150
Por comodidad, pasamos ahora la tabla TEMAS a 1fn, ya que debemos incluir
columnas en ella para representar las relaciones.
TEMAS(tema)
PALABRAS(tema, palabra, importancia)
PALABRAS.tema es clave ajena a TEMAS
CONSULTAS(tema, ip, fecha_hora)
CONSULTAS.tema es clave ajena a TEMAS
151
PALABRAS Nulos: no
Borrado: Prop.
tema
Modif.: Prop.
palabra TEMAS
importancia tema
tema_padre
CONSULTAS Nulos: no
Borrado: Prop.
tema Modif.: Prop.
ip
fecha_hora
PÁGINAS
CONTENIDO Nulos: no
url
tema Borrado: Rest.
Nulos: no título
url_página Modif.: Prop. Borrado: Prop.
prioridad Modif.: Prop.
EVALUACIONES Nulos: no
url_página Borrado: Prop. VOLUNTARIOS
Modif.: Prop. email
email_voluntario
fecha nombre
Nulos: no
calificación Borrado: Rest.
Modif.: Prop.
152
Introducción y objetivos
El diseño físico es el proceso de producir la descripción de la implementación
de la base de datos en memoria secundaria, a partir del esquema lógico obtenido
en la etapa anterior. Para especificar dicha implementación se debe determinar
las estructuras de almacenamiento y escoger los mecanismos necesarios para
garantizar un acceso eficiente a los datos. Puesto que el esquema lógico utiliza
el modelo relacional, la implementación del diseño físico se realizará en SQL.
Al finalizar este capítulo, el estudiante debe ser capaz de:
Decidir qué índices deben crearse con el objetivo de aumentar las pres-
taciones en el acceso a los datos.
153
En los siguientes apartados se detallan cada una de las etapas que componen
la fase del diseño físico.
154
155
156
Lo que suele suceder es que todos estos factores no se pueden satisfacer a la vez.
Por ejemplo, para conseguir un tiempo de respuesta mínimo puede ser necesario
aumentar la cantidad de datos almacenados, ocupando más espacio en disco.
Por lo tanto, el diseñador deberá ir ajustando estos factores para conseguir un
equilibrio razonable. El diseño físico inicial no será el definitivo, sino que habrá
que ir monitorizándolo para observar sus prestaciones e ir ajustándolo como
sea oportuno. Muchos SGBD proporcionan herramientas para monitorizar y
afinar el sistema.
Hay algunas estructuras de almacenamiento que son muy eficientes para
cargar grandes cantidades de datos en la base de datos, pero no son eficientes
para el resto de operaciones, por lo que se puede escoger dicha estructura de
almacenamiento para inicializar la base de datos y cambiarla, a continuación,
para su posterior operación. Los tipos de organizaciones de ficheros disponibles
varían en cada SGBD y algunos sistemas proporcionan más estructuras de
almacenamiento que otros. Es muy importante que el diseñador del esquema
físico sepa qué estructuras de almacenamiento le proporciona el SGBD y cómo
las utiliza.
Para mejorar las prestaciones, el diseñador del esquema físico debe saber
cómo interactúan los dispositivos involucrados y cómo esto afecta a las pres-
taciones:
Memoria principal. Los accesos a memoria principal son mucho más rá-
pidos que los accesos a memoria secundaria (decenas o centenas de miles
de veces más rápidos). Generalmente, cuanta más memoria principal se
tenga, más rápidas serán las aplicaciones. Si no hay bastante memoria
disponible para todos los procesos, el sistema operativo debe transferir
páginas a disco para liberar memoria (memoria virtual). Cuando estas
páginas se vuelven a necesitar, hay que volver a traerlas desde el disco
157
158
159
160
161
8.2. Vistas
Hay tres características importantes inherentes a los sistemas de bases de
datos: la separación entre los programas de aplicación y los datos, el manejo
de múltiples vistas por parte de los usuarios (esquemas externos) y el uso de
un catálogo o diccionario para almacenar el esquema de la base de datos. En
1975, el comité ANSI-SPARC (American National Standard Institute- Stan-
dards Planning and Requirements Committee) propuso una arquitectura de
tres niveles para los sistemas de bases de datos, que resulta muy útil a la hora
de conseguir estas tres características.
Esquema conceptual
Esquema físico
SGBD
162
La mayoría de los SGBD no distinguen del todo los tres niveles. Algunos
incluyen detalles del nivel físico en el esquema conceptual. En casi todos los
SGBD que se manejan vistas de usuario, los esquemas externos se especifican
con el mismo modelo de datos que describe la información a nivel conceptual,
aunque en algunos se pueden utilizar diferentes modelos de datos en los niveles
conceptual y externo.
Hay que destacar que los tres esquemas no son más que descripciones de
los mismos datos pero con distintos niveles de abstracción. Los únicos datos
que existen realmente están a nivel físico, almacenados en un dispositivo como
puede ser un disco. En un SGBD basado en la arquitectura de tres niveles,
cada grupo de usuarios hace referencia exclusivamente a su propio esquema
externo.
La arquitectura de tres niveles es útil para explicar el concepto de inde-
pendencia de datos, que se puede definir como la capacidad para modificar el
esquema en un nivel del sistema sin tener que modificar el esquema del nivel
inmediato superior. Se pueden definir dos tipos de independencia de datos:
163
164
165
Una vista definida sobre varias tablas es actualizable si contiene las claves
primarias de todas ellas y los atributos que no aceptan nulos.
Una columna de una vista definida sobre varias tablas se podrá actualizar
si se obtiene directamente de una sola de las columnas de alguna de las
tablas y si la clave primaria de dicha tabla está incluida en la vista.
166
167