Capítulo 2 El modelo relacional
1
2 El modelo relacional 2.1 La estructura de bases de datos relacionales Una base de datos relacional consiste de una colección de tablas, cada una de las cuales tiene asignado un nombre único. Una fila (registro) en una tabla representa una relación entre un conjunto de valores. Informalmente una tabla es un conjunto de entidades y una fila es una entidad. Puesto que una tabla es una colección de tales relaciones, hay una correspondencia cercana entre el concepto de tabla y el concepto matemático de relación, del cual el modelo de datos relacional toma su nombre. A continuación se usarán varias relaciones diferentes para ilustrar los conceptos en los que descansa el modelo de datos relacionales. Estas relaciones representan parte de una empresa bancaria en forma simplificada.
2.1.1 Estructura básica En la figura 2.1 se tiene la tabla cuenta, consta de tres columnas cuyos nombres son: numero_cuenta, nombre_sucursal y saldo. Siguiendo la terminología del modelo relacional, se hará referencia a esas columnas como atributos. Para cada atributo hay un conjunto de valores permitidos llamado el dominio de esos atributos. Por ejemplo para el atributo nombre_sucursal el dominio es el conjunto de todas las sucursales. numero_cuenta A-101 A-102 A-201 A-215 A-217 A-222 A-305
nombre_sucursal Downtown Perryridge Brighton Mianus Brighton Redwood Round Hill
saldo 500 400 900 700 750 700 350
Figura 2.1 La relación cuenta
Se denotará como D1 el conjunto de todos los números de cuentas, como D2 el conjunto de todos los nombres de sucursales y como D3 el conjunto de todos los saldos. Cualquier fila de la tabla cuenta consiste de una tupla de 3 atributos (v1, v2, v3), donde v1 es un número de Bases de datos I
Arturo Ruvalcaba
Capítulo 2 El modelo relacional
2
cuenta (o sea v1 está en el dominio D1), v2 es un nombre de sucursal (o sea v2 está en el dominio D2), y v3 es un saldo (o sea, v3 está en el dominio D3). En general, la tabla cuenta contendrá sólo un subconjunto del conjunto de todas las filas posibles. Por lo tanto la tabla cuenta es un subconjunto de: D1 x D2 x D3 En general, una tabla de n atributos debe ser un subconjunto de D1 x D2 x … x Dn-1 x Dn Los matemáticos definen una relación como un subconjunto de un producto cartesiano de una lista de dominios. Esta definición corresponde casi exactamente a la definición dada de una tabla. Debido a que las tablas son esencialmente relaciones, en adelante se usarán los términos relación y tupla en lugar de los términos tabla y registro. Una variable tupla es una variable que representa una tupla; en otras palabras, una variable tupla es una variable cuyo dominio es el conjunto de todas las tuplas. En la relación cuenta de la figura 2.1 hay siete tuplas. Considérese que la variable tupla t se refiere a la primera tupla de la relación. Se usará la notación t[numero_cuenta] para denotar el valor de t en el atributo numero_cuenta. Entonces t[numero_cuenta] = “A-101”, y t[nombre_sucursal] = “Downtown”. Alternativamente se puede usar t[1] para denotar el valor de la tupla t en el primer atributo (numero_cuenta), t[2] para denotar nombre_sucursal, etc. Puesto que una relación es un conjunto de tuplas, se usará la notación matemática t Є r para denotar que la tupla t está en la relación r. El orden en el cual aparecen las tuplas un una relación es irrelevante. Entonces si las tuplas están listadas en orden ascendente como en la figura 2.1, o sin orden como en la figura 2.2, no importa; la relación en las dos figuras es la misma puesto que ambas contienen el mismo conjunto de tuplas. numero_cuenta A-101 A-215 A-102 A-305 A-201 A-222 A-217
nombre_sucursal Downtown Mianus Perryridge Round Hill Brighton Redwood Brighton
saldo 500 700 400 350 900 700 750
Figura 2.2 La relación cuenta con tuplas no ordenadas
Se requiere que para todas las relaciones r, los dominios de todos los atributos de r sean atómicos. Un dominio es atómico si los elementos del dominio son considerados unidades indivisibles. Es posible que varios atributos tengan el mismo dominio. Por ejemplo, suponiendo que se tiene la relación cliente que tiene los tres atributos nombre_cliente, calle_cliente, y ciudad_cliente, y una relación empleado que incluye el atributo nombre_empleado. Es posible que los atributos nombre_cliente y nombre_empleado tengan el mismo dominio: el conjunto de todos los nombres de personas, el cual al nivel físico es el conjunto de todas las cadenas de caracteres. Por otro lado los dominios de nombre_sucursal y saldo deben ser distintos. Bases de datos I
Arturo Ruvalcaba
Capítulo 2 El modelo relacional
3
Un valor de dominio que es un miembro de cualquier dominio posible es el valor nulo, el cual significa que el valor es desconocido o no existe. Por ejemplo suponiendo que en la relación cliente se incluye el atributo numero_telefono, puede ser que un cliente no tenga teléfono o que no está en el directorio telefónico. Entonces, habrá que recurrir a los valores nulos para indicar que el valor es desconocido o que no existe.
2.1.2 Esquema de la base de datos Cuando se habla de bases de datos se debe diferenciar entre esquema de base de datos, el cual es el diseño lógico de la base, e instancia de base de datos el cual es una “fotografía” de la base en cualquier instante dado. El concepto de una relación en una base de datos corresponde en un lenguaje de programación a la noción de una variable. El concepto esquema de relación corresponde en un lenguaje de programación a la noción de la definición de tipo. Es conveniente darle un nombre a un esquema de relación, así como se le da un nombre a los tipos de definición en los lenguajes de programación. Se adoptará la convención de usar el nombre de una relación en minúsculas y para los esquemas de relación su nombre empezará con mayúscula. Siguiendo esta notación, se usará Cuenta_esquema para denotar el esquema de relación para la relación cuenta. Entonces, Cuenta_esquema = (numero_cuenta, nombre_sucursal, saldo) Se denotará el hecho de que cuenta es una relación en Cuenta_esquema mediante: cuenta(Cuenta_esquema) En general un esquema de relación consiste de una lista de atributos y sus correspondientes dominios. El concepto de instancia de relación corresponde en un lenguaje de programación a la noción del valor de una variable. El valor de una variable dada puede cambiar con el tiempo; similarmente el contenido de una instancia de relación puede cambiar con el tiempo cuando ésta es actualizada. Sin embargo para simplificar, al decir “relación” significará “instancia de relación”. Como un ejemplo de una instancia de relación, considere la relación sucursal de la figura 2.3. El esquema para esa relación es: Sucursal_esquema = (nombre_sucursal, ciudad_sucursal, activos) Se puede notar que el atributo nombre_sucursal aparece en Sucursal_esquema y en Cuenta_esquema. Esta duplicación no es coincidencia. Más bien, al usar atributos comunes en los esquemas de relación es una manera de relacionar tuplas de relaciones distintas. Por ejemplo, suponiendo que se desea encontrar la información sobre todas las cuentas que se tienen en sucursales localizadas en Brooklyn. Primero se busca en la relación sucursal para encontrar los nombres de las sucursales localizadas en Brooklyn. Después, para cada una de tales sucursales se busca en la relación cuenta para encontrar las cuentas existentes en esa sucursal.
Bases de datos I
Arturo Ruvalcaba
Capítulo 2 El modelo relacional
4
nombre_sucursal Brighton Downtown Mianus North Town Perryridge Pownal Redwood Round Hill
ciudad_sucursal Brooklyn Brooklyn Horseneck Rye Horseneck Bennington Palo Alto Horseneck
activos 7100000 9000000 400000 3700000 1700000 300000 2100000 8000000
Figura 2.3 La relación sucursal
Continuando con el ejemplo de la empresa bancaria, se necesita una relación para describir información sobre clientes. El esquema de relación es: Cliente_esquema = (nombre_cliente, calle_cliente, ciudad_cliente) La figura 2.4 presenta un ejemplo de la relación cliente. Aquí se supone que el atributo nombre_cliente identifica unívocamente a un cliente (lo cual no es cierto en el mundo real). nombre_cliente Adams Brooks Curry Glen Green Hayes Johnson Jones Lindsay Smith Turner Williams
calle_cliente Spring Senator North Sand Hill Walnut Main Alma Main Park North Putnam Nassau
ciudad_cliente Pittsfield Brooklyn Rye Woodside Stamford Harrison Palo Alto Harrison Pittsfield Rye Stamford Princeton
Figura 2.4 La relación cliente
También se requiere una relación para describir la asociación entre clientes y cuentas. El esquema de relación para describir esta asociación es: Depositante_esquema = (nombre_cliente, numero_cuenta) La figura 2.5 muestra un ejemplo de la relación depositante(Depositante_esquema)
Bases de datos I
Arturo Ruvalcaba
Capítulo 2 El modelo relacional
5
nombre_cliente Hayes Johnson Johnson Jones Lindsay Smith Turner
numero_cuenta A-102 A-101 A-201 A-217 A-222 A-215 A-305
Figura 2.5 La relación depositante
Parecería que para el ejemplo del banco se podría tener un solo esquema de relación en lugar de varios. O sea, sería más fácil para un usuario pensar en términos de un esquema de relación en vez de en términos de varios. Suponiendo que se usa una sola relación para el ejemplo con el esquema: (nombre_sucursal, ciudad_sucursal, activos, nombre_cliente, calle_cliente, ciudad_cliente, numero_cuenta, saldo) Se puede observar que si un cliente tiene varias cuentas se debe tener su dirección una vez por cada cuenta. Esto es, se repetiría cierta información varias veces. Esta repetición sería un despilfarro y se evitaría por el uso de varias relaciones en este ejemplo. Además si una sucursal no tiene cuentas (una nueva sucursal que aún no tiene clientes), no se puede construir una tupla completa en la relación precedente porque no se tienen datos disponibles aún sobre cliente y cuenta. Para representar tuplas incompletas se tienen que usar valores nulos, lo que significa que el valor es desconocido o no existe. Entonces en el ejemplo, los valores de nombre_cliente, calle_cliente y otros deben ser nulos. Con el uso de varias relaciones se puede representar la información de una sucursal sin clientes sin usar valores nulos. Simplemente se usa una tupla en sucursal_esquema para representar la información sobre la sucursal nueva, y se crearán tuplas en otros esquemas sólo cuando la información apropiada esté disponible. Se incluyen dos relaciones adicionales para describir datos acerca de préstamos que se tienen en varias sucursales del banco. Prestamo_esquema = (numero_prestamo, nombre_sucursal, monto) Prestatario_esquema = (nombre_cliente, numero_prestamo) La figuras 2.6 y 2.7 muestran un ejemplo de las relaciones prestamo(Prestamo_esquema) y prestatario(Prestatario_esquema) respectivamente.
Bases de datos I
Arturo Ruvalcaba
Capítulo 2 El modelo relacional
6
numero_prestamo L-11 L-14 L-15 L-16 L-17 L-23 L-93
nombre_sucursal Round Hill Downtown Perryridge Perryridge Downtown Redwood Mianus
monto 900 1500 1500 1300 1000 2000 500
Figura 2.6 La relación prestamo
nombre_cliente Adams Curry Hayes Jackson Jones Smith Smith Williams
numero_prestamo L-16 L-93 L-15 L-14 L-17 L-11 L-23 L-17
Figura 2.7 La relación prestatario
2.1.3 Llaves Se debe de tener un modo de especificar como se distinguen las tuplas dentro de una relación dada. Esto se expresa en términos de sus atributos. Esto es, los valores de los atributos de una tupla deben ser tales que puedan identificar unívocamente a la tupla, no se permite que en una relación dos tuplas tengan exactamente los mismos valores para todos sus atributos. Una superllave es un conjunto de uno o más atributos que, tomados colectivamente, permiten identificar unívocamente a una tupla en la relación. Por ejemplo, el atributo id_cliente de la relación cliente es suficiente para distinguir una tupla cliente de otra. Entonces, id_cliente es una superllave para la relación cliente. Similarmente, la combinación de nombre_cliente e id_cliente es una superllave para la relación cliente. El atributo nombre_cliente de cliente no es una superllave, porque varias personas pueden tener el mismo nombre. El concepto de una superllave no es suficiente para nuestros propósitos, ya que, como se vió, una superllave puede contener extraños atributos. Si K es una superllave, entonces también lo es cualquier superconjunto de K. Lo que interesa son las superllaves para las cuales ningún subconjunto sea una superllave. A tales superllaves mínimas se les llama llaves candidatas. Es posible que distintos conjuntos de atributos pudieran servir como una llave candidata. Supóngase que la combinación de nombre_cliente y calle_cliente sea suficiente para distinguir entre los miembros de la relación cliente. Entonces ambos {id_cliente} y {nombre_cliente, calle_cliente} son llaves candidatas. Aunque los atributos id_cliente y nombre_cliente juntos pueden distinguir tupas cliente, su combinación no forma una llave candidata, ya que el atributo id_cliente solo es una llave candidata. Se usa el término de llave primaria para denotar una llave elegida por el diseñador de la base de datos para designar el medio principal de identificar tuplas dentro de una relación. Una Bases de datos I
Arturo Ruvalcaba
Capítulo 2 El modelo relacional
7
llave (ya sea primaria, candidata o super) es una propiedad en toda la relación, no de tuplas individuales. Dos tuplas individuales cualesquiera en una relación no pueden tener el mismo valor en el atributo llave al mismo tiempo. La designación de una llave representa una restricción en empresas del mundo que está siendo modelada su base de datos. Una llave candidata debe ser elegida con cuidado. Como se observó antes, el nombre de una persona no es suficiente, debido a que muchas personas pueden tener el mismo nombre. Una alternativa es usar alguna combinación única de otros atributos como una llave. La llave primaria debe ser elegida de tal modo que los valores del atributo nunca o muy raramente cambien. Formalmente, sea R un esquema de relación. Si se dice que un subconjunto K de R es una superllave para R, se está restringiendo la consideración a las relaciones r(R) en las cuales no hay dos tuplas distintas que tengan los mismos valores en todos los atributos de K. Es decir, si t1 y t2 están en R y t1 ≠ t2, entonces t1 [K] ≠ t2 [K]. Un esquema de relación, por decir r1, puede incluir entre sus atributos la llave primaria de otro esquema de relación, digamos r2. Este atributo se llama una llave foránea de r1, referenciando r2.
2.1.4 Diagramas de esquema Un esquema de bases de datos, junto con las dependencias de clave primaria y externa, se puede mostrar gráficamente mediante diagramas de esquema. La figura 2.8 muestra el diagrama del esquema para la empresa bancaria. Cada relación aparece como una caja con sus atributos listados en ella y el nombre de la relación arriba. Si hay atributos como llave primaria, una línea horizontal cruza la caja separando la llave primaria de los otros atributos. Las dependencias de llaves foráneas aparecen como flechas desde el atributo que es llave foránea desde la relación referenciante a la llave primaria de la relación referenciada.
Figura 2.8 Diagrama del esquema de la base de la empresa bancaria
Bases de datos I
Arturo Ruvalcaba