Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bases de Datos
Tema 1.Introduccin.
1.1. Objetivos de los sistemas de bases de datos. 1.2. Abstraccin de datos. 1.3. Modelos de datos.
1.3.1. Modelos lgicos basados en objetos. 1.3.1.1. El modelo entidad-relaccin. 1.3.1.2. El modelo orientado a objetos. 1.3.2. Modelos lgicos basados en registros. 1.3.2.1. Modelo relaccional. 1.3.2.2. Modelo de red. 1.3.2.3. Modelo jerrquico. 1.3.2.4. Diferencias entre modelos. 1.3.3. Modelos fsicos de datos.
1.4. Instancias y esquemas. 1.5. Independencia de datos. 1.6. Lenguaje de definicin de datos. 1.7. Lenguaje de manipulacin de datos. 1.8. Gestor de base de datos. 1.9. Administrador de bases de datos. 1.10. Usuarios de bases de datos. 1.11. Estructura del sistema global.
2.8. Generalizacin. 2.9. Agregacin. 2.10. Diseo de un esquema de base de datos E-R.
2.7.1. Representacin de conjuntos de entidades fuertes. 2.7.2. Representacin de conjuntos de entidades dbiles. 2.7.3. Representacin de conjuntos de relaciones.
2.10.1. Cardinalidades de asignacin. 2.10.2. Uso de conjuntos de entidades o de conjuntos de relaciones. 2.10.3. Uso de caractersticas de E-R ampliado.
Indice 3.2.1.1. La operacin seleccionar. 3.2.1.2. La operacin proyectar. 3.2.1.3. La operacin producto cartesiano. 3.2.1.4. La operacin renombrar. 3.2.1.5. La operacin unin. 3.2.1.6. La operacin diferencia de conjuntos. 3.2.2. Definicin formal del lgebra relacional. 3.2.3. Operaciones adicionales. 3.2.3.1. La operacin interseccin de conjuntos. 3.2.3.2. La operacin producto natural. 3.2.3.3. La operacin divisin. 3.2.3.4. La operacin asignacin. 3.3.1. Consultas ejemplo. 3.3.2. Definicin formal. 3.3.3. Seguridad de expresiones. 3.3.4. Poder expresivo de los lenguajes. 3.4.1. Definicin formal. 3.4.2. Consultas ejemplo. 3.4.3. Seguridad de las expresiones. 3.4.4. Poder expresivo de los lenguajes. 3.5.1. Eliminacin. 3.5.2. Insercin. 3.5.3. Actualizacin.
3.6. Vistas.
3.6.1. Definicin de vista. 3.6.2. Actualizacin por medio de vistas y valores nulos.
4.3. QUEL.
II
6.4. Normalizacin por medio de dependencias de interseccin. 6.5. Forma normal de dominio-clave. 6.6. Enfoques alternativos de diseo de Bases de Datos.
III
Indice
8.3. Archivos indexados de rboles B+. 8.4. Archivos indexados de rboles B. 8.5. Funciones de asociacin (hash) esttica. 8.6. Funciones de asociacin (hash) dinmica. 8.7. Comparacin de indexacin y asociacin (hash). 8.8. Definicin de ndice en SQL. 8.9. Acceso por claves mltiples.
8.9.1. Estructura de rejilla. 8.9.2. Funcin de asociacin dividida.
IV
Tema 1. Introduccin
Tema 1.Introduccin.
Un sistema de gestin de bases de datos (DBMS database management system) consiste en una coleccin de datos interrelacionados y un conjunto de programas para acceder a ellos. La coleccin de datos se denomina base de datos (BD). El objetivo primordial de un DBMS es proporcionar que a su vez sea conveniente y eficiente para ser utilizado al extraer o almacenar informacin en la BD. Los sistemas de bases de datos estn diseados para gestionar grandes bloques de informacin, que implica tanto la definicin de estructuras para el almacenamiento como de mecanismos para la gestin de la informacin. Adems los DBMS deben mantener la seguridad de la informacin almacenada pese a la cada del sistema o accesos no autorizados.
Bases de datos 3.- Nivel de visin. El nivel ms alto de abstraccin describe slo parte de la BD completa. Muchos usuarios no se interesan por toda la informacin, slo necesitan una parte de la BD. Para simplificar su interaccin con el sistema se define el nivel de abstraccin de visin. El sistema pude proporcionar muchas visiones para la misma BD. En el nivel fsico, un registro puede describirse como un bloque de posiciones de memoria consecutivas. En el nivel conceptual, cada registro se describe por medio de una definicin de tipo, y se define la interrelacin entre los tipos. Finalmente, en el nivel de visin, se definen varias visiones de la BD. Por ejemplo, los cajeros slo ven la informacin sobre las cuentas de los clientes, sin poder acceder a los salarios de los empleados.
1.3.1.2. El modelo orientado a objetos. Al igual que el modelo E-R, el modelo orientado a objetos se basa en una coleccin de objetos. Un objeto contiene valores acumulados en variables instancia dentro de l, y estos valores son objetos por si mismos. As, los objetos contienen objetos a un nivel de anidamiento arbitrario. Un objeto tambin contiene partes de cdigo que operan sobre el objeto, que se denominan mtodos. Los objetos que contienen los mismos tipos de valores y los mismos mtodos se agrupan en clases. Una clase puede se vista como una definicin de tipo para objetos. La nica forma en la que un objeto puede acceder a los datos de otro objeto es invocando a un mtodo de ese otro objeto. Esto se llama envo de un mensaje al objeto. As, la interfaz de llamada de los mtodos de un objeto define su parte visible externamente, la parte interna del objeto (las variables de instancia y el cdigo de mtodo) no son visibles externamente. El resultado es dos niveles de abstraccin de datos.
Tema 1. Introduccin Para ilustrar el concepto, considrese un objeto que representa una cuenta. Dicho objeto contiene las variables instancia nmero y saldo, y el mtodo inters de pago, que aade inters al saldo. Supngase que se paga el 6% en todas las cuentas, pero ahora se va a pagar el 5% si el saldo es menor que 1000$, y el 6% si es mayor o igual.. Bajo la mayora de los modelos de datos, esto implicara cambiar de cdigo en uno o ms programas de aplicacin. Bajo este modelo, slo se hace un cambio dentro del mtodo inters de pago. El interfaz externo del objeto permanece sin cambios. A diferencia de las entidades en el modelo E-R, cada objeto tiene su propia identidad nica independiente de los valores que contiene. As dos objetos que contienen los mismos valores son distintos. La distincin entre objetos individuales se mantiene en el nivel fsico por medio de identificadores de objeto. 1.3.2. Modelos lgicos basados en registros. Los modelos lgicos basados en registros se utilizan para describir datos en los modelos conceptual y fsico. A diferencia de los modelos lgicos basados en objetos, se usan para especificar la estructura lgica global de la BD y para proporcionar una descripcin a nivel ms alto de la implementacin. Los modelos basados en registros se llaman as porque la BD est estructurada en registros de formato fijo de varios tipos. Cada tipo de registro define un nmero fijo de campos, o atributos, y cada campo normalmente es de longitud fija. La estructura ms rica de estas BD a menudo lleva a registros de longitud variable en le nivel fsico. Los modelos basados en registros no incluyen un mecanismo para la representacin directa de cdigo de la BD, en cambio, hay lenguajes separados que se asocian con el modelo para expresar consultas y actualizaciones Los tres modelos de datos ms aceptados son los modelos relacional, de red y jerrquico. El modelo relacional ha ganado aceptacin por encima de los otros. 1.3.2.1. Modelo relacional. El modelo relacional representa los datos y relaciones entre los datos mediante una coleccin de tablas, cuyas columnas tienen nombres nicos. Nombre Calle Ciudad Nmero Nmero Saldo Lowery Mapple Queens 900 900 55 Shiver North Bronx 556 556 100.000 Shiver North Bronx 647 647 105.366 Hodges Sidehill Brooklyn 801 801 10.533 Hodges Sidehill Brooklyn 647 1.3.2.2. Modelo de red. Los datos en el modelo de red se representan mediante colecciones de registros y las relacciones entre los datos se representan mediante enlaces, los cuales pueden verse como punteros.
1.3.2.3. Modelo jerrquico. El modelo jerrquico es similar al modelo de red, los datos y las relaciones se representan mediante registros y enlaces. Se diferencia del modelo de red en que los registros estn organizados como colecciones de rboles.
Bases de datos 1.3.2.4. Diferencias entre modelos. Los modelos relacionales se diferencian de los modelos de red y jerrquico en que no usan punteros o enlaces. En cambio, el modelo relacional conecta registros mediante los valores que stos contienen. Esta libertad del uso de punteros permite que se defina una base matemtica formal. 1.3.3. Modelos fsicos de datos. Los modelos fsicos de datos se usan para describir datos en el nivel ms bajo. Hay muy pocos de modelos fsicos de datos en uso, siendo los ms conocidos el modelo unificador y de memoria de elementos.
Tema 1. Introduccin
Bases de datos 2.- Usuarios sofisticados. Interaccionan con el sistema sin escribir programas, en cambio escriben sus preguntas en un lenguaje de consultas. Cada consulta se somete a un procesador de consultas, cuya funcin es tomar una sentencia en DML y descomponerla en instrucciones que entienda el gestor de la BD. 3.- Usuarios especializados. Algunos usuarios sofisticados escriben aplicaciones de BD especializadas que no encajan en el marco tradicional de procesamiento de datos, como diseo asistido por computador, sistemas basados en el conocimiento, etc. 4.- Usuarios ingenuos. Los usuarios no sofisticados interactuan con el sistema invocando a uno de los programas de aplicacin permanentes que se han escrito anteriormente.
Tema 1. Introduccin
Bases de datos
2.3. Atributos.
Es posible definir un conjunto de entidades y sus relaciones de varias formas diferentes. La principal diferencia est en la forma en que tratamos los diversos atributos. Considrese el conjunto de entidades empleado con atributos nombre_empleado y nmero_telfono. Se puede argumentar fcilmente que un telfono es una entidad en s mismo con atributos nmero_telfono y situacin (la oficina donde est). Si tomamos este punto de vista, el conjunto de entidades empleado debe redefinirse como sigue : 1.- El conjunto de entidades empleado con atributo nombre_empleado. 2.- El conjunto de entidades telfono con atributo nmero_telfono y situacin. 3.- El conjunto de relaciones empltelf, que indica la asociacin entre los empleados y los telfonos que tienen.
Bases de datos En el primer caso, la definicin implica que cada empleado tiene exactamente un nmero de telfono asociado. En el segundo, la definicin afirma que los empleados pueden tener varios nmeros de telfono asociados. As, la segunda definicin es ms general que la primera, y puede reflejar con ms precisin la situacin del mundo real. No sera apropiado aplicar la misma tcnica al atributo nombre_empleado, ya que es difcil argumentar que sea una entidad en si misma, as que es adecuado tener nombre_empleado como un argumento del conjunto de entidades empleado. Surge entonces una pregunta qu constituye un atributo y que constituye un conjunto de entidades ?. Desafortunadamente, no hay una respuesta sencilla, la distincin depende principalmente de la estructura de la empresa que se est modelando y de la semntica asociada con el atributo en cuestin.
2.5. Claves.
Es importante poder especificar cmo se distinguen las entidades y las relaciones. Conceptualmente, las entidades individuales y las relaciones son distintas, pero, desde la perspectiva de una BD, la diferencia entre ellas debe expresarse en trminos de sus atributos. El concepto de superclave nos permite hacer dicha distincin. Una superclave es un conjunto de uno o ms atributos que, considerados conjuntamente, nos permiten identificar de forma nica a una entidad dentro del conjunto de entidades. Por ejemplo, el atributo seguridad_social, del conjunto de entidades cliente es una superclave. Anlogamente la combinacin de nombre_cliente y seguridad_social es una superclave, as que si K es una superclave, entonces tambin lo ser algn subconjunto de K. A menudo estamos interesados en superclaves mnimas para las cuales ningn subconjunto propio es superclave, y se denominan claves candidatas. Usaremos el trmino clave primaria para denotar una clave candidata que elige el diseador de la BD como el medio principal de identificar entidades dentro de un conjunto de entidades. Es posible que un conjunto de entidades no tenga atributos suficientes para formar una clave primaria. Un conjunto de entidades de este tipo se denomina conjunto de entidades dbil, mientras que se denominar conjunto de entidades fuerte si tiene una clave primaria. Para ilustrarlo considrese el conjunto de entidades transaccin, distintas entidades asociadas a distintas cuentas pueden tener el mismo valor del atributo nmero_transaccin. As este conjunto de entidades es dbil, ya que no tiene clave primaria. Para que un conjunto de entidades dbil sea significativo, debe ser parte de un conjunto de relaciones una a muchas, y que no debe tener atributos descriptivos, ya que cualquier atributo que se necesite puede estar asociado con le conjunto de entidades dbil. Los conceptos de entidades fuertes y dbiles estn relacionados con las dependencias por existencia. Un miembro de un conjunto de entidades fuerte es, por definicin una entidad dominante, mientras que un miembro de un conjunto de entidades dbil es una entidad subordinada por definicin. Aunque un conjunto de entidades dbil no tiene clave primaria debe tener un medio de distinguir entre todas aquellas entidades en el conjunto de entidades que dependen de una entidad fuerte determinada.
10
Tema 2. Modelo entidad-relacin El discriminador de un conjunto de entidades dbil es un conjunto de atributos que permite que se haga esta distincin. Por ejemplo, el discriminador del conjunto de entidades dbil transaccin es el atributo nmero_transaccin, ya que para cada cuenta un nmero de transaccin identifica de forma nica una entidad. La clave primaria de un conjunto de entidades dbil esta formada por la clave primaria del conjunto de entidades fuerte de la que depende su existencia y su discriminador. En el caso del conjunto transaccin, la clave primaria es {nmero_cuenta, nmero-transaccin}, donde nmero_cuenta identifica a la entidad dominante de una transaccin y nmero_transaccin distingue entidades transaccin dentro de la misma cuenta. Sea R un conjunto de relaciones que implica a los conjuntos E 1, E 2, ..., E n. Sea (Ei) la clave primaria que denota el conjunto de atributos que forma la clave primaria para el conjunto de entidades Ei. Supngase que R no tiene atributos. Entonces los atributos que describen las relaciones individuales del conjunto R, denotadas por el atributo(R), son : Clave_primaria (E1) Clave_primaria (En)... Clave_primaria (En) En el caso de que R tenga atributos descriptivos, digamos {a1, a2, ...,am}, entonces el conjunto atributo(R) consta de : Clave_primaria (E1)... Clave_primaria (En) {a1, a2, ...,am} Considrese el conjunto de relaciones CtaCli, que implica a los conjuntos de entidades cliente, con clave primaria seguridad_social, y cuenta, con clave primaria nmero_cuenta. Puesto que el conjunto de relaciones tiene el atributo fecha, el conjunto atributo(CtaCli) se compone de los tres atributos, seguridad_social, nmero_cuenta y fecha. Ahora ya podemos explicar que constituye la clave primaria de un conjunto de relaciones R. La composicin de la clave primaria depende de la cardinalidad de asignacin y de la estructura de los atributos asociados con el conjunto de relaciones R. Si el conjunto de relaciones R no tiene atributos asociados, entonces el conjunto atributo(R) forma una superclave. Esta superclave es una clave primaria si la cardinalidad de asignacin es muchas a muchas. Considrese el conjunto de relaciones CtaCli. Si el conjunto de relaciones es muchas a muchas su clave primaria ser {seguridad_social, nmero_cuenta}, si es muchas a una, de cliente a cuenta, entonces su clave primaria ser {seguridad_social}, ya que una persona puede tener una sola cuenta asociada. Si el conjunto de relaciones R tiene varios atributos asociados con l, entonces una superclave est formada como antes, ms la posible adicin de uno o ms de estos atributos. La estructura de la clave primaria depende tanto de la cardinalidad de asignacin como de las semnticas del conjunto de relaciones. Considrense los conjuntos de entidades cliente y banquero y un conjunto de relaciones BanqueroCli. Supngase que ste conjunto de relaciones tiene el atributo tipo asociado con l que representa la naturaleza de la relacin con el cliente (prestamista o banquero). Si un banquero determinado puede representar dos papeles distintos en una relacin con un cliente determinado, entonces la clave primaria de BanqueroCli consta de la unin de las claves primarias cliente y banquero, as como del atributo tipo. Sin embargo, si un banquero slo puede tener una relacin con un cliente determinado, entonces tipo no es parte de la clave primaria, que ser nicamente la unin de las claves primarias cliente y banquero.
11
Bases de datos Una BD que se ajusta a un diagrama E-R puede representarse por medio de una coleccin de tablas. Para cada conjunto de entidades y para cada conjunto de relaciones en la BD, existe una tabla nica a la que se le asigna el nombre del conjunto correspondiente. Cada tabla tiene un nmero de columnas, que tienen nombres nicos. 2.7.1. Representacin de conjuntos de entidades fuertes. Sea E un conjunto de entidades fuerte con los atributos descriptivos a1, a2, ..., an. Representamos esta entidad por medio de una tabla llamada E con n columnas distintas que corresponden a los n atributos de E. Cada fila de esta tabla corresponde a una entidad del conjunto de entidades E. Por ejemplo, considrese el conjunto de entidades cuenta, con los atributos nmero_cuenta y saldo. Representaremos este conjunto mediante una tabla llamada cuenta, con dos columnas, llamadas nmero_cuenta y saldo. Podemos aadir una nueva cuenta a la BD con aadir una sola fila en la tabla. Sea D1 el conjunto de todos los nmeros de cuenta, y sea D2 el conjunto de todos los saldos. Cualquier fila de la tabla cuenta debe consistir en una tupla binaria (v1, v2), donde v1es un nmero de cuenta, y v2 es un saldo. En general la tabla cuenta contendr nicamente un subconjunto de los conjuntos de todas las filas posibles. Nos referimos al conjunto de todas las filas posibles de cuenta como el producto cartesiano de D1 y D2, que se expresa: D1 x D2 En general, si tenemos una tabla de n columnas, indicamos el producto cartesiano por : D1 x D2 x ... x Dn-1 x Dn 2.7.2. Representacin de conjuntos de entidades dbiles. Sea A un conjunto de entidades dbil con atributos a1, a2, ..., ar. Sea B el conjunto de entidades fuerte del que depende A. La clave primaria de B consta de los atributos b1, b2, ..., bs. Representamos el conjunto de entidades A mediante una tabla llamada A con una columna para cada atributo del conjunto : {a1, a2, ..., ar} {b 1, b 2, ..., b s} Considrese el conjunto de entidades transaccin, con atributos nmero_transaccin, fecha y cantidad. La clave primaria del conjunto de entidades cuenta, de la que transaccin es dependiente, es nmero_cuenta. As, la tabla transaccin tendr cuatro columnas etiquetadas nmero_cuenta, nmero_transaccin, fecha y cantidad. 2.7.3. Representacin de conjuntos de relaciones. Sea R un conjunto de relaciones que implica a los conjuntos de entidades E1, E2, ..., Em. Supongamos que atributo(R) consta de n atributos. Representamos este conjunto de relaciones mediante una tabla llamada R con n columnas distintas, cada una de las cuales corresponde a uno de los atributos de atributo(R). Considrese el conjunto de relaciones CtaCli, que implica a los conjuntos de entidades cliente y cuenta, con claves primarias seguridad_social y nmero_cuenta. Puesto que el conjunto de relaciones tiene el atributo fecha, la tabla CtaCli tiene tres columnas etiquetadas seguridad_social, nmero_cuenta y fecha. El caso de relaciones que conectan un conjunto de entidades dbil con su correspondiente conjunto fuerte es especial. Estas relaciones son muchas a una y no tienen atributos descriptivos. Adems la clave primaria de un conjunto de entidades dbil incluye la del fuerte. Consideremos el conjunto de entidades dbil transaccin dependiente del conjunto de entidades fuerte cuenta a travs del conjunto de relaciones log. La clave primaria de transaccin es {nmero_cuenta, nmero_transaccin}, y la de cuenta {nmero_cuenta}. Puesto que log no tiene atributos descriptivos, la tabla de log tendra dos columnas, nmero_cuenta y nmero_transaccin. La tabla para el conjunto de entidades transaccin tiene cuatro columnas, nmero_cuenta, nmero_transaccin, fecha y cantidad. As, la tabla log es redundante. En general, la tabla para el conjunto de relaciones que conecta un conjunto de entidades dbil con su correspondiente conjunto de entidades fuerte es redundante y no necesita presentarse en una presentacin tabular de un diagrama E-R.
2.8. Generalizacin.
Considrese el conjunto de entidades cuenta, con atributos nmero_cuenta y saldo. Ampliamos nuestro ejemplo anterior clasificando cada cuenta entre cuenta_ahorros y cuenta_cheques. Cada una de stas se describe mediante un conjunto de atributos que incluye todos los atributos del conjunto de entidades cuenta ms atributos adicionales. Por ejemplo, las entidades cuenta_ahorros se describen adems con el atributo tasa_inters, y las cuenta_cheques con el atributo saldo_deudor. Existen aspectos similares entre los conjuntos, en el sentido de que tienen varios atributos en comn (los originales de cuenta). Esto puede expresarse por generalizacin, que es una relacin de inclusin que existen entre un conjunto de entidades de un nivel ms alto y uno o ms conjuntos de entidades de nivel ms bajo. En el ejemplo anterior, cuenta es el conjunto de nivel ms alto, y cuenta_ahorros y cuenta_cheques son los conjuntos de entidades de nivel ms bajo.
12
Tema 2. Modelo entidad-relacin En trminos de un diagrama E-R, la generalizacin se representa por medio de un componente tringulo etiquetado ISA (is a, es un/a) y representa, por ejemplo, que una cuenta de ahorros es una cuenta.
La generalizacin se usa para hacer resaltar los parecidos entre tipos de entidades de nivel ms bajo y ocultar sus diferencias. La distincin se hace a travs de un proceso llamado herencia de atributos. Los atributos de entidades de nivel ms alto se dice que son heredados por los conjuntos de entidades de nivel ms bajo. Por ejemplo, cuenta_ahorros hereda los atributos de cuenta, por lo que tendr tres atributos, nmero_cuenta, saldo y tasa_inters. Existen dos mtodos diferentes para transformar un diagrama E-R que incluye generalizacin en una forma tabular : 1.- Crear una tabla para el conjunto de entidades de nivel ms alto. Para cada conjunto de entidades de nivel ms bajo, crear una tabla que incluya una columna para cada uno de los atributos de ese conjunto de entidades, ms una columna para cada atributo de la clave primaria del conjunto de entidades del nivel ms alto. As, para el ejemplo anterior tendremos tres tablas : cuenta (nmero_cuenta, saldo), cuenta_ahorros (nmero_cuenta, tasa_inters) y cuenta_cheques (nmero_cuenta, saldo_deudor). 2.- No crear una tabla para el conjunto de entidades de nivel ms alto. En cambio, para cada conjunto de entidades de nivel ms bajo, crear una tabla que incluya una columna para cada uno de los atributos de ese conjunto de entidades, ms una columna para cada atributo del conjunto de nivel ms alto. Entonces, para el ejemplo, tendremos: cuenta_ahorros (nmero_cuenta, saldo, tasa_inters) y cuenta_cheques (nmero_cuenta, saldo, saldo_deudor).
2.9. Agregacin.
Una limitacin del modelo E-R es que no es posible expresar relaciones entre relaciones. Para ilustrar la necesidad de una construccin as, considrese una BD que describe informacin acerca de empleados que trabajan en un proyecto determinado y usan varias mquinas distintas.
Puede ocurrir que los conjuntos de relaciones trabajo y usa se combinen en un nico conjunto de relaciones. Sin embargo, no deben combinarse, puesto que oscurecera la estructura lgica del esquema. La solucin es usar agregacin. La agregacin es una abstraccin a travs de la cual las relaciones se tratan como entidades de nivel ms alto. As, para nuestro ejemplo, recordamos el conjunto de relaciones trabajo y los conjuntos de entidades empleado y proyecto como un conjunto de entidades de nivel ms alto llamado trabajo, as, se trata de la misma forma que cualquier otro conjunto de entidades.
13
Bases de datos La transformacin de un diagrama E-R que incluya agregacin a una forma tabular es directa, creando las tablas empleado, proyecto, trabajo, maquinaria y usa. La tabla para el conjunto de relaciones usa incluye una columna para cada atributo en la clave primaria del conjunto de entidades maquinaria y del conjunto de relaciones trabajo. Tambin incluye una columna para cada atributo del conjunto de relaciones usa.
Este conjunto de relaciones podra sustituirse por un par de conjuntos de relaciones, como el de la siguiente figura, pero aqu, cada cuenta est situada en una sucursal. El conjunto de relaciones muchas a muchas CtaCli especifica que un cliente puede tener varias cuentas y que una cuenta puede pertenecer a varios clientes diferentes.
Hay una sutil distincin entre ambos diagramas, en el primero, la relacin entre un cliente y una cuenta puede representarse nicamente si hay una sucursal correspondiente, mientras que en el segundo, una cuenta puede estar relacionada con una sucursal sin el cliente correspondiente, o con un cliente sin la sucursal correspondiente. 2.10.2. Uso de conjuntos de entidades o de conjuntos de relaciones. No siempre est claro si un objeto se expresa mejor mediante un conjunto de entidades o mediante un conjunto de relaciones. En el ejemplo desarrollado, las cuentas se pueden representar como relaciones entre clientes y sucursales, con nmero_cuenta y saldo como atributos descriptivos. En este diseo, un cliente puede tener una cuenta en muchas sucursales y una sucursal puede tener muchos clientes. Cada cuenta se representa mediante una relacin entre un cliente y una sucursal. Pero este diseo no puede representar convenientemente una situacin en la varios clientes tienen una cuenta en comn, se debe definir una relacin separada para cada titular de la cuenta, con los mismos valores en los atributos descriptivos, desperdiciando espacio de almacenamiento. Sin embargo, si cada cuenta tiene exactamente un titular, el diseo ser satisfactorio. 2.10.3. Uso de caractersticas de E-R ampliado.
14
Tema 2. Modelo entidad-relacin El diseador de un esquema de BD debe decidir cuando es conveniente el uso de conjuntos de entidades dbiles, generalizacin y agregacin para modelar una empresa con el modelo de datos E-R. Cada una de estas caractersticas contribuye a la modularidad del diseo : 1.- Un conjunto de entidades fuerte y sus conjuntos de entidades dbiles dependientes pueden ser considerados como un objeto nico en la BD, ya que las entidades dbiles son dependientes por existencia de una entidad fuerte. 2.- La agregacin agrupa una parte del diagrama E-R en un conjunto de entidades nicas. Es posible tratar el conjunto de entidades agregado como una unidad nica sin preocuparse de los detalles de estructura interna. 3.- Generalizacin, o jerarqua de relaciones ISA, contribuye a la modularidad permitiendo que atributos comunes de conjuntos de entidades similares sean representados una sola vez en un diagrama E-R. Sin embargo, el uso excesivo de estas caractersticas puede introducir una complejidad innecesaria en el diseo.
15
Bases de datos
16
17
Bases de Datos debemos usar valores nulos. Usando dos relaciones, podemos representar clientes cuya direccin se desconozca sin usar valores nulos, simplemente usamos una tupla en esquema_depsito y no creamos tupla en esquema_cliente hasta que la informacin est disponible. No siempre es posible eliminar los valores nulos, supngase que incluimos el atributo nmero_telfono en el esquema_cliente. Puede ocurrir que un cliente no tenga telfono, entonces tendramos que recurrir a los valores nulos. Veremos ms adelante que los valores nulos causan diversas dificultades en el acceso o actualizxacin de la BD y, por tanto, deben eliminarse cuando sea posible. Para el propsito de este captulo supondremos una empresa bancaria con el diagrama E-R de la figura. Las claves primarias para los conjuntos entidad cliente y sucursal son nombre_cliente y nombre_sucursal. Ls esquemas de relaciones para esta empresa son : Esquema_sucursal = (nombre_sucursal, activo, ciudad_sucursal) Esquema_cliente = (nombre_cliente, calle, ciudad_cliente) Esquema_depsito = (nombre_sucursal, nmero_cuenta, nombre_cliente, saldo) Esquema_prstamo = (nombre_sucursal, nmero_prstamo, nombre_cliente, cantidad)
3.1.3. Claves. Las nociones de superclave, clave candidata y clave primaria tambin pueden aplicarse al modelo relacional, por ejemplo, en esquema_sucursal, {nombre_sucursal} y {nombre_sucursal, ciudad_sucursal} son superclaves, la primera es una clave candidata, no as la segunda, que contiene a la primara, por lo que la primera es la clave primaria, y la clave primaria para esquema_cliente es {nombre_cliente}. Sea R un esquema de relacin. Si decimos que un subconjunto K de R es una superclave para R estamos retringindonos a considerar las relaciones r(R), en las que no haya dos tuplas distintas que tengan los mismos valores en todos los atributos de K. Es decir, si t1 y t2 estn en r y t1 t2, entonces t1[K] t2[K]. 3.1.4. Lenguajes de consulta. Un lenguaje de consulta es un lenguaje en el que el usuario solicita informacin de la BD. Son, normalmente, de ms alto nivel que los estndar de programacin. Los lenguajes de consulta pueden clasificarse en lenguajes procedimentales y no procedimentales. En un lenguaje procedimental, el usuario da instrucciones al sistema para que realice una serie de operaciones en la BD para calcular el resultado deseado. En uno no procedimental, el usuario describe la informacin deseada sin dar un procedimiento especifico para obtenerla. La mayor parte de los sistemas comerciales de BD relacionales, ofrecen un lenguaje de consulta que incluye elementos de los dos enfoques. En este captulo examinamos dos lenguajes puros, el lgebra relacional es procedimental, mientras que el clculo relacional de tuplas y el clculo relacional de dominios son no procedimentales. Estos lenguajes de consulta son concisos y formales, pero ilustran las tcnicas fundamentales para extraer datos de la BD. Inicialmente nos interesaremos nicamente por las consultas, aunque un lenguaje de manipulacin de datos completo incluye, adems de un lenguaje de consulta, un lenguaje para la modificacin de la BD.
18
Tema 3. Modelo relacional. Las operaciones seleccionar, proyectar y renombrar se llaman operaciones unitarias, ya que operan sobre una relacin. Las otras tres operaciones operan sobre pares de relaciones y se llaman operaciones binarias. 3.2.1.1. La operacin seleccionar. La operacin seleccionar selecciona tuplas que satisfacen un predicado dado. Usamos la letra griga minscula sigma () para indicar la seleccin. El predicado aparece como subndice de . As, para selecconar aquellas tuplas de la relacin prstamo en las que la sucursal es Perrydge, escribimos : nombre_sucursal=Perrydge (prstamo) En general, permitimos las comparaciones usando =, , <, , >, ., en el predicado de seleccin. Adems, pueden combinarse varios predicados en un predicado ms complejo usando los conectores y () y o (). As : nombre_sucursal=Perrydge cantidad>1200 (prstamo) El predicado de seleccin puede incluir comparaciones entre dos atributos, como : nombre_cliente=nombre_banquero (servicio) 3.2.1.2. La operacin proyectar. La operacin proyectar es una operacin unitaria que devuelve su relacin argumento con ciertas columnas omitidas. Puesto que una relacin es un conjunto, se eliminan todas las filas duplicadas. La proyeccin se indica con la letra griega pi (). Listamos los atributos que queremos que aparezcan en el resultado como subndices de . La relacin argumento se escribe a continuacin de entre parntesis. As : nombre_sucursal, nombre_cliente (prstamo) mostrar solo los atributos nombre_sucursal y nombre_cliente. En vez de dar una relacin como argumento podemos dar el resultado de otra operacin, como nombre_cliente ( nombre_cliente=nombre_banquero (servicio)) 3.2.1.3. La operacin producto cartesiano. Las operaciones que hemos tratado hasta ahora nos permiten extraer informacin nicamente de una relacin cada vez. La operacin producto cartesiano, representada por una cruz (x) es una operacin binaria. Describimos el producto cartesiano de las relaciones r1 y r2 como r1 x r2. Recurdese que una relacin se define como un subconjunto de un producto cartesiano de un conjunto de dominios. Sin embargo, nos enfrentamos al problema de elegir los nombres de los atributos para la relacin que resulta de un producto cartesiano. Supngase que queremos encontrar a todos los clientes del banquero Johnson, as como las ciudades en las que viven. El esquema de relaciones para r es : (servicio.nombre_cliente, servicio.nombre_banquero, cliente.nombre_cliente, cliente.calle, cliente.ciudad_cliente) Es decir, simplemente listamos todos los atributos de las dos relaciones, y adjuntamos el nombre de la relacin de la que procede el atributo. Necesitamos adjuntar el nombre de la relacin para distinguir entre servicio.nombre_cliente y cliente.nombre_cliente. Para aquellos atributos que solo aparecen en uno de los dos esquemas omitiremos el prefijo nombre_relacin, lo que no producir ninguna ambigedad : (servicio.nombre_cliente, nombre_banquero, cliente.nombre_cliente, calle, ciudad_cliente) Ahora que ya conocemos el esquema de relaciones para r=servicio x cliente, qu tuplas aparecen en r?. Construiremos una tupla de r por cada par posible de tuplas : una de la relacin servicio y otra de cliente. Supngase que tenemos n 1 tuplas en servicio y n 2 tuplas en cliente. Entonces existen n1n2 formas de elegir un par de tuplas, de forma que hay n1n2 tuplas en r. Obsrvese que puede darse el caso para algunas tuplas t en r que t[servicio.nombre_cliente] t[cliente.nombre_cliente]. En general, si tenemos las relaciones r (R1) y r2(R2), entonces r xr2 es una relacin cuyo esquema es la 1 1 concatenacin de R1 y R2. La relacin R contiene todas las tuplas t para las cuales existe una tupla t1 en r1 y t2 en r2 para las que t[R1]=t1[R1] y t[R2]=t2[R2]. Volviendo a la pregunta, (clientes de Johnson y sus ciudades), considerando r=servicioxcliente, tenemos nombre_banquero= Johnson (servicioxcliente) Puesto que la operacin producto cartesiano asocia todas las tuplas de cliente con todas las tuplas de servicio, sabemos que alguna tupla en servicioxcliente tiene la direccin del cliente del banquero. Esto ocurre en aquellos casos en los que sucede que servicio.nombre_cliente=cliente.nombre_cliente, as que escribimos : servicio.nombre_cliente=cliente.nombre_cliente ( nombre_banquero= Johnson (servicioxcliente)) Finalmente, puesto que solo queremos el nombre y la ciudad del cliente debemos realizar una proyeccin : servicio.nombre_cliente, ciudad_cliente ( servicio.nombre_cliente=cliente.nombre_cliente ( nombre_banquero= Johnson (servicioxcliente))) 3.2.1.4. La operacin renombrar. Introdujimos el convenio de nombrar atributos nombre_relacin.nombre_atributo para eliminar ambigedades. Otra forma de ambigedad potencial surge cuando la misma relacin aparece ms de una vez en una pregunta.
19
Bases de Datos Considrese encontrar los nombres de todos los clientes que viven en la misma calle y ciudad que Smith. Podemos encontrar la calle y la ciudad de Smith escribiendo : calle, ciudad_cliente ( nombre_cliente=Smith (cliente)) Sin embargo, para encontrar otros clientes con esa calle y esa ciudad debemos hacer referencia una segunda vez a la relacin cliente P (cliente) x calle, ciudad_cliente ( nombre_cliente=Smith (cliente)) donde P es un predicado de seleccin que requiere que los valores de calle y ciudad_cliente sean iguales. Para especificar a qu valor de calle nos referimos, no podemos usar cliente.calle, ya que ambos valores de calle se toman de la misma relacin cliente, y lo mismo pasa con ciudad_cliente. Este problema se resuelve usando el operando renombrar, representado por . La expresin x(r) devuelve la relacin r con el nombre x. Usaremos sta para renombrar una referencia a la relacin cliente, y as hacer referencia a la relacin dos veces sin ambigedad. cliente.nombre_cliente(cliente2.calle=cliente.calle cliente2.ciudad_cliente=cliente.ciudad_cliente (cliente x (calle,ciudad_cliente (nombre_cliente=Smith( cliente2 (cliente)))))) 3.2.1.5. La operacin unin. Consideremos ahora una consulta que podra plantearse el departamento de publicidad de un banco: encontrar a todos los clientes de una sucursal, es decir, los que tienen una cuenta, un prstamo o ambos. Sabemos encontrar a todos los clientes con un prstamo y a los de una cuenta. Para contestar la consulta, necesitamos la unin de estos dos conjuntos. Esto se logra mediante la operacin binaria unin () ,y ser: nombre_cliente (nombre_sucursal=Nombre (prstamo) nombre_cl iente (nombre_sucursal=nombre (depsito)) En nuestro ejemplo tomamos la unin de dos conjuntos, ambos formados por valores de nombre_cliente. En general debemos asegurarnos de que las uniones se toman entre relaciones compatibles. Por tanto, para que una operacin de unin rs sea vlida exigimos que se cumplan dos condiciones: 1.- Las relaciones r y s deben tener el mismo nmero de atributos. 2.- Los dominios del atributo isimo de r y del atributo isimo de s deben ser los mismos. 3.2.1.6. La operacin diferencia de conjuntos. La operacin diferencia de conjuntos (-) nos permite encontrar tuplas que estn en una relacin pero no en otra. La expresin r-s da como resultado una relacin que contiene aquellas tuplas que estn en r pero no en s. Podemos encontrar a todos los clientes de una sucursal que tiene cuenta all, pero no un prstamo: nombre_cliente (nombre_sucursal=Nombre (depsito) - nombre_cliente (nombre_sucursal=nombre (prstamo)) Considrese la consulta encontrar el saldo de cuenta mayor en el banco. Nuestra estrategia para hacer esto es calcular primero una estrategia temporal que conste de aquellos saldos que no son los ms grandes, y entonces tomar la diferencia de conjuntos entre la relacin depsito y la relacin temporal que acaba de ser calculada para obtener el resultado. La relacin temporal se calcula por medio de: saldo.depsito (saldo.depsito<d.saldo (depsito x d(depsito)) El resultado contiene todos los saldos excepto el mayor de todos los saldos menos el mayor de todos. La consulta puede escribirse tomando la diferencia entre el conjunto de todos los saldos y la relacin temporal: saldo (depsito) - saldo.depsito (saldo.depsito<d.saldo (depsito x d(depsito))
3.2.2. Definicin formal del lgebra relacional. Una expresin bsica en el lgebra relacional consta de cualquiera de las siguientes: una relacin de la BD, y una relacin constante. Una expresin general en el lgebra relacional se construye a partir de subexpresiones. Sean E1 y E2 expresiones del lgebra relacional. Entonces las siguientes son todas expresiones del lgebra relacional: E 1E 2, E 1-E 2, E 1xE2, P (E1), S(E1), X (E1) 3.2.3. Operaciones adicionales. Las operaciones fundamentales del lgebra relacional son suficientes para expresar cualquier consulta en lgebra relacional. Sin embargo, si nos restringimos slo a las operaciones fundamentales, algunas consultas comunes son largas de expresar. Por tanto definimos operaciones adicionales que no aaden ninguna potencia al lgebra, pero que simplifican consultas comunes. 3.2.3.1. La operacin interseccin de conjuntos.
20
Tema 3. Modelo relacional. La interseccin de conjuntos () comunes a dos relaciones, por ejemplo encontrar los clientes que tienen una cuenta y un prstamo en una sucursal sera: nombre_cliente (nombre_sucursal=Nombre (prstamo) nombre_cliente (nombre_sucursal=nombre (depsito)) Cualquier expresin del lgebra relacional que use la interseccin de conjuntos puede reescribirse sustituyendo la operacin interseccin por un par de operaciones diferencia de conjuntos: rs = r-(r-s). As, la interseccin de conjuntos no es una operacin fundamental y no aade potencia al lgebra. 3.2.3.2. La operacin producto natural. Tpicamente, una consulta que implica un producto cartesiano incluye una operacin de seleccin en el resultado del producto. Considrese la consulta encontrar a todos los clientes que tiene un prstamo y las ciudades en las que viven. Primero formamos el producto cartesiano de las relaciones prstamo y cliente, despus seleccionamos aquellas tuplas que presenten un nico nombre_cliente. prstamo.nombre_cliente, ciudad_cliente (prestamo.nombre_cliente=cliente.nombre_cliente (prstamo x cliente)) El producto natural es una operacin binaria que nos permite combinar ciertas selecciones y un producto cartesiano en una operacin. Se representa por el simbolo |x|. La operacin producto natural forma un producto cartesiano de sus dos argumentos, realiza una seleccin formando la igualdad en aquellos atributos que aparezcan en ambas relaciones y, finalmente quita las columnas duplicadas. As, la consulta anterior sera: nombre_cliente, ciudad_cliente (prstamo |x| cliente) Puesto que muchos esquemas de prstamo y cliente tiene el atributo nombre_cliente en comn, la operacin producto natural considera slo pares de tuplas que tienen el mismo valor de nombre_cliente. Combina cada uno de estos pares de tuplas en un nico par en la unin de los dos esquemas. Ahora estamos preparados para la definicin formal del producto natural. Considrese dos esquemas de relaciones R y S, que son listas de nombres de atributos. Si consideramos los esquemas como conjuntos mejor que como listas, podemos representar aquellos atributos que estn en R y S por RS, y representar aquellos valores que aparecen en R, en S o en ambas por RS. Ntese que nos referimos a conjuntos de atributos, no de relaciones. Considrese las dos relaciones r(R ) y s(S). El producto natural de r y s, representado por r |x| s es una relacin del esquema RS. Es la proyeccin sobre RS de una seleccin en r x s, donde el predicado de seleccin requiere que r.A=s.A para cada atributo A en RS. Formalmente: r |x| s= RS (r.A1=s.A1 r.A2=s.A2 r.An=s.An r x s) Como propiedad, dgase que el producto natural es asociativo, y adems, sean r(R ) y s(S) relaciones sin ningn atributo en comn, es decir RS=. Entonces r |x| s = r x s. Puesto que el producto natural es muy importante, damos varios ejemplos de su uso: 1.- Encontrar el activo y el nombre de todas las sucursales que tienen depositantes que viven en Stanford. nombre_sucursal, activo (ciudad_cliente=Stanford (cliente |x| depsito |x| sucursal)) 2.- Encontrar a todos los clientes que tienen una cuenta y un prstamo en la sucursal Perrydge. nombre_cliente (nombre_sucursal=Perrydge (prstamo |x| depsito)) 3.2.3.3. La operacin divisin. La operacin divisin () se establece para aquellas consultas que incluyen la frase para todos2. Supngase que queremos encontrar a todos los clientes que tienen una cuenta en todas las sucursales que estn en Brooklyn. Podemos obtener todas las sucursales en Brooklyn mediante: r1 = nombre_sucursal (ciudad_sucursal=Brooklyn(depsito) Podemos encontrar todos los pares nombre_cliente, nomre_sucursal para los cuales el cliente tiene una cuenta en una sucursal escribiendo: r2 = nombre_cliente, nombre_sucursal (depsito) Ahora necesitamos encontrar los clientes que aparecen en r2 con cada nombre se sucursal en r1.La operacin que proporciona exactamente esos clientes es la operacin de dividir. La consulta puede expresarse con: nombre_cliente, nombre_sucursal (depsito) nombre_sucursal (ciudad_sucursal=Brooklyn(depsito) Formalmente, sean r(R ) y s(S) relaciones, y SR. La relacion rs es una relacin de esquema R-S. Una tupla t est en rs si para cada tupla ts es s existe una tupla tr en r que satisface estas dos condiciones: ts [R] = tr[S] ts [R-S] = t[R-S] Definida en trminos de operaciones fundamentales, la operacin dividir resulta: rs = R-S(r ) - R-S((R-S(r ) x s) - r) 3.2.3.4. La operacin asignacin. A veces es conveniente escribir una expresin del lgebra relacional por partes usando la asignacin a una variable de relacin temporal. La operacin asignacin (), funciona de forma parecida a la asignacin de los lenguajes de programacin.
21
Bases de Datos La evaluacin de una asignacin no da como resultado una relacin que se presenta al usuario, ms bien, el resultado de la expresin a la derecha de es asignado a la variable de relacin de la parte izquierda. Esta variable de relacin puede usarse en subsiguientes expresiones. Con la operacin asignacin, una consulta puede escribirse como un programa secuencial que consta de una serie de asignaciones seguidas de una expresin cuyo valor se presenta como el resultado de la consulta. En lgebra relacional, la asignacin debe hacerse siempre a una variable de relacin temporal. Es importante observar que la operacin de asignacin no proporciona potencia adicional al lgebra, es una forma conveniente de expresar consultas complejas de forma ms sencilla.
22
Tema 3. Modelo relacional. Interpretamos la expresin como el conjunto de todos los clientes (t[nombre_cliente]) tal que para todas las tuplas u en la relacin sucursal, si el valor de u en el atributo ciudad_sucursal es Brooklyn entonces el cliente tiene una cuenta en la sucursal cuyo nombre aparece en el atributo nombre_sucursal de u. 3.3.2. Definicin formal. Ahora estamos preparados para la definicin formal. Una expresin del clculo relacional de tuplas es de la forma: {t|P(t)} donde P es una frmula. En una frmula pueden aparecer varias variables de tuplas. Se dice que una variable de tupla es una variable libre a menos que este cuantificada por un o por un , que entonces se dice variable limite. Una frmula en el clculo relacional de tuplas se compone de tomos. Un tomo tiene una de las siguientes formas: 1.- sr, donde s es una variable de tupla y r es una relacin. No se permite la operacin . 2.- s[x]u[y], donde s y u son variables de tuplas, x e y son atributos sobre los que estn definidos s y u respectivamente, y es un operador de comparacin (<, , =, , >). Se requiere que los atributos x e y tengan dominios cuyos miembros puedan compararse por medio de . 3.- s[x] c, donde s es una variable de tupla, x es una atributo sobre el que s esta definida, es un operador de comparacin, y c es una constante en el dominio del atributo x. Las frmulas se construyen a partir de tomos usando las siguientes reglas: 1.- Un tomo es una frmula. 2.- Si P1 es una frmula, entonces tambin lo son P1 y (P1). 3.- Si P1 y P2 son frmulas, entonces tambin lo son P1P2, P1P2 y P1P2. 4.- Si P1(s) es una frmula que contiene una variable de tupla libre, entonces sr(P1(s)) y sr(P1(s)) tambin lo son. Como en el lgebra relacional, es posible escribir expresiones equivalentes que en apariencia no son idnticas, como estas tres: 1.- P1P2 es equivalente a (P1P2). 2.- tr(P1(t)) es equivalente a tr(P1(t)). 3.- P1P2 es equivalente a P1P2 3.3.3. Seguridad de expresiones. Una relacin en el lgebra relacional de tuplas puede generar una relacin infinita. Supngase: {t|(tprstamo)} Existe un nmero infinito de tuplas que no estn en prstamo. La mayora contienen valores que ni siquiera estn en la BD, por lo que no queremos permitir estas expresiones. Para ayudarnos a definir una restriccin introducimos el concepto de dominio de una frmula relacioanl de tuplas, P. El dominio de P, representado dom(P) es el conjunto de todos los valores referenciados por P. as, como el conjunto de todos los valores que aparecen en una o ms relaciones cuyos nombres aparecen en P. Por ejemplo, dom(tprstamo t[cantidad]>1200) es el conjunto de todos los valores que aparecen en prstamo mayores que 1200, y dom((tprstamo)) es el conjunto de todos los valores que no aparecen en prstamo. Decimos que una expresin {t|P(t)} es segura si todos los valores que aparecen en el resultado son valores de dom(P). 3.3.4. Poder expresivo de los lenguajes. El clculo relacional de tuplas restringido es equivalente en poder expresivo al lgebra relacional. Esto quiere decir que para cada expresin en el lgebra relacional existe una relacin equivalente en el lgebra relacional de tuplas.
23
Bases de Datos 2.- xy, donde x e y son variables de dominio, y es un operador de comparacin (<, , =, , >). Es requisito de los atributos x e y tengan dominios que puedan compararse. 3.- xc, donde x es una variable de dominio, es un operador de comparacin, y c es una constante en el dominio del atributo para el cual x es una variable de dominio. Las frmulas se construyen a partir de tomos usando las siguientes reglas: 1.- Un tomo es una frmula. 2.- Si P1 es una frmula, entonces tambin lo son P1 y (P1). 3.- Si P1 y P2 son frmulas, entonces tambin lo son P1P2, P1P2 y P1P2. 4.- Si P1(x) es una frmula en x, donde x es una variable de dominio, entonces x(P1(x)) y x(P1(x)) tambin son frmulas. Para abreviar la notacin escribimos a,b,c(P(a,b,c)) en lugar de a(b(c(P(a,b,c)))) 3.4.2. Consultas ejemplo. Ahora damos consultas en el clculo relacional de dominios para los ejemplos ya considerados. Obsrvese el parecido con las correspondientes del clculo relacional de tuplas. 1.- Encontrar nombre_sucursal, nmero_prstamo, nombre_cliente y cantidad de prstamos > 1200. {<b,l,c,a>|<b,l,c,a>prstamo a>1200} 2.- Encontrar a todos los clientes que tienen un prstamo en Perrydge y las ciudades en que viven. {<c,x>|b,l,a(<b,l,c,a>prstamo b=Perrydge y(<c,y,x>cliente))} 3.- Encontrar a todos los clientes que tienen una cuenta en todas las sucursales de Brooklyn. {<c>|x,y,z(<x,y,z>sucursal zBrooklyn (a,n(<x,a,c,n>depsito)))} Interpretamos esta expresin como el conjunto de todas las tuplas nombre_cliente <c> tal que para todas las tuplas (nombre_sucursal, activo, ciudad_sucursal) <x,y,z>, al menos una de las siguientes declaraciones es verdadera. <x,y,z> no es una tupla de la relacin sucursal, y por tanto no corresponde a una sucursal de Brooklyn. z no tiene el valor Brooklyn. El cliente c tiene una cuenta (con nmero de cuenta a y saldo n)en la sucursal x. 3.4.3. Seguridad de las expresiones. Una expresin como {<b,c,l,a>|(<b,c,l,a>prstamo)} no es segura porque permite valores en el resultado que no estn en el dominio de la expresin. Para el clculo relacional de dominios debemos preocuparnos tambin por la forma de las frmulas dentro de las clasulas existe y para todos. En el clculo relacional de tuplas restringimos cualquier variable cuantificada existencialmente a moverse sobre una relacin especfica. Ahora aadimos reglas a la definicin de seguridad para tratar con casos como el ejemplo anterior. Decimos que una expresin {<x1, x2, , xn>|P(x1, x2, , xn)} es segura si se cumplen todas las condiciones siguientes: 1.- Todos los valores que aparecen en tuplas de la expresin son valores de dom(P). 2.- Para cada subfrmula existe de la forma x(P1(x)), la subfrmula es verdadera si, y slo si, existe un valor x de dom(P1) tal que P1(x) es verdadero. 3.- Para cada subfrmula para todos de la forma x(P1(x)), la subfrmula es verdadera si, y slo si, P1(x) es verdadero para todos los valores de x de dom(P1). El propsito de estas reglas adicionales es asegurar que podemos probar las subfrmulas para todos y existe sin tener que probar infinitas posibilidades. 3.4.4. Poder expresivo de los lenguajes. Como el clculo relacional de dominios se restringe a expresiones seguras, es equivalente al clculo relacional de tuplas restringido a expresiones seguras, por lo que es equivalente al lgebra relacional.
24
Tema 3. Modelo relacional. depsito deposito - nombre_cliente=Smith (depsito) 3.5.2. Insercin. Para insertar datos en una relacin, bien especificamos la tupla que se va a insertar o escribimos una consulta cuyo resultado sea un conjunto de tuplas que se va a insertar. En este ltimo caso, los valores de los atributos para las tuplas insertadas deben ser miembros del dominio de los atributos, y las tuplas insertadas deben ser del mismo orden. En lgebra relacional una insercin se representa: rrE La insercin de una sola tupla se expresa haciendo que E sea una relacin constante que contiene una tupla. Supngase que queremos insertar el hecho de que Smith tiene 1200 dlares en la cuenta 9732 de Perrydge. depsito depsito {(Perryde, 9732, Smith, 1200)} Podramos querer insertar tuplas basadas en el resultado de una consulta. Supngase que queremos proporcionar a todos los clientes con prstamos en Perrydge una cuenta de ahorros de 200 dlares. EL nmero de prstamo servir como nmero de cuenta. r1 (nombre_sucursal=Perrydge (prstamo)) r2 nombre_sucursal,nmero_prstamo, nombre_cliente (r1) depsito depsito (r2 x {(200)}) 3.5.3. Actualizacin. En ciertas ocasiones podemos querer cambiar un valor en una tupla sin cambiar todos los valores de la tupla. Para ello usamos el operador actualizacin que tiene la forma: AE (r ) donde r es una relacin con atributo A al cual se le asigna el valor de la expresin E. La expresin E es cualquier expresin aritmtica que implica constantes y atributos de planificacin de relacin r. Sopngase que estamos pagando el 5% de inters a todas las cuentas: saldosaldo * 1,05 (depsito) La sentencia anterior se aplica una vez a cada tulpa de depsito. Pero ahora supngamos que queremos dar el 6% a cuentas de ms de 10000 dlares y el 5% al resto: saldosaldo * 1,06 (saldo>10.000 (depsito) saldosaldo * 1,05 (saldo>10.000 (depsito) Es importante el orden en que aplicamos las expresiones de actualizar. Si cambiamos el orden, una cuenta cuyo saldo estuviera justo por debajo de 10000 recibira el 11,3% de inters.
3.6. Vistas.
En los ejemplos expuestos hemos operado en el nivel del modelo conceptual, es decir, hemos supuesto que la coleccin de relaciones que se nos dan son las relaciones reales almacenadas en la BD. No es conveniente que todos los usuarios vean el modelo conceptual completo. Las consideraciones de seguridad pueden requerir que se escondan ciertos datos al usuario. Cualquier relacin que no es parte del modelo conceptual, pero se hace visible al usuario como una relacin virtual se llama vista. Puesto que las relaciones reales en el modelo conceptual pueden modificarse, generalmente no es posible almacenar una relacin correspondiente a una vista. Una vista debe volverse a calcular para cada consulta que se refiere a ella. Cuando se define una vista, el DBMS debe almacenar la definicin de la vista. As, la definicin de vista no es una expresin del lgebra relacional. Ms bien, hace que se guarde una expresin que se va a sustituir en consultas utilizando la vista. 3.6.1. Definicin de vista. Una vista se define usando la sentencia create view de la forma create view v as <expresin de consulta> donde <expresin de consulta> es cualquier expresin legal de consulta en lgebra relacional. El nombre de la vista se representa por v. Considerse la vista que consta de sucursales y sus clientes: create view todos_clientes as nombre_sucursal, nombre_cliente (depsito) nombre_sucursal, nombre_cliente (prstamo) Una vez que se ha definido la vista, el nombre de la vista puede usarse para referirse a la relacin virtual que genera la vista. Los nombres de vistas pueden aparecer en cualquier lugar que pueda aparecer el nombre de una relacin. 3.6.2. Actualizacin por medio de vistas y valores nulos.
25
Bases de Datos Aunque las vistas son una herramienta til para las consultas, presentan valores importantes si las actualizaciones, inserciones o eliminaciones se expresan usando vistas. La dificultad es que una modificacin de la BD expresada en trminos de vistas debe traducirse en una modificacin de las relaciones reales en el modelo conceptual de la BD. Para ilustrar el problema considrese la vista info_prstamo, definida create view info_prstamo as nombre_sucursal, nmero_prstamo, nombre_cliente (prstamo) Puesto que permitimos que un nombre de vista aparezca en cualquier lugar, podramos escribir info_prstamo info_prstamo {(Perrydge, 3, Ruth)} Esta insercin debe estar representada por una insercin en la relacin prstamo, ya que prstamo es la relacin real. Sin embargo, para insertar una tupla en prstamo, debemos tener algn valor para cantidad. Existen dos enfoques: 1.- Rechazar la insercin y devolver un mensaje de error al usuario. 2.- Insertar una tupla (Perrydge, 3, Ruth, null) en la relacin prstamo. El simbolo null representa un valor_nulo o valor_en_lugar_de. Significa que el valor es desconocido o no existe. Todas las comparaciones que implican null son falsas por definicin. El problema general de la modificacin de BD por medio de vistas ha sido el tema de investigaciones sustanciales. Otro rea de inters relacionado con vistas es el modelo de relacin universal. En este modelo se da al usuario una vista que consta de una relacin. Esta relacin es el producto natural de todas las relaciones en la BD relacional real. La principal ventaja de este modelo es que los usuarios no necesitan preocuparse de recordar que atributos estn en la relacin. As, la mayor parte de las consultas son ms fciles de formular en un DBMS de relacin universal que en uno de relacin estndar. Quedan cuestiones sin resolver referentes a modificaciones de BD de relacin universal y todava no se ha llegado a un consenso acerca de cul es la mejor definicin del significado de ciertos tipos complejos de consultas de relacin universal.
26
4.1. SQL.
Existen numerosas versiones de SQL. La versin original fue desarrollada en el San Jos Research Laboratory de IBM, y originalmente se llam Sequel. Fue implementado como parte del Sistema R en los primeros setenta. Ha evolucionado hasta cambiar su nombre a SQL (Structured Query Language, Lenguaje de consulta estructurado). Ahora numerosos productos soportan el SQL. En 1986, el American National Standards Institute (ANSI) public un SQL estndar. IBM ha publicado su propio estndar de SQL inmerso, el Systems Application Architecture Database Interface (SAA-SQL). SQL se ha establecido claramente como el lenguaje de BD relacional estndar. El lenguaje SQL tiene varias partes: n Lenguaje de definicin de datos (DDL). El SQL-DDL proporciona rdenes para definir esquemas de relacin, eliminar relaciones, crear ndices y modificar esquemas de relacin. n Lenguaje de manipulacin de datos interactivo. El SQL-DML incluye un lenguaje de consultas basado en el lgebra relacional y el clculo relacional de tuplas. Tambin incluye ordenes para insertar, eliminar y modificar tuplas de la BD. n Lenguaje de manipulacin de datos inmerso (DML). La forma inmersa de SQL est diseada para usar dentro de los lenguajes de programacin de propsito general, como Cobol, Pascal, o C. n Definicin de vista. El SQL-DDL incluye ordenes para definir vistas. n Autorizacin. El SQL-DDL incluye rdenes para especificar derechos de acceso a relaciones y vistas. n Integridad. El lenguaje Sequel original incluye rdenes para especificar restricciones de integridad complejas. Versiones recientes de SQL proporcionan nicamente una forma limitada de comprobacin de integridad. n Control de transacciones. SQL incluye rdenes para especificar el comienzo y final de las transacciones. Varias implementaciones permiten el bloqueo explcito de los datos de control de concurrencia. En esta seccin cubrimos solo el DDL bsico, el DML interactivo y las vistas. 4.1.1. Estructura bsica. La estructura bsica en una instruccin en SQL constra de tres clusulas: select, from y where. n La clusula select corresponde a la operacin proyeccin del lgebra relacional. Se usa para listar los atributos que se desean en el resultado de una consulta. n La clusula from corresponde a la operacin de producto cartesiano del lgebra relacional. Lista las relaciones que se van a examinar en la evaluacin de la expresin. n La clusula where corresponde al predicado de seleccin del lgebra relacional. Consta de un predicado que incluye atributos de las relaciones que aparecen en la clusula from. Una consulta tpica en SQL tiene la forma select A1, A2, , An from r1, r2, , rm where P es equivalente a la expresin del lgebra relacional: A1, A2, , An (P (r1 x r2 x x rm)) Si se omite la clusula where, el predicado P es verdadero. La lista de atributos puede sustituirse por un asterisco (*) para seleccionar todos los atributos de todas las relaciones que aparecen en la clusula from. SQL forma el producto cartesiano de las relaciones nombradas en from, realiza una seleccin del lgebra relacional usando el predicado de la clusula where y despus proyecta el resultado a los atributos de la clusula select. El resultado de una consulta en SQL es una relacin. Ejemplo: select nombre_sucursal from depsito 4.1.2. Operaciones de conjuntos y tuplas duplicadas. Los lenguajes de consulta formales se basan en la nocin matemtica de relacin como un conjunto. Por ello nunca aparecen tuplas duplicadas en las relaciones. En la prctica, la eliminacin de duplicados lleva bastante tiempo, por
27
Bases de Datos lo que SQL permite duplicados en las relaciones. En aquellos casos en los que queremos forzar la eliminacin de duplicados, insertamos la palabra clave distinct despus de select. select distinct nombre_sucursal from depsito SQL permite el uso de la palabra all para especificar explcitamente que no se eliminen duplicados. select all nombre_sucursal from depsito 4.1.3. Operaciones de conjuntos. SQL incluye las operaciones union, intersect y minus que operan sobre relaciones y corresponden a las operaciones del lgebra relacional , , -. Para encontrar a todos los clientes que tienen que tienen un prstamo, una cuenta, o los dos en la sucursal Perryridge escribimos: (select nombre_cliente from depsito where nombre_sucursal = Perryridge) union (select nombre_cliente from prstamo where nombre_sucursal = Perryridge) Por omisin la operacin union elimina las tuplas duplicadas. Para retener duplicados se debe escribir union all. Aunque la operacin union es parte del SQL estndar de ANSI, varios productos no la soportan. Las operaciones intersect y minus eran parte del Sequel, pero no estn incluidas en el estndar. Es posible expresar estas operaciones utilizando otras caractersticas del SQL estndar de ANSI. 4.1.4. Predicados y conectores. SQL no tiene una representacin directa del producto natural, sin embargo, puesto que el producto natural se define en funcin de un producto cartesiano, una seleccin y una proyeccin, es relativamente sencillo escribir una expresin en SQL para el producto natural. Por ejemplo, encontrar el nombre y la ciudad de todos los clientes que tienen un prstamo en alguna sucursal: select distinct cliente.nombre_cliente, ciudad_cliente from prstamo, cliente where prstamo.nombre_cliente = cliente.nombre_cliente Obsrvese que SQL usa la notacin nombre_relacin.nombre_atributo, como el lgebra relacional, para evitar ambigedad. Ampliemos la consulta anterior, requiriendo tambin que todos los clientes tengan un prstamo en la sucursal Perryridge. Para escribir esta consulta, necesitamos declarar los limites en la clusula where, conectados por el conector lgico and. select distinct cliente.nombre_cliente, ciudad_cliente from prstamo, cliente where prstamo.nombre_cliente = cliente.nombre_cliente and nombre_sucu rsal = Perryridge SQL usa los conectores lgicos and or y not en vez de los smbolos matemticos , , . Muchas implementaciones de SQL incluyen funciones aritmticas especiales para tipos de datos particulares, por ejemplo , IBM SAA-SQL incluye numerosas funciones para el tipo de datos fecha. SQL incluye un operador de comparacin between para simplificar clusulas where que especifican que un valor sea menor o igual que un valor dado y mayor o igual que otro. select nmero_cuenta select nmero_cuenta from depsito from depsito where saldo >= 9000 and saldo <= 10000 where saldo between 9000 and 10000 Anlogamente, podemos usar el operador de comparacin not between. SQL tambin incluye un operador dde seleccin para comparaciones de cadenas de caracteres. Los modelos se describen usando dos caracteres especiales: n tanto por ciento (%). El carcter % es igual a cualquier subcadena. n subrayado (_). El carcter _ es igual a cualquier carcter. Los modelos son sensibles al tipo de letra, es decir, los caracteres en mayscula no son iguales a los caracteres en minscula. Para mostrar la igualdad, consideremos los ejemplos: Perry% es igual a cualquier subcadena que empiece por Perry %idge% es igual a cualquier cadena que contenga idge _ _ _ es igual a cualquier cadena de tres caracteres _ _ _ % es igual a cualquier subcadena de al menos tres carcteres Los modelos se expresan en SQL usando el operador de comparacin like. Considrese la consulta encontrar los nombres de todos los clientes cuya calle incluya la cadena Main : select nombre_cliente
28
Tema 4. Lenguajes relacionales comerciales. from cliente where calle like %Main% Para que los modelos incluyan caracteres de modelos especiales (% y _), SQL permite la especificacin de un carcter de escape carcter. El carcter de escape se usa inmediatamente antes de un carcter de modelo especial para indicar que el carcter de modelo especial se va a tratar como un carcter normal. Definimos el carcter de escape para una comparacin like usando la palabra clave escape. Considrense los ejemplos con el carcter \ como carcter de escape: like ab\%cd% escape \ es igual a todas las cadenas que empiezan por ab%cd like ab\\cd% escape \ es igual a todas las cadenas que empiezan por ab\cd. SQL permite buscar desigualdades en vez de igualdades usando el operador de comparacin not like. 4.1.5. Pertenencia a un conjunto. SQL se basa en el clculo relacional para operaciones que permiten probar la pertenencia de tuplas a una relacin. El conector in prueba si se es miembro de un conjunto, donde el conjunto es una coleccin de valores producidos por una clusula select. El conector not in prueba la no pertenencia. Considrese encontrar a todos los clientes que tienen un prstamo y una cuenta en la sucursal Perryridge. Empezamos encontrando a todos los clientes que tienen cuenta, con la subconsulta: (select nombre_cliente from depsito where nombre_sucursal = Perryridge) Despus necesitamos encontrar los clientes con prstamos de Perryridge y que aparecen en la lista de clientes que tienen cuenta que acabamos de conseguir. Hacemos esto incorporando la subconsulta en un select externo. La consulta resultante es: select nombre_cliente from depsito where nombre_sucursal = Perryridge and nombre_cliente in (select nombre_cliente from depsito where nombre_sucursal = Perryridge) Este ejemplo muestra que es posible escribir la misma consulta de varias formas en SQL. Hemos probado la pertenencia a una relacin de una atributo. Es posible probar la pertenencia a una relacin arbitraria. SQL usa la notacin <v1, v2, , vn> para representar una tupla con n atributos que contiene los valores v1, v2, , vn. Utilizando esta notacin, podemos encontrar a todos los clientes que tienen una cuenta y un prstamo en la sucursal Perryridge. select distinct nombre_cliente from depsito where nombre_sucursal = Perryridge and <nombre_sucursal, nombre_cliente> in (select nombre_sucursal, nombre_cliente from depsito) 4.1.6. Variables de tupla. SQL toma prestada la notacin de variables de tupla del clculo relacional de tuplas. Una variable de tupla en SQL debe estar asociada con una relacin determinada. Las variables de tuplas se definen en la clusula from. Por ejemplo, encontrar el nombre y la ciudad de todos los clientes que tienen un prstamo en alguna sucursal. select distinct T.nombre_cliente, ciudad_cliente from prstamo S, cliente T where S.nombre_cliente = T.nombre_cliente Ntese que una variable de tupla se define en la clusula from colocndola despus del nombre de la relacin con que esta asociada, separada por uno o ms espacios. En consultas que contienen subconsultas, se aplica una regla de mbito a las variables de tupla. En una subconsulta, est permitido usar slo variables definidas en la misma subconsulta o en cualquier consulta que la contenga. Si una variable de tupla est definida tanto localmente como globalmente en una consulta que la contiene, se aplica la definicin local. Cuando escribimos nombre_relacin.nombre_atributo, el nombre de la relacin es una variable de tupla definida implcitamente. Las variables de tupla son muy tiles para comparar dos tuplas de la misma relacin. En tales casos el lgebra relacional usa la operacin renombrar. select distinct T.nombre_cliente from depsito S, depsito T. where S.nombre_cliente = Jones and S.nombre_sucursal = T.nombre_sucursal 4.1.7. Comparacin de conjuntos. Considrese la consulta Encontrar los nombres de todas las sucursales que tienen un activo mayor que alguna sucursal de Brooklyn. SQL ofrece la frase mayor que algn y se representa por > some.
29
Bases de Datos select nombre_sucursal from sucursal where activo > some (select activo from sucursal where ciudad_sucursal = Brooklyn) La subconsulta interior genera el conjunto de todos los valores de los activos de las sucursales de Brooklyn. La comparacin > some en la clusula where del select externo es verdadera si el valor activo de la tupla es mayor que al menos un miembro del conjunto de los activos de las sucursales de Brooklyn. SQL tambin permite las comparaciones >some, some, some, = some y some. La palabra clave any es sinnimo de some en SQL. Ahora modifiquemos la consulta. Encontremos los nombres de todas las sucursales que tienen un activo mayor que todas las sucursales de Brooklyn. La construccin > all corresponde a la frase mayor que todos. select nombre_sucursal from sucursal where activo > all (select activo from sucursal where ciudad_sucursal = Brooklyn) SQL permite las comparaciones < all, all, all, = all, all. Puesto que un select genera un conjunto de tuplas, podemos querer comparar conjuntos para determinar si un contiene todos los miembros de algn otro conjunto. Tales comparaciones se hacen en SQL usando las contrucciones contains y not contains. Considrese encontrar a todos los clientes que tienen una cuenta en todas las sucursales de Brooklyn. Para cada cliente, necesitamos ver si el conjunto de todas las sucursales en las que el cliente tiene una cuenta contiene al conjunto de todas las sucursales de Brooklyn. select distinct S.nombre_cliente from depsito S where (select T.nombre_sucursal from depsito where S.nombre_cliente = T.nombre_cliente) contains (select nombre_sucursal from sucursal where ciudad_sucursal = Brooklyn) La contruccin contains fue introducida en el Sequel original, pero fue omitida en versiones posteriores y no aparece en el ANSI estndar, probablemente por que es extremadamente caro. 4.1.8. Pruebas para relaciones vacas. SQL incluye una caracterstica para probar si una subconsulta tiene alguna tupla en su resultado. La construccin exists devuelve el valor true si la subconsulta del argumento no est vaca. Podemos encontrar a todos los clientes que tienen una cuenta y un prstamo en la sucursal Perryridge escribiendo:
select nombre_cliente from cliente where exists (select * from depsito where depsito.nombre_cliente = cliente.nombre_cliente and nombre_sucursal = Perryridge) and exists (select * from prstamo where prstamo.nombre_cliente = cliente.nombre_cliente and nombre_sucursal = Perryridge) La no existencia de tuplas en una subconsulta puede probarse usando la construccin no exists. Considrese de nuevo encontrar a todos los clientes que tienen una cuenta en todas las sucursales de Brooklyn. Usando la construccin minus, podemos escribir la consulta como: select distinct Snombre_cliente from depsito S where not exists ((select nombre_sucursal from sucursal where ciudad_sucursal = Brooklyn) minus (select T.nombre_sucursal from depsito T where S.nombre_cliente = T.nombre_cliente)) La segunda subconsulta encuentra todas las sucursales en las que el cliente S.nombre_cliente tiene una cuneta. As, el select externo toma a cada cliente y prueba si el conjunto de todas las sucursalessituadas en Brooklyn menos el conjunto de todas las sucursales en las que el cliente tiene cuenta, est vaco. 4.1.9. Ordenacin de la presentacin de tuplas.
30
Tema 4. Lenguajes relacionales comerciales. SQL ofrece al usuario cierto control sobre el orden en que se van a presentar las tuplas en una relacin. La clusula order by hace que las tuplas del resultado salgan en un orden determinado. Para listar en orden alfabtico todos los clientes escribiremos: order by nombre_cliente despus de la clusula where. Por omisin, SQL muestra los elementos en orden ascendente. Para especificar el tipo de ordenacin, podemos especificar desc para orden descendente y asc para el ascendente. Adems el orden puede realizarse sobre mltiples atributos, si queremos listar la relacin prstamo completa en orden descendente de cantidad, y si varios prstamos tienen la misma cantidad, los ordenamos en orden ascendente por nmero de prstamo con: order by cantidad desc, nmero_prstamo asc Puesto que ordenar tuplas es muy costoso, lo ms conveniente es hacerlo slo cuando sea necesario. 4.1.10. Funciones de agregacin. SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la clusula group by, el atributo o atributos dados en ella se usan para formar grupos. Las tupas con el mismo valor en todos los atributos en la clusula group by se colocan en un grupo. SQL incluye funciones para calcular: promedio (avg), mnimo (min), mximo (max), total (sum) y contar (count). Las operaciones como avg se llaman funciones de agregacin porque operan sobre grupos de tuplas. El resultado de una funcin de agregacin es un valor nico. Considrese encontrar el saldo promedio de las cuentas de todas las sucursales. select nombre_sucursal, avg (saldo) from depsito group by nombre_sucursal La retencin de duplicados es importante al calcular un promedio. Hay casos prcticos en los los duplicados deben eliminarse antes de calcular la funcin de agregacin. Si queremos eliminar duplicados, usamos la palabra clave distinct en la expresin de agregados: select *, count (distinct nombre_cliente) A veces es til declarar una condicin que se aplica a los grupos ms que a las tuplas. Por ejemplo, podriamos estar interesados en las sucursales en las que el saldo promedio de las cuentas es mayor que 1200$. Esta condicin se aplica a cada grupo construido por group by. Para expresar una consulta de este tipo, usamos la clusula having, que se aplica despus de la formacin de grupos, por lo que pueden utilizarse funciones de agregacin. Expresamos esta consulta como: select nombre_sucursal, avg (saldo) from depsito group by nombre_sucursal having avg (saldo) > 1200 Considrese encontrar las sucursales con el saldo promedio mayor. Las funciones de agregados no pueden componerse en SQL, por lo que no se puede utilizar max(avg()). Por lo que tendremos que encontrar las sucursales para las que el saldo promedio es mayor o igual que todos los saldos promedio. select nombre_sucursal from depsito group by nombre_sucursal having avg (saldo) all (select avg (saldo) from depsito group by nombre_sucursal) A veces deseamos tratar la relacin completa como un grupo nico. En tales casos no usamos la clusula group by, por lo que la funcin de agregacin count se usa frecuentemente para contar el nmero de tuplas en una relacin. La notacin para esto en SQL es count (*). select count (*) from r Si en la misma consulta aparecen una clusula where y una clusula having, primero se aplica el predicado de la where, las tuplas que lo satisfacen son colocadas en grupos por la clusula group by, y despus se aplica la having a cada grupo. Los grupos que satisfacen el predicado de having son utilizados por la clusula select para generar las tuplas del resultado. Si no hay clusula having, el conjunto completo de tuplas que satisfacen la clusula where se trata como un grupo nico. Por ejemplo, queremos encontrar el saldo promedio de todos los clientes con depsitos que viven en Harrison y tiene por lo menos tres cuentas: select avg (saldo) from depsito, cliente where depsito.nombre_cliente = cliente.nombre_cliente and ciudad_cliente = Harrison group by depsito_nombre_cliente having count (distinct nmero_cuenta) > 3 La versin estndar ANSI de SQL exige que se use count solamente como count (*) o count (distict ). Est permitido usar distinct con max y min aunque el resultado no cambie. La palabra clave all puede usarse en vez de distinct para especificar retencin de duplicados, pero puesto que all esta implcito no es necesario. 4.1.11. La potencialidad de SQL.
31
Bases de Datos SQL es tan poderoso en expresividad como el lgebra relacional, incluye las operaciones fundamentales del lgebra. En SQL el producto cartesiano se representa por from, la proyeccin con select, los predicados de seleccin en where, y adems incluye la unin y la diferencia. As, pues, podemos codificar cualquier expresin del lgebra relacional en SQL. Observamos que minus e intersect no son parte del SQL estndar, pero es posible expresarlas por medio de in y not in de SQL. SQL ofrece una rica coleccin de caractersticas, que incluyen funciones de agregacin, ordenacin de tuplas y otras capacidades no incluidas en los lenguajes formales de consulta. As, pues, SQL es estrictamente ms poderoso que el lgebra relacional. Muchas implementaciones de SQL permiten hacer consultas en SQL desde un programa escrito en un lenguaje de programacin de propsito general como Pascal o C. Esta forma incorporada de SQL ampla an ms la capacidad del programador para manipular la BD. SQL no es tan potente como un lenguaje de programacin de propsito general. 4.1.12. Modificacin de la Base de Datos. Ahora mostraremos como aadir, eliminar o modificar informacin utilizando SQL. n Eliminacin. Una solicitud de eliminacin se expresa casi de la misma forma que una consulta. Podemos suprimir solamente tuplas completas, y en SQL se expresan por medio de: delete r where P donde P representa un predicado y r representa una relacin. Las tuplas t de r para las que P(t) es cierto son eliminadas de r. Una orden delete opera sobre una sola relacin. El predicado de la clusula where puede ser tan complicado como en una consulta, e incluso puede estar vaco, eliminando todas las tuplas de la relacin. Algunos ejemplo de eliminacin son: - Suprimir todos los prstamos. delete cliente - Suprimir todas las cuentas en las sucursales de Perryridge. delete depsito where nombre_sucursal in (select nombre_sucursal from sucursal where ciudad_sucursal = Perryridge) Si la solicitud delete contiene un select incorporado que hace referencia a la relacin de la que se van a suprimir tuplas, nos enfrentamos a anomalas potenciales, por ejemplo, si que remos suprimir las cuentas con saldos inferiores a la media, cada vez que suprimimos tuplas el promedio cambia. El SQL estndar trata esto simplemente no permitiendo solicitudas de supresin de este tipo. n Insercin. Para insertar datos en una relacin, especificamos una tupla que se va a insertar o escribimos una consulta cuyo resultado es un conjunto de tuplas que se van a insertar. Las tuplas a insertar deben tener el nmero exacto de atributos, y los valores de atributos para las tuplas insertadas deben ser miembros del dominio de los atributos. La sentencia insert ms sencilla es una solicitud para insertar una tupla. insert into depsito valuse (Perryridge, 9732, Smith, 1200) Si no se recuerda el orden de los atributos, SQL permite especificar los atributos como parte de la sentencia insert. insert into depsito (nombre_sucursal, nmero_cuenta, nombre_cliente, saldo) valuse (Perryridge, 9732, Smith, 1200) Podramos querer insertar tuplas basadas en el resultado de una consulta. Supngase que queremos proporcionar a todos los clientes con prstamos en Perryrige una cuenta de 200$. El nmero de prstamo sirve como nmero de cuenta. insert into depsito select nombre_sucursal, nmero_prstamo, nombre_cliente, 200 from prstamo where nombre_sucursal = Perryridge Usamos un select para especificar un conjunto de tuplas. Cada tupla tiene el nombre_sucursal, un nmero_prstamo, el nombre_cliente y el saldo inicial de 200$. El SQL estndar prohibe el select inmerso que haga referencia a la relacin en la que las tuplas van a ser insertadas, ya que podran insertarse infinitas tuplas, dependiendo de la consulta. n Actualizaciones
32
Tema 4. Lenguajes relacionales comerciales. En ciertas situaciones podemos desear cambiar un valor en una tupla sin cambiar todos los valores en la tupla. Para ste propsito puede usarse la sentencia update, y tambin podemos elegir las tuplas que se van a actualizar por medio de una consulta. Supngase que queremos pagar el 5% de inters a todas las cuentas: update depsito set saldo = saldo * 1,05 Supngase ahora que queremos pagar el 6% de inters a las cuentas con ms de 10000$: update depsito set saldo = saldo * 1,06 where saldo > 10000 La clusula where de la sentencia update puede contener cualquier construccin legal, incluyendo selects anidados. Adems como en insert y delete, cualquier select incorporado en la clusula where de un update no debe hacer referencia a la relacin que se est actualizando. 4.1.13. Valores nulos. Es posible que para las tuplas insertadas se den valores nicamente en algunos atributos del esquema. El resto de los atributos son asignados a valores nulos representados por null. insert into depsito values (Perryridge, null, Smith, 1200) Sabemos que Smith tiene una cuenta en Perryridge de 1200$, pero se desconoce el nmero de cuenta. Si quisiramos encontrar los datos de una cierta cuenta, no se podra determinar si es esa o no, ya que todas las comapraciones con null son falsas por definicin. Sin embargo, la palabra clave especial null puede usarse en un predicado para probar si hay un valor nulo. As, para encontrar a todos los clientes que aparecen en prstamo con valores nulos para cantidad, escribimos: select distinct nombre_cliente from depsito where cantidad is null El predicado is not null prueba la ausencia de un valor nulo. La existencia de valores nulos complica el procesamiento de los operadores de agregacin. Supngase que algunos valores de prstamo tienen un valor nulo en cantidad. Considrese: select sum (cantidad) from prstamo Los valores que se van a sumar en la consulta anterior incluyen valores nulos, pero no es posible llevar a cabo la adicin usando null, por tanto, necesitamos una regla especial para manejar funciones de agregacin cuando aparecen valores nulos. Como resultado, todas las operaciones de agregacin, excepto count, ignoran tuplas con valores nulos en los atributos de los argumentos. Es posible prohibir la insercin de valores nulos usando el lenguaje de definicin de datos de SQL, que veremos en el 4.1.15. 4.1.14. Vistas. Una vista se define en SQL usando la orden create view. Para definir una vista debemos darla un nombre y declarar la consulta que calcula la vista. La forma de la orden create view es: create view v as >expresin de consulta> donde >expresin de consulta> es cualquier consulta permitida y v el nombre que le damos a la vista.. Como ejemplo, considrese la vista que consta de nombres de sucursales y de los nombres de los clientes, llamada todos_clientes. Definimos esta vista por medio de: create view todos_clientes as (select nombre_sucursal, nombre_cliente from depsito) union (select nombre_sucursal, nombre_cliente from prstamo) Los nombres de vistas pueden aparecer en cualquier sitio en que puede aparecer un nombre de relacin. Usando la vista todos_clientes podemos encontrar a todos los clientes de la sucursal Perryridge. select nombre_cliente from todos_clientes where nombre_sucursal = Perryridge La anomala en la actualizacin de vistas, que se estudio en el lgebra relacional, tambin existe en SQL. Considrese la vista info_prstamo definida por create view info_prstamo as (select nombre_sucursal, nmero_prstamo, nombre_cliente from prstamo) Puesto que SQL permite que un nombre de vista aparezca donde puede aparecer el de una relacin, podemos escribir: insert into info_prstamo values (Perryridge, 3, Ruth) Esta insercin est representada por una insercin en la relacin prstamo, ya que prstamo es la relacin real de la cual se deriva la vista info_prstamo. Por tanto, debemos tener algn valor para cantidad. Este valor es un valor vaco, as, el insert anterior resulta en la insercin de la tupla:
33
Bases de Datos (Perryridge, 3, Ruth, null) en la relacin prstamo. Como resultado, muchos DBMS basados en SQL imponen la siguiente condicin a las modificaciones que se permiten hacer a las relaciones a travs de vistas: n Se permite una modificacin a travs de una vista solo si la vista en cuestin est definida en terminos de una relacin de la BD relacional real, es decir, la BD del nivel conceptual. 4.1.15. Definicin de datos. Hasta ahora hemos supuesto que se nos da un conjunto de relaciones. Pero el conjunto de relaciones en una BD debe ser especificado al sistema por medio de un lenguaje de definicin de datos DDL. El SQL-DDL permite la especificacin no solo de un conjunto de relaciones, sino tambin de informacin sobre cada relacin, incluyendo: el esquema de cada relacin, el dominio de valores asociado a cada atributo, el conjunto de indices que se va a mantener para cada relacin, la informacin de seguridad y autorizacin para cada relacin, los limites de integridad y la estructura fsica de almacenamiento de cada relacin del disco. Trataremos aqu la definicin del esquema, dejando el resto para ms adelante. Una relacin en SQL se define usando la orden create table: create table r (A1 D1, A2, D2, , An Dn) donde r es el nombre de la relacin, cada Ai es el nombre de un atributo del esquema de relacin r, y Di es el tipo de datos de los valores en el dominio del atributo correspondiente. La orden create table tambin incluye opciones para especificar ciertas restricciones de integridad. Una relacin recin creada est inicialmente vaca. La orden insert puede usarse para cargar datos en la relacin. Para eliminar una relacin de una BD en SQL, usamos la orden drop table. La orden drop table elimina toda la informacin sobre la relacin sacada de la BD. Elimina no slo todas las tuplas de la relacin, como hara delete, sino tambin el esquema de r. Despus no se puede insertar ninguna tupla en r a menos que se vuelva a crear. drop table r La orden alter table se usa para aadir atributos a una relacin existente. Atodas las tuplas en la relacin se les asigna null como valor del nuevo atributo. La forma de la orden alter table es alter table r add A D donde r es el nombre de una relacin existente, A es el nombre del nuevo atributo y D su dominio. La orden alter aparece en algunas versiones de SQL pero no en el ANSI SQL.
4.2.2. Consultas sencillas. Para encontrar a todos los clientes que tienen una cuenta en la sucursal Perryridge sacamos el esqueleto para la relacin depsito y lo rellenamos como sigue:
Depsito Nombre_sucursa l Perrydridge Nmero_cuenta Nombre_cliente P._x Saldo
34
Tema 4. Lenguajes relacionales comerciales. La consulta anterior hace que el sistema busque en depsito las tuplas que tengan el valor Perryridge en al atributo nombre_sucursal. Para cada una de estas tuplas, el valor del atributo nombre_cliente se asigna a la variable x. El valor de la variable x se presenta, ya que la orden P. aparece en la columna nombre_cliente al lado de la variable x. QBE supone que una posicin en blanco en una fila contiene una variable nica. Como resultado, si una variable no aparece ms de una vez en una consulta, puede omitirse, por ejemplo, en la consulta anterior podiamos haber escrito P. en la columna nombre_cliente. QBE realiza la eliminacin de duplicados automticamente, para evitarla hay que insertar la orden ALL. despues de la orden P. (P.ALL.) Para representar una relacin completa, podemos crear una sola fila que contenga P. en cada campo. Alternativamente, podemos colocar una nica P. en la columna encabezada por el nombre de la relacin. QBE permite consultas que implican comparaciones aritmticas:
Prstamo P. Nombre_sucursa l Nmero_prestam o Nombre_cliente Cantidad > 1200
Las comparaciones pueden implicar slo una expresin aritmtica en la parte derecha de la operacin de comparacin (por ejemplo, >(_x + _y -20)). La expresin puede incluir variables y constantes. El espacio en la parte izquierda de la operacin de comparacin debe estar en blanco. Las operaciones de comparacin que soporta QBE son =, <, , >, y . Restringir la parte derecha a una sola operacin aritmtica implica que no podemos comparar dos variables con nombres distintos. El propsito general de las variables en QBE es forzar a que los valores de determinadas tuplas tengan el mismo valor en determinados atributos. Considrese encontrar a todos los clientes que tienen una cuenta tanyto en la sucursal Perrydridge como en la sucursal Redwood.
Depsito Nombre_sucursa l Perryridge Redwood Nmero_cuenta Nombre_cliente P._x _x Saldo
El sistema encuentra dos tuplas distintas en depsito que coinciden en el atributo nombre_cliente, donde el valor para el atributo nombre_sucursal es Perryridge, para una tupla y Renwood para la otra. Entonces se presenta el valor del atributo nombre_cliente. 4.2.3. Consulta sobre varias relaciones. QBE permite consultas que se extienden sobre varias relaciones diferentes. Las conexiones entre las diversas relaciones se logran a travs de variables que fuerzan a determinadas tuplas a tener el mismo valor en determinados atributos. Supngase que queremos encontrar el nombre y la ciudad de todos los clientes que tienen un prstamo de la sucursal Perryridge.
Prstamo Nombre_sucursa l Perryridge Cliente Nmero_prestam o Nombre_cliente _x Calle Ciudad_cliente P._y Cantidad
Nombre_cliente P._x
Cosideremos encontrar el nombre de todos los clientes que tienen una cuenta en la sucursal Perryridge pero que no tienen un prstamo de esa sucursal. Las consultas que implican negacin en QBE se expresan colocando un signo not () debajo del nombre de la relacin y al lado de una fila ejemplo.
Depsito Nombre_sucursa l Perryridge Nombre_sucursa l PErryridge Nmero_cuenta Nombre_cliente P._x Nmero_prestam o Nombre_cliente _x Cantidad Saldo
Prstamo
El puede leerse como no existe. El hecho de colocar el debajo del nombre de la relacin en vez de debajo del atributo es importante. El uso de un debajo de un nombre de atributo es equivalente a . 4.2.4. El cuadro de condiciones. A veces resulta inconveniente o imposible expresar todos los limites de las variables de dominio dentro de las tablas de esqueletos, ya que las comparaciones no pueden implicar dos variables distintas. Para superar esta dificultad, QBE incluye una caracterstica de cuadro de condiciones que permite la expresin de dichos lmites. Supngase que queremos encontrar a todos los clientes cuyo nombre no sea Jones que tengan cuentas en dos sucursales diferentes. Queremos incluir una restriccin x jones en la consulta. Esto se hace imponiendo el cuadro de condiciones e introduciendo el lmite x=Jones.
Condiciones x=Jones
35
Bases de Datos Para encontrar todos los nmeros de prstamo con cantidades entre 1300$ y 1500$ escribimos:
Prstamo Nombre_sucursa l Nmero_prestam o P. Condiciones _x1300 _x1500 Nombre_cliente Cantidad _x
QBE tambin permite que aparezcan expresiones aritmticas complejas en un cuadro de condiciones, como _y>2*_z, y tambin permite que aparezcan expresiones lgicas utilizando los operadores lgicos and y or, o los simbolos & y |, como _x=(1300 and 1500). QBE incluye un uso no convencional de la construccin or para permitir la comparacin con un conjunto de valores constantes. Para encontrar todas las sucursales que estn situadas en Brooklyn o en Queens, escribimos:
Sucursal Nombre_sucursal P. Activo Ciudad_sucursal _x
4.2.5. La relacin resultado. Si el resultado de una consulta incluye atributos de ms de una relacin, necesitamos un mecanismo para representar el resultado deseado en una sola tabla. Para realizar esto, declaramos una relacin resultado temporal que incluye todos los atributos del resultado de la consulta. La impresin del resultado deseado se hace incluyendo la orden P. solamente en la tabla esqueleto de resultado. Considrese lencontrar nombre_cliente, ciudad_cliente y nmero_cuenta para todos los clientes que tienen una cuenta en la sucursal Perryridge. Para realizar esto en QBE hacemos: n Creamos una tabla esqueleto, llamada resultado, con atributos nombre_cliente, ciudad_cliente y nmero_cuenta. El nombre de la tabla esqueleto recin creada debe ser diferente de cualquiera de los nombres de relacin de la BD que existan anteriormente. n Escribimos la consulta:
Depsito Nombre_sucursa l Perryridge Cliente Nmero_cuenta _z Calle Nombre_cliente _x Ciudad_cliente _y Nmero_cuenta _z Saldo
Nombre_cliente _x Nombre_cliente _x
4.2.6. Ordenacin de la presentacin de las tuplas. QBE ofrece al usuario un cierto control sobre el orden en el que se presentan las tuplas en una relacin. Esto puede realizarse la orden AO. (orden ascendente) o bien DO. (orden descendente) en la columna apropiada. QBE proporciona un mecanismo para clasificar y presentar datos en mltiples columnas. El orden en el que debe llevarse a cabo la clasificacin s eespecifica incluyendo con cada operador de clasificacin un entero entre parntesis.
Cliente Nombre_cliente P.AO(1). Calle Ciudad_cliente P.DO(2).
4.2.7. Operaciones de agregacin. QBE incluye los operadores de agragados AVG, MAX, MIN, SUM y CNT. Estos operadores deben ser postfijos con ALL. Para asegurar que todos los valores apropiados son considerados, por ejemplo P.SUM.ALL. Supngase que queremos eliminar los duplicados cuando se usa un operador de agregacin. Puesto que todos los operadores de agregados deben ser postfijos con ALL, debe aadirse un nuevo operador, UNQ, para especificar que queremos los duplicados eliminados, como en P.CNT.UNQ.ALL. QBE tambin ofrece la posibilidad de calcular funciones en grupos de tuplas usando el operador G., que es anlogo a la construccin group by de SQL. As, para encontrar el saldo promedio en todas las sucursales podemos escribir:
Depsito Nombre_sucursa l P.AO.G. Nmero_cuenta Nombre_cliente Saldo P.AVG.ALL._x
36
Tema 4. Lenguajes relacionales comerciales. La cuenta se puede usar para comprobar informacin negativa. Para encontrar a todos los clientes que tienen una cuenta en la sucursal Perryridge, pero para quienes no hay direccin en el fichero, escribimos:
Depsito Nombre_sucursa l Perryridge Cliente Nmero_cuenta Nombre_cliente _x Calle Ciudad_cliente Saldo
Nombre_cliente CNT.ALL._x
Condiciones CNT.ALL._x=0
El enfoque es contar el nmero de tuplas de cliente pertenecientes a cada cliente con depsito en Perryridge. Si para un cliente la cuenta es 0, sabemos que para ese cliente la direccin no est disponible. Considrese encontrar a todos los clientes que tienen una cuenta en todas las sucursales situadas en Brooklyn.
Depsito Nombre_sucursa l CNT.UNQ.ALL_ y Nmero_cuenta Nombre_cliente P.G._x Activo Ciudad_sucursal Brooklyn Brooklyn Saldo
Sucursal
Nombre_sucursal _y _z
Condiciones CNT.UNQ.ALL._y=CNT.UNQ.ALL._z
La variable de dominio z puede contener el valor de nombres de sucursales situadas en Brooklyn. As, CNT.UNQ.ALL._z es el nmero de sucursales distintas en Brooklyn. La variable de dominio y puede contener el valor de sucursales que cumplen: estar situadas en Brooklyn y que el cliente cuyo nombre es x tiene una cuenta en la sucursal. As, CNT.UNQ.ALL._y es el nmero de sucursales distintas en Brooklyn en las que el cliente x tiene una cuenta. Si CNT.UNQ.ALL._y=CNT.UNQ.ALL._z, entonces el cliente x debe tener una cuenta en todas las sucursales de Brooklyn. 4.2.8. Modificacin de la Base de Datos. En esta seccin mostramos como aadir, suprimir o cambiar informacin usando QBE. n Supresin. La supresin de tuplas de una relacin se expresa casi de la misma forma que una consulta. La principal diferencia es el empleo de D. en lugar de P. En QBE podemos eliminar tuplas completas as como valores en columnas seleccionadas. En el caso en que eliminamos informacin solamente en algunas de las columnas, se insertan valores nulos representados por -. Una orden D. opera nicamente sobre una relacin. Si queremos eliminar tuplas de distintas relaciones, debemos usar un operador D. para cada relacin. Algunos ejemplos son: Eliminar el valor de ciudad_sucursal de la sucursal Perryridge:
Sucursal Nombre_sucursal Perryridge Nombre_sucursa l Nmero_cuenta _x Condiciones _x=(1300 and 1500) Activo Ciudad_sucursal D. Saldo
n Insercin. Para insertar datos en una relacin, podemos especificar una tupla que se va a insertar o escribir una consulta cuyo resultado sea un conjunto de tuplas que se va a insertar. La insercin se hace colocando el operador I. en la expresin de la consulta. La insercin ms sencilla es una solicitud de insertar una tupla:
Depsito I. Nombre_sucursa l Peryridge Nmero_cuenta 9732 Nombre_cliente Smith Saldo 1200
Tambin podemos insertar una tupla que contiene solamente informacin parcial. De forma ms general podramos querer insertar tuplas basadas en el resultado de una consulta. Consideremos de nuevo la situacin en la queremos dar a todos los clientes de prstamos de Perryridge una cuenta de 200$, siendo el nmero de prstamo el nmero de cuenta. Escribimos:
37
Bases de Datos
Depsito I. Depsito Nombre_sucursa l Perryridge Nombre_sucursa l Perryridge Nmero_cuenta _x Nmero_prstam o _x Nombre_cliente _y Nombre_cliente _y Saldo 200 Cantidad
n Actualizaciones Existen situaciones en las que se desea cambiar un valor en una tupla sin cambiar todos los valores en la tupla. Para este propsito utilizamos el operador U.. Podemos elegir las tuplas que se van a actualizar usando una consulta. QBE, sin embargo, no permite que los usuarios actualicen los campos de claves primarias. Supngase que actualizamos el activo de Perryridge a 10.000.000$:
Sucursal Nombre_sucursal Perryridge Activo U.10000000 Ciudad_sucursal
El campo en blanco del atributo ciudad_sucursal implica que no se necesita actualizacin de ese valor. La consulta anterior actualiza el activo sin tener en cuenta el valor anterior. Hay circunstancias en las que necesitamos actualizar un valor de campo usando el valor anterior del campo. Esto puede expresarse usando dos filas: una especificando las tuplas antiguas que necesitan ser actualizadas y otra indicando las nuevas tuplas actualizadas que se van a insertar en la BD. Supngase que se estn haciendo pagos de intereses, al 5%. Escribimos:
Depsito U. Nombre_sucursa l Nmero_prstam o Nombre_cliente Cantidad _x*1,05 _x
Esta consulta especifica que cada vez recuperamos una tupla de la relacin depsito, determinamos el saldo _x, y actualizamos el saldo a _x*1,05.
4.3. QUEL.
Quel se introdujo como lenguaje de consulta para el DBMS Ingres, desarrollado en la Universidad de California, Berkeley. Una versin comercial de Ingres fue desarrollada por Relational Technology Inc.. El sistema Ingres acadmico ofreci solo el lenguaje Quel, mientras que el comercial actual ofrece Quel y SQL. 4.3.1. Estructura bsica. La estructura bsica de Quel sigue muy de cerca la del clculo relacional de tuplas. Gran parte de las consultas en Quel se expresan mediante el uso de tres tipos de clusulas: range of, retrieve y where. Cada una de las variables de tupla se declara en una clusula range of. Decimos range of t is r para declarar que t es una variable de tupla restringida a tomar valores de tuplas en la relacin r. La clusula retrieve tiene una funcin similar a la clusula select de SQL. La clusula where contiene el presicado de seleccin. Una consulta tpica en Quel es de la forma: range of t1 is r1 range of tm is rm retrieve (ti.Aj, , tk.Al) where P Las tx son las variables de tupla, rx son relaciones y las Ax son atributos. Quel, como SQL, usa la notacin t.A para expresar el valor de la variable de tupla t en el atributo A Esto significa lo mismo que t[a] en el clculo relacional de tuplas. Quel no incluye operaciones del lgebra relacional como intersect, union y minus. Adems, Quel no permite subconsultas anidadas. Estas limitaciones no reducen el poder expresivo de Quel, ms bien eliminan algunas formas alternativas de expresar una consulta cara al usuario. 4.3.2. Consultas sencillas. Para encontrar el nombre de todos los clientes que tienen una cuneta en Perryridge escribimos: range of t is depsito retrieve (t.nombre_cliente) where t.nombre_sucursal = Perryridge Esta consulta no elimina duplicados. Para eliminarlos debemos aadir la palabra clave unique a la clusula retrieve de la forma:retrieve unique (t.nombre_cliente). Para mostrar una consulta en Quel que implique ms de una relacin, consideremos encontrar el nombre y la ciudad de todos los clientes que tienen un prstamo en Perryridge: range of t is prstamo
38
Tema 4. Lenguajes relacionales comerciales. range of s is cliente retrieve (t.nombre_cliente, s.ciudad_cliente) where t.nombre_sucursal = Perryridge and t.nombre_cliente= s.nombre_cliente Obsrvese que Quel, como SQL, usa los conectores lgicos and, or y not, en vez de los matemticos , , y . Como en SQL, necesitamos expresar el predicado del producto explcitamente. Quel no tiene una notacin especial para el producto natural. 4.3.3. Variables de tupla. Para ciertas consultas necesitamos tener dos variables de tupla que tengan como rango la misma relacin. Considrese encontrar los nombres de todos los clientes que tienen una cuenta en la misma sucursal en la que Jones tiene una cuenta. range of t is depsito range of s is depsito retrieve (t.nombre_cliente) where s.nombre_cliente = Jones and t.nombre_sucursal= s.nombre_sucursal Puesto que la consulta anterior necesita que comparemos las tuplas pertenecientes a Jones con cada tupla de depsito, necesitamos dos variables de tupla distintas cuyo rango sea depsito. Sin embargo, es frecuente el caso de que una consulta requiera solo una variable de tupla cuyo rango sea una relacin. En dichos casos, podemos omitir la sentencia range of para esa relacin y usar el nombre de relacin como una variable de tupla declarada implcitamente. Siguiendo este convenio, para encontrar el nombre de todos los clientes que tienen un prstamo y una cuenta en la sucursal Perryridge: retrieve unique (prstamo.nombre_cliente) where depsito.nombre_sucursal = Perryridge and prstamo.nombre_sucursal = Perryridge and depsito.nombre_cliente = prstamo.nombre_cliente El Quel acadmico original no permite el uso de variables de tupla declaradas implcitamente. 4.3.4. Funciones de agregacin. Las funciones de agregacin en Quel calculan funciones sobre grupos de tuplas. Toman una forma diferente de la de SQL, en Quel, el agrupamiento se especifica como parte de cada expresin de agregacin. Las expresiones de agregacin en Quel pueden tomar las formas siguientes: funcin de agregacin (t.A) funcin de agregacin (t.A where P) funcin de agregacin (t.A by S.B1, , S.Bn where P) donde funcin de agregacin puede ser count, sum, avg, max, min, countu, sumu, avgu, o any; t es una variable de tupla; A, B1 y Bn son atributos, y P es un predicado similar al de la clusula where. Una expresin de agregacin puede aparecer en cualquier lugar donde puede aparecer una constante. El significado intuitivo de count, sum, avg, max y min es intuitivo, any se explicar ms adelante y countu, sumu y avgu son idnticas a count, sum y avg respectivamente, excepto que eliminan duplicados de sus operandos. Para encontrar el saldo promedio de cuenta para todas las cuentas de la sucursal Perryridge, escribimos: range of t is depsito retrieve avg (t.saldo where t.nombre_sucursal = Perryridge) En la clusula pueden aparecer valores de agregacin. Supngase que queremos encontrar todas las cuentas cuyo saldo sea mayor que el promedio de todos los saldos del banco: range of u is depsito range of t is depsito retrieve (t.nmero_cuenta) where t.saldo > avg (u.saldo) Consideremos ahora una modificacin de esta consulta. En vez de usar el saldo promedio del banco, consideremos solo la sucursal Perryridge range of u is depsito range of t is depsito retrieve (t.nmero_cuenta) where t.saldo > avg (u.saldo where u.nombre_sucursal = Perryridge) Modifiquemos an ms la consulta. Ahora queremos encontrar a todos los clientes cuyo saldo sea mayor que el saldo promedio de la sucursal donde se tiene la cuenta. En este caso necesitamos calcular para cada tupla t de depsito el saldo promedio en la sucursal t.nombre_sucursal. Para formar estos grupos de tuplas necesitamos usar la construccin by en la expresin de agregacin: range of u is depsito range of t is depsito retrieve (t.nmero_cuenta) where t.saldo > avg (u.saldo by t.nombre_sucursal where u.nombre_sucursal = Perryridge) El efecto de la construccin by en Quel es diferente al de group by en SQL. La fuente principal de esa diferencia es el papel de las variables de tupla. La variable de tupla t usada en by es la misma que se utiliza en el resto de la consulta.
39
Bases de Datos Sin embargo, todas las dems variables de tuplas son locales de la misma expresin de agregacin, incluso si una variable con el mismo nombre aparece en otra parte de la consulta. Consideremos encontrar el nombre de todos los clientes que tienen una cuenta en Perryridge, epro no tienen un prstamo en Perryridge. Podemos escribir esta consulta en Quel usando la operacin de agregacin count si pensamos en la consulta de la forma encontrar el nombre de todos los clientes que tienen una cuenta en Perryridge y para quienes el nmero de prstamos en la sucursal Perryridge es cero. Range of t is depsito range of u is prstamo retrieve unique (t.nombre_cliente) where t.nombre_sucursal = Perryridge and count (u.nmero_prstamo by t.nombre_cliente where u.nombre_sucursal = Perryridge and u.nombre_cliente = t,nombre_cliente) = 0 Quel ofrece otra funcin de agregacin que es aplicable a este ejemplo, llamada any. Si sustituimos count en la consulta por any, obtenemos 1 si la cuenta es mayor que 0, de lo contrario obtenemos 0. La funcin any permite la ejecucin ms rpida de la consulta, ya que el procesamiento puede detenerse tan pronto como se encuentre una tupla. El uso de una comparacin con any es anlogo al cuantificador existe del clculo relacional. Como un ejemplo ms complicado, considrese encontrar el nombre de todos los clientes que tienen una cuenta en todas las sucursales de Brooklyn. Nuestra estrategia ser averiguar cuantas sucursales hay en Brooklyn y despus comparar este nmero con el nmero de sucursales distintas en Brooklyn en las que cada cliente tiene una cuenta: range of t is depsito range of s is sucursal range of u is sucursal retrieve unique (t.nombre_cliente) where countu (s.nombre_sucursal by t.nombre_cliente where s.ciudad_sucursal = Brooklyn and s.nombre_sucursal = t,nombre_sucursal) = countu (u.nombre_sucursal where u.ciudad_sucursal = Brooklyn) Usamos by en la primera expresin countu, puesto que debemos restringir la consideracin a un nico cliente cada vez. Sin embargo, no usamos by en la ltima expresin countu, puesto que estamos interesados en contar todas las sucursales en Brooklyn independientes de las variables de tupla obligatorias a esta expresin countu. 4.3.5. Modificacin de la Base de Datos. La modificacin de la BD en Quel es similar a la modificacin en SQL, aunque la sintaxis es un poco distinta. n Eliminacin. La forma de una eliminacin en Quel es range of t is r delete t where P La variable de tupla t puede estar definida explcitamente. El predicado P puede ser cualquier predicado vlido en Quel. Si se omite la clusula where, se eliminan todas las tuplas en la relacin.. Por ejemplo, eliminar todas las cuentas de las sucursales de Needham ser: range of t is depsito range of u is sucursal delete t where t.nombre_sucursal = u.nombre_sucursal and u.ciudad_sucursal = Needham n Insercin. La insercin en Quel toma dos formas generales: insercin de una sola tupla e insercin de un conjunto de tuplas. Quel usa la palabra clave append para insercin. Como ejemplos pondremos, insertar el hecho de que Smith tiene 1200$ en la cuenta 9732 en Perryridge: append to depsito (nombre_sucursal = Perryridge, , saldo = 1200) Proporcionar a todos los clientes con prstamos en Perryridge una cuenta de 200$, siendo el nmero de prstamo el nmero de cuenta: range of t is prstamo append to depsito (t.nombre_sucursal, nmero_cuenta = t.nmero_prstamo, t.nombre_cliente, saldo = 200) where t.nombre_sucursal = Perryridge n Actualizaciones. Las actualizaciones se expresan en Quel usando la orden replace. Por ejemplo, para pagar el 6% de inters a las cuentes de ms de 10000$ y el 5% al resto. Escribiremos: range of t is depsito replace t (saldo = 1,06 * saldo)
40
Tema 4. Lenguajes relacionales comerciales. where t.saldo > 10000 replace t (saldo = 1,05 * saldo) where t.saldo 10000 4.3.6. Operaciones de conjuntos. Consideremos una consulta para la cual se us la operacin union en SQL, como es encontrar el nombre de todos los clientes que tienen una cuenta, un prstamo o ambos en Perryridge. Puesto que no tenemos una operacin union en Quel, y sabemos que Quel est basado en el clculo relacional de tuplas, podramos guiarnos por la expresin del clculo relacional de tuplas para esta consulta: {t|sprstamo (t[nombre_cliente] = s[nombre_cliente] s[nombre_sucursal] = Perryridge) udepsito (t[nombre_sucursal] = u[nombre_sucursal] u[nombre_sucursal] = Perryridge)} La expresin anterior no nos conduce a una consulta en Quel. El problema es que en la copnsulta del clculo relacional de tuplas, obtenemos los clientes tanto de variable de tupla s como de la u. En Quel, la clusula retrieve debe ser una de las siguientes: retrieve s.nombre_cliente retrieve u.nombre_cliente Si elegimos la primera, excluimos a los clientes que tienen depsitos pero no prstamos, si elegimos la segunda sucede lo contrario. Para escribir esta consulta en Quel, debemos hacer una nueva relacin e insertar tuplas en ella, llamada temp. Obtenemos los clientes con depsitos de la sucursal Perryridge escribiendo: range of u is depsito retrieve into temp unique (u.nombre_cliente) where u.nombre_sucursal = Perryridge La clusula into temp hace que se cree una nueva relacin, que contiene el resultado de esta consulta. Ahora podemos encontrar a todos los clientes con prstamos de la sucursal Perryridge e insertarlos en la recin creada relacin temp. Hacemos esto por medio de la orden append: range of s is prstamo append to temp unique (s.nombre_cliente) where s.nombre_sucursal = Perryridge Ahora tenemos una relacin temp que contiene a todos los clientes que tienen una cuenta, un prstamo, o ambos, en Perryridge. El uso de la palabra clave unique asegura que se han eliminado todos los duplicados. La estrategia de utilizar append nos permite realizar uniones en Quel. Para realizar una diferencia de conjuntos r-s creamos una relacin temporal representada por r y eliminamos las tuplas de esta relacin temporal que tambin estn en s. Por ejemplo, si queremos encontrar el nombre de todos los clientes que tienen una cuenta en Perryridge pero que no tienen un prstamo de Perryridge: range of u is depsito retrieve into temp unique (u.nombre_cliente) where u.nombre_sucursal = Perryridge range of s is prstamo range of t is temp delete (t) where s.nombre_sucursal = Perryridge and t.nombre_cliente = s.nombre_cliente La relacin temp contiene la lista de clientes deseada, por lo que escribimos el final de la consulta: range of t is temp retrieve unique (t.nombre_cliente)
41
43
Bases de Datos Considrese un par de relaciones r(R ) y s(S) y el producto natural r|x|s. Puede darse el caso de que haya una tupla t en r que no se corresponda con ninguna tupla en s. Es decir, no hay ninguna t en s tal que tr[RS]=ts[RS]. Dichas tupla se llaman tuplas colgadas. Supngase que hay una tupla t en depsito con t1[nombre_sucursal = Lunartown], pero no hay no hay ninguna tupla en la relacin sucursal para Lunartown. Esta sera una situacin no deseable. Esperamos que la relacin sucursal liste todas las sucursales, por tanto, t hara referencia a una cuenta de una sucursal que no existe. Esta claro que queremos tener una restriccin de integridad que prohiba tuplas colgadas de este tipo. Sin embargo, no todas las instancias de tuplas colgadas son no deseables. Supngase que hay una tupla t en la relacin sucursal con t2[nombre_sucursal = Mokan], pero no hay ninguna tupla en depsito para Mokan. En este caso existe una sucursal que no tiene cuentas, y aunque no es deseable es posible esta situacin. Para ver la diferencia entre estos dos ejemplos, recordamos que nombre_sucursal es la clave primaria de esquema_sucursal. Puesto que nombre_sucursal aparece en esquema_depsito, las tuplas depsito hacen referencia a la clave primaria de sucursal. decimos que el atributo nombre_sucursal en esquema_depsito es una clave exterior, ya que nombre_sucursal es la clave primaria de una planificacin de relaciones distinta de esquema_depsito. Sin embargo, el atributo nombre_sucursal en esquema_sucursal no es una clave exterior ya que nombre_sucursal no es la clave de ningn otro esquema de relaciones. As, la distincin entre estos dos ejemplos de tuplas colgadas es la presencia de una clave exterior. Sean r1(R1) y r2(R2) relaciones con claves primarias K 1 y K 2 respectivamente. Decimos que un subconjunto de R2 es una clave exterior con referencia K 1 en la relacin r1 si es necesario que para cada t2 en r2 haya una tupla t1 en r1 tal que t1[K 1] = t2[].El ltimo trmino surge del hecho de que la restriccin de integridad anterior puede escribirse como (r2)k1(r1). Ntese que para que una restriccin de integridad referencial tenga sentido, o bien = K1, o y K1 deben ser conjuntos de atributos compatibles. 5.2.2. Integridad referencial en el modelo E-R. Las restricciones de integridad referencial se presentan frecuentemente. Si obtenemos el esquema de BD relacional construyendo tablas desde diagramas E-R, entonces todas las relaciones que surgen de un conjunto de relaciones tienen restricciones de integridad referencial. Por ejemplo, un conjunto de relaciones n-ario R, referente a los conjuntos de entidades E 1, E 2, , E n. K i representa la clave primaria de E i. Los atributos del esquema de relaciones para el conjunto de relaciones R incluyen K 1 K2 Kn. Cada K i del esquema de R es una clave exterior que conduce a una restriccin de integridad referencial.
Otra fuente de restricciones de integridad referencial son los conjuntos de entidades dbiles. Recuerdese que el esquema de relaciones para un conjunto de entidades dbil debe incluir la clave primaria del conjunto de entidades del cual depende. As pues, el esquema de relaciones para cada conjunto de entidades dbil uncluye una clave exterior que conduce a una restriccin de integridad referencial. 5.2.3. Modificacin de la base de datos. Las modificaciones de la BD pueden causar violaciones de la integridad referencial. A continuacin listamos la prueba que debe hacerse para cada tipo de modificacin de la BD para proteger la restriccin de integridad referencial siguiente: (r2) k(r1) n Insertar. Si una tupla t2 se inserta en r2, el sistema debe asegurar que existe una tupla t1 en r1, tal que t1[K] = t2[]. Es decir: t2[]k(r1) n Eliminar. Si una tupla t1 se elimina en r1, el sistema debe calcular el conjunto de tuplas en r2 que hacen referencia a t1: =t1[K](r2) Si este conjunto no est vaco, o la orden de eliminar se rechaza como un error, se deben eliminar las tuplas que hacen referencia a t1. La ltima solucin puede llevar a eliminaciones en forma de cascada, ya que las tuplas pueden hacer referencia a t1, y as respectivamente. n Actualizar. Debemos considerar dos casos para actualizar: actualizaciones a la relacin que hace referencia (r2) y actualizaciones a la relacin referenciada (r1).
44
Tema 5. Restricciones de integridad. Si se actualiza una tupla t2 en la relacin r2 y la actualizacin modifica valores para la clave exterior , entonces se hace una prueba similar a la del caso de insertar.t2 representa el nuevo valor de la tupla t2. El sistema debe asegurar que: t2[]k(r1) Si se actualiza una tupla t1 en r1 y la actualizacin modifica valores para la clave primaria (K), entonces se hace una prueba similar a la del caso de eliminar. El sistema debe calcular: =t1[K](r2) usando el valor antiguo de t1 (se aplica el valor de antes de la actualizacin). Si el conjunto no est vaco, la actualizacin se rechaza como un error. 5.2.4. Integridad referencial en SQL. El SQL estndar original no inclua sentencias para especificar claves exteriores. Una caracterstica de intensificacin de la integridad ha sido aprobada como un aadido al estndar. Esta caracterstica permite la especificacin de claves primarias y candidatas y de claves exteriores como parte de la sentencia create table: n La clusula primary key de la sentencia create table incluye una lista de los atributos que comprenden la clave primaria. n La clusula unique key incluye una lista de los atributos que comprenden una clave candidata. n La clusula foreign key incluye una lista de los atributos que comprenden la clave exterior y el nombre de la relacin a la que hace referencia la clave exterior. create table depsito (nombre_sucursal char (15) not null, nmero_cuenta char (10) nombre_cliente char (20) not null saldo integer, primary key (nmero_cuenta, nombre_cliente), foreign key (nombre_sucursal) references sucursal foreign key (nombre_cliente) references cliente) ) Cualquier atributo que sea miembro de una clave candidata debe ser not null. As pues, en la definicin de depsito necesitamos especificar nmero_cuenta y nombre_cliente como not null. Esta permitido tener valores vacos en una clave exterior a menos que dicha clave exterior sea miembro de una clave candidata.
45
Bases de Datos Consideremos la siguiente relacin: A B C D a1 b1 c1 d1 a1 b2 c1 d2 a2 b2 c2 d2 a2 b3 c2 d3 a3 b3 c2 d4 Obsrvese que A C se satisface. Hay dos tuplas que tienen el valor a1 en A, y que tienen el mismo valor c1 en C, de la misma forma que ocurre con los valores a2 y c2. No existen otros pares de tuplas distintos que tengan el mismo valor en A. sin embargo no se satisface la dependencia funcional C A. La relacin r satisface muchas otras dependencias funcionales, incluyendo, por ejemplo, la dependencia funcional AB D, usando AB como abreviatura de {A, B}. Obsrvese que no hay ningn par de tuplas distintas t1 y t2 tales que t1[AB] = t2[AB]. Por tanto, si t1[AB] = t2[AB] debe cumplirse que t1 = t2 y, as, t1[D] = t2[D]. De este modo, r satisface AB D. Se dice que algunas dependencias funcionales son triviales porque se satisfacen por todas las relaciones. Por ejemplo, todas las relaciones que incluyen el atributo A satisfacen A A, y de manera similar, todas las relaciones que incluyen el atributo A satisfacen AB A. En general, una dependencia funcional de la forma es trivial si . Para distinguir entre los conceptos de una relacin que satisface una dependencia y una dependencia que se cumple en un esquema volvemos al ejemplo bancario. Consideremos la relacin cliente. Vemos que se satisface calle ciudad_cliente, pero es posible que dos ciudades tengan calles con el mismo nombre. As pues, es posible tener una instancia de la relacin cliente en la que no se satisfaga calle ciudad_cliente. Por tanto, no incluiramos calle ciudad_cliente en el conjunto de dependencias funcionales que se cumplen en esquema_cliente. En la relacin prstamo vemos que se satisface nmero_prstamo cantidad, ya que cada prstamo debe tener una nica cantidad. Por tanto, queremos exigir que la relacin prstamo satisfaga nmero_prstamocantidad en todo momento. En otras palabras, imponemos la restriccin de que se cumpla nmero_prstamo cantidad en esquema_prstamo. En lo que sigue suponemos que al disear una BD relacional primero listamos aquellas dependencias funcionales que se deben cumplir siempre. En el ejemplo bancario la lista de dependencias incluye: Esquema_sucursal: nombre_sucursal ciudad_sucursal nombre_sucursal activo Esquema_cliente: nombre_cliente ciudad_cliente nombre_cliente calle Esquema prstamo: nmero_prstamo cantidad nmero_prstamo nombre_sucursal Esquema_depsito: nmero_cuenta saldo nmero_cuenta nombre_sucursal 5.3.2. Cierre de un conjunto de dependencias funcionales. No es suficiente considerar un conjunto dado de dependencias funcionales. Ademas necesitamos considerar todas las dependencias funcionales que se cumplen. Veremos que, dado un conjunto F de dependencias funcionales, podemos probar que se cumplen otras ciertas dependencias funcionales. Se dice que F implica lgicamente dichas dependencias funcionales. Supngase que nos dan un esquema de relaciones R = (A, B, C, G, H, I) y el conjunto de dependencias funcionales: AB AC CG H CG I BH La dependencia funcional A H se implica lgicamente. Es decir, podemos demostrar que siempre que se cumpla el conjunto dado de dependencias funcionales, A H tambin debe cumplirse. Supngase que t1 y t2 son tuplas tales que t1[A] = t2[A]. Puesto que nos dan que A B, se deduce de la definicin de dependencia funcional que t1[B] = t2[B]. Entonces, puesto que nos dan B H se deduce que t1[H] = t2[H]. Por tanto, hemos demostrado que siempre que t1 y t2 son tuplas tales que t1[A] = t2[A], tambin se cumple que t1[H] = t2[H]. Pero sta es exactamente la definicin de A H. Sea F un conjunto de dependencias funcionales. El cierre de F es el conjunto de dependencias funcionales que F implica lgicamente. Indicamos el cierre de F por F+. Dado F podemos calcular F+ directamente de la definicin formal de dependencia funcional, pero si F es grande este proceso sera largo y difcil, por lo que existen tcnicas ms sencillas para deducir dependencias funcionales. La primera tcnica se basa en tres axiomas o reglas de inferencia para dependencias funcionales. Aplicando estas reglas repetidamente, podemos encontrar F+ completo dado F.. Adoptaremos el convenio de usar letras griegas para conjuntos de atributos y letras latinas maysculas para atributos individuales, as mismo utilizamos para representar . n Regla de reflexividad. Si es un conjunto de atributos y , entonces se cumple . n Regla de aumento. Si se cumple y es un conjunto de atributos, entonces se cumple .
46
Tema 5. Restricciones de integridad. n Regla de transitividad. Si se cumple , y se cumple , entonces se cumple . Estas reglas son seguras porque no generan dependencias funcionales incorrectas, y son completas porque para un conjunto F de dependencias funcionales, nos permiten generar F+ por completo. Esta coleccin de reglas se llama axiomas de Armstrong en honor de la persona que los propuso. Aunque los axiomas de Armstrong son completos, resulta pesado usarlos directamente para el clculo de F+, por lo que existen unas reglas adicionales para facilitar esta tarea: n Regla de unin. Si se cumplen y , entonces se cumple . n Regla de descomposicin. Si se cumple , entonces se cumplen y . n Regla de pseudotransitividad. Si se cumplen y , entonces se cumple . Apliquemos estas reglas al ejemplo anterior del esquema R=(A, B, C, G, H, I) y el conjunto F de dependencias funcionales {AB, AC, CGH, CGI, BH}. Algunos miembros de F+ son: AH. Puesto que se cumplen AB y BH, aplicamos la regla de la transitividad, cumplindose AH. CGHI. Puesto que se cumplen CGH y CGI, la regla de unin implica CGHI. AGI. Necesitamos varios pasos para demostrarla. Primero, como se cumple AC, con la regla de aumento vemos que AGCG, y como tenemos CGI, por la regla de la transitividad AGI. 5.3.3. Cierre de conjuntos de atributos. Para comprobar que un conjunto es una superclave debemos idear un algoritmo para calcular el conjunto de atributos determinados funcionalmente por . Veremos que un algoritmo de este tipo, tambin es til como parte del clculo del cierre de un conjunto F de dependencias funcionales. Sea un conjunto de atributos. Al conjunto de todos los atributos determinados funcionalmente por bajo un conjunto F de dependencias funcionales se le llama cierre de bajo F y re representa por +. Ahora mostramos un algoritmo para calcular +. La entrada es un conjunto F de dependencias funcionales y el conjunto de atributos. La salida se almacena en la variable resultado. resultado:= ; while (cambios en resultado) do for each dependencia funcional in F do begin if resultado then resultado:= resultado ; end Usemos el algoritmo para calcular (AG)+ con las dependencias funcionales definidas anteriormente. Empezamos con resultado = AG. La primera vez que ejecutamos el bucle while para probar cada dependencia funcional encontramos que: AB nos hace incluier B en el resultado, ya que A B esta en F, A resultado (que es aG), por tanto resultado:=resultadoB. AC hace que el resultado se convierta en ABCG. CGH hace que el resultado sea ABCGH. CGI hace que el resultado se convierta en ABCGHI. La segunda vez que ejecutamos el bucle while, no se aaden atributos a resultado y el algoritmo termina. La regla de unin implica que resultado , as determina funcionalmente cualquier resultado nuevo generado por el bucle while. Por tanto, cualquier atributo devuelto por el algoritmo est en +. Es fcil ver que el algoritmo encunetra + completo. Si hay algn atributo en + que no est todava en resultado, entonces debe haber una dependencia funcional para la cual resultado y al menos un atributo de F no est en resultado. Resulta ser que en el peor de los casos este algoritmo puede tardar un tiempo que es una funcin cuadrtica del tamao de F, as que existen algoritmos ms rpidos. 5.3.4. Recubrimiento cannico. Para minimizar el nmero de dependencias funcionales que necesitan ser probadas en caso de actualizacin, restringimos un conjunto dado F de dependencias funcionales a un recubrimiento cannico de F. Un recubrimiento cannico de F es un conjunto de dependencias tal que F implica lgicamente a todas las dependencias en Fc y Fc implica lgicamente a todas las dependencias de F. Adems Fc debe tener las siguientes propiedades: n Cada una de las dependencias funcionales en Fc no contiene atributos extraos a . Los atributos extraos son atributos que pueden eliminarse de sin cambiar F+c. As A es extrao a si A y Fc implica lgicamente a (Fc-{}){-A}. n Cada una de las dependencias funcionales en Fc no contiene atributos extraos a . Los atributos extraos son atributos que pueden eliminarse de sin cambiar F+c. As A es extrao a si A y (Fc{}){-A}. implica lgicamente a Fc. n Cada lado izquierdo de una dependencia funcional en Fc es nico. Es decir, no existe dos dependencias 11 y 22 en Fc tales que 1=2.
47
Bases de Datos Para calcular un recubrimiento cannico para F, utilcese la regla de unin para sustituir cualquier dependencia en F de la forma 11 y 12 con 112 . Prubese cada dependencia funcional para ver si hay un atributo extrao a . Para cada dependencia comprubese si hay un atributo extrao a . Este proceso se debe repetir hasta que no ocurra ningn cambio en el bucle. Considrese el siguiente conjunto de dependencias funcionales F={ABC, BC, AB, ABC} en el esquema (A, B, C). Calculemos el recubrimiento cannico de F. Hay dos dependencias con el mismo atributo en el lado izquierdo de la flecha ABC y AB, por lo que las combinamos en ABC. A es extrao a ABC porque BC implica lgicamente a ABC, y as ((F-{ABC}){BC} implica lgicamente a Fc. Como resultado de suprimir A de ABC, obtenemos que BC, la cual ya est en el conjunto de dependencias funcionales. En este momento, el conjunto de dependencias funcionales es F={ABC, BC}. Obsrvese que ahora se cumplen las propiedades de un recubrimiento cannico.
5.4. Afirmaciones.
Una afirmacin es un predicado que expresa una condicin que se desea que siempre satisfaga la BD. Las restricciones de dominio, las dependencias funcionales y las restricciones de integridad referencial son formas especiales de afirmacin, sin embargo, existen muchas restricciones que no pueden expresarse usando solamente estas tres formas especiales. Entre los ejemplos de dichos lmites estn: que cada cliente de prstamos debe tener una cuenta con un saldo mnimo de 1000$, y que cada sucursal no puede prestar ms dinero que su activo. Cuando se hace una afirmacin, el sistema prueba su validez. Si la afirmacin es vlida, entonces cualquier futura modificacin de la BD est permitida slo si no se provoca que se viole la afirmacin. El elevado tiempo de prueba y mantenimiento de las afirmaciones ha llevado a la mayora de los que desarrollan los sistemas a omitir el soporte para afirmaciones generales. La propuesta original para el lenguaje SQL inclua una construccin de propsito general assert, para la expresin de restricciones de integridad. Una afirmacin perteneciente a una nica relacin toma la forma: assert <nom_afirmacin> on nom_relacin> : <predicado> Por ejemplo, si queremos definir una restriccin de integridad que ningn saldo de cuenta sea negativo: assert limite_saldo on depsito : salo 0 Podamos haber escrito la afirmacin anterior como una restriccin de dominio. Sin embargo, la sentencia assert nos permite especificar restricciones en una relacin que no pueden expresarse como un lmite del dominio: assert limite_banquero on persona: nombre_cliente nombre_empleado Las afirmaciones pueden restringirse para aplicarse slo a modificaciones de la BD como en el caso de que queremos prevenir la adicin de una cuenta a menos que el nombre del cliente aparezca en la relacin cliente. Escribimos la afirmacin siguiente: assert limite_direccin on insertion to depsito exists (select * from cliente where cliente.nombre_cliente = depsito.nombre_cliente) De hecho, la afirmacin anterior es una restriccin de integridad referencial. La forma ms general de afirmacin es: assert <nom_afirmacin> : <predicado> donde >predicado> es cualquier clusula where vlida en SQL Debido al elevado tiempo que lleva la prueba de afirmaciones arbitrarias, la sentencia assert ha desaparecido de las versiones ms recientes de SQL, incluyendo la estndar. En lugar de las afirmaciones estn las restricciones ms fciles de probar, como las de dominio, las de clave y las de integridad referencial. Sin embargo, existe una propuesta para incluir afirmaciones generales en una futura revisin del SQL estndar.
5.5. Disparadores.
Un disparador es una sentencia que el sistema ejecuta automticamente como un efecto secundario de una modificacin de la BD. Para disear un mecanismo de parador debemos: n Especificar las condiciones bajo las cuales se va a ejecutar el disparador. n Especificar las acciones que se van a tomar cuando se ejecute el disparador. Supngase que en lugar de permitir saldos negativos, el banco trata los saldos deudores poniendo el saldo de cuenta a cero y creando un prstamo en la cantidad del saldo deudor. A ste prstamo se le da un nmero igual al nmero de cuenta de la cuenta deudora.. Sea t la tupla con un saldo negativo, las acciones que se deben realizar son las siguientes: Insertar una nueva tupla s en la relacin prstamo con: s[nombre_sucursal] = t[nombre_sucursal] s[nmero_prstamo] = t [nmero_prstamo] s[cantidad] = t[saldo] s[nombre_cliente] = t [nombre_cliente] Poner t[saldo] a cero. El disparador de ste ejemplo sera:
48
Tema 5. Restricciones de integridad. define trigger saldo_deudor on update of depsito T (if new T.saldo < 0 then (insert into prstamo values (T.nombre_sucursal, T,nmero_cuenta, T.nombre_cliente, - new T.saldo) update depsito S set S.saldo = 0 where S.nmero_cuenta = T.nmero_cuenta)) El SQL estndar no incluye disparadores, aunque el Sequel original inclua caractersticas de disparador limitadas. Existen diversos sistemas con sus propias caractersticas de disparadores no estndar.
49
51
Bases de Datos informacin, la descomposicin de esquema_prstamo en esquema_cant y esquema_prest la llamamos descomposicin con prdida, descomposicin de producto con prdida. Una descomposicin diferente se llama descomposicin de producto sin prdida. Una descomposicin de producto con prdida es un mal diseo de la BD. Examinemos la descomposicin ms de cerca para ver porque tiene prdida. Esquema_prest y esquema_cant tienen una atributo en comn: cantidad. La nica forma de representar una relacin entre cant y prest es a travs de cantidad. Esto no es conveniente, ya que puede ocurrir que varios clientes tengan prstamos por las misma cantidad, pero no necesariamente en las mismas sucursales. Del mismo modo puede ocurrir que varios clientes tengan prstamos en la misma sucursal sin que haya relacin entre las cantidades de sus respectivos prstamos. Comprese esto con esquema_prestar, si descompusiramos esquema_prestar en esquema_prstamo y esquema_sucursal, estos dos esquemas tienen una atributo en comn: nombre_sucursal. As, la nica forma en que podemos representar una relacin entre nombre_cliente y activo es a travs de nombre_sucursal. La diferencia entre este ejemplo y el anterior es que el activo de una sucursal es el mismo sin importar a que cliente nos estamos refiriendo, mientras que la sucursal asociada con la cantidad de un prstamo determinado depende del cliente al que nos referimos. Para un nombre_sucursal dado, existe nicamente un valor de activo y uno de ciudad_sucursal, mientras que no puede decirse los mismo de cantidad. Es decir la dependencia funcional nombre_sucursal activo ciudad_sucursal se cumple, pero cantidad no determina funcionalmente a nombre_sucursal. La descomposicin de esquema_prestar en esquema_prstamo y esquema_sucursal es sn prdida debido a la dependencia funcional nombre_sucursal activo ciudad_sucursal. Decimos que una relacin es legal si satisface todas las reglas, o restricciones, que imponemos a la BD. Sea C un conjunto de restricciones de la BD. Una descomposicin {R1, R2, , Rn} de un esquema de relaciones R es una descomposicin de producto sin prdida de R si para todas las relaciones r del esquema R que sean legales bajo C: r=R1(r ) |x| R2(r ) |x| |x| Rn(r )
52
Tema 6. Diseo de Bases de Datos relacionales. 6.2.1.2. Conservacin de las dependencias. Es preciso considerar un objetivo ms al disear BD relacionales: la conservacin de las dependencias. Cuando se hace una actualizacin de la BD, el sistema debe poder comprobar que la actualizacin no crear una relacin ilegal, es decir, una que no satisfaga las dependencias funcionales dadas. Para comprobar las actualizaciones eficientemente es conveniente disear esquemas de la BD relacionales que permitan validar una actualizacin sin calcular los productos que reconstruyen las relaciones. Para decidir si se deben calcular los productos, necesitamos determinar que dependencias funcionales se deben probar mediante la comprobacin de cada relacin individualmente. Sea F un conjunto de dependecias funcionales en el esquema R, y sea R1, R2, , Rn una descomposicin de R. La restriccin de F a Ri es el conjunto F de todas las i + dependencias funcionales en F que incluyen nicamente atributos de R. Puesto que que todas las dependencias i funcionales en una restriccin implican atributos de slo un esquema de relaciones, es posible probar que se satisface una dependencia de este tipo comprobando solamente una relacin. El conjunto de restricciones F1, F2, , Fn es el conjunto de dependencias que pueden comprobarse de manera eficiente. Ahora debemos preguntar si es suficiente probar slo las restricciones. Sea F=F1F2Fn. F es un conjunto de dependencias funcionales en el esquema R, pero en general FF. Sin embargo, an cuando FF, puede ser que F+=F+. Si esto es cierto, entonces F implica lgicamente a todas las dependencias de F+, y si verificamos que se satisface F, hamos verificado que se satisface F. Decimos que una descomposicin que satisface F+=F+ es una descomposicin que conserva las dependencias. Ahora presentamos el algoritmo que sirve para probar la conservacin de dependencias. La entrada es un conjunto D = {R1, R2, , Rn} de esquemas de relaciones descompuestos y un conjunto F de dependencias funcionales: calcular F+; for each esquema R1 en D do begin Fi := restriccin de F+ a Ri; end F := for each restriccin Fi do begin F = F Fi end calcualr F+ if (F+ = F+) then return (verdadero) else return (falso) Ahora podemos demostrar que la descomposicin de esquema_prestar conserva las dependencias. Para ver esto, consideramos cada uno de los miembros del conjunto F de dependencias funcionales que necesitamos que se cumplan en esquema_prestar y mostramos que cada uno puede probarse en por lo menos una relacin de la descomposicin. La dependencia funcional nombre_sucursal activo ciudad_sucursal puede probarse usando esquema_sucursal = (nombre_sucursal, activo, ciudad_sucursal). La dependencia funcional nmero_prstamo cantidad nombre_sucursal puede probarse usando esquema_info_prstamo = (nombre_sucursal, nmero_prstamo, cantidad). Como vemos, a menudo es ms fcil no aplicar al algoritmo para probar la conservacin de dependencias, ya que el primer paso, el clculo de F+, se lleva un tiempo exponencial.
6.2.1.3. Repeticin de informacin. La descomposicin de esquema_prestar no padece del problema de la repeticin de informacin. La descomposicin separa los datos de la sucursal y de prstamo en relaciones distintas, eliminando redundancias. En la descomposicin, la relacin del esquema esquema_prstamo_cliente contiene la relacin nmero_prstamo, nombre_cliente, cosa que no sucede en los dems esquemas. Por tanto, tenemos una tupla para cada cliente para un prstamo en la relacin de esquema_info_prstamo. En las otras relaciones que incluyen nmero_prstamo, solo se necesita que aparezca una tupla por prstamo. Claramente, la falta de redundancia que presenta la descomposicin es deseable. Las distintas formas normales representan los grados de eliminacin de redundancia que pueden lograrse. 6.2.2. Forma normal Boyce-Codd. Una de las formas normales ms deseables que podemos obtener es la forma normal Boyce-Codd (BCNF). Un esquema de relaciones de R est en BCNF con respecto a un conjunto F de dependencias funcionales si para todas las dependencias en F+ de la forma , donde R y R, por lo menos se cumple una de las siguientes condiciones: n es una dependencia funcional trivial, es decir . n es una superclave del esquema R.
53
Bases de Datos Un diseo de BD est en BCNF si cada uno de los miembros del conjunto de los esquemas de relacin que corresponde el diseo est en BCNF. Para ilustrarlo, consideremos los esquemas de relacin siguientes, y sus respectivas dependencias funcionales: esquema_sucursal = (nombre_sucursal, activo, ciudad_sucursal) nombre_sucursal activo ciudad_sucursal esquema_cliente = (nombre_cliente, calle, ciudad_cliente) nombre_cliente calle ciudad_cliente esquema_depsito = (nombre_sucursal, nmero_cuenta, nombre_cliente. saldo) nmero_cuenta saldo nombre_sucursal esquema_prstamo = (nombre_sucursal, nmero_prstamo, nombre_cliente, cantidad) nmero_prstamo cantidad nombre_sucursal Decimos que esquema_cliente est en BCNF. Obsrvese que una clave candidata del esquema es nombre_cliente. Las nicas dependencias no triviales que se cumplen en esquema_cliente tienen nombre_cliente en el lado izquierdo de la flecha. Puesto que nombre_cliente es una clave candidata, las dependencias funcionales con nombre_cliente en el lado izquierdo no violan la definicin de BCNF. De la misma forma se puede demostrar que esquema_sucursal est en BCNF. Sin embargo, esquema_prstamo no est en BCNF., obsrvese que nmero_prstamo no es una superclave de esquema prstamo, puesto que podramos tener un par de tuplas representando un nico prstamo que se hizo a dos personas. Como no se listaron las dependencias funcionales que excluyen el caso anterior, nmero_prstamo no es una clave candidata. Sin embargo, la dependencia funcional nmero_prstamo cantidad no es trivial. Por tanto esquema_prstamo no satisface la definicin de BCNF. Decimos que esquema_prstamo no est en forma deseable, ya que padece el problema de repeticin de informacin, ya que si hay varios nombres de clientes asociados con un prstamo, estamos forzados a repetir el nombre de la sucursal y la cantidad. Podemos eliminar esta redundancia rediseando la BD de forma que todos los clientes estn en BCNF, descomponiendo esquema_prstamo en: esquema_info_prstamo = (nombre_sucursal, nmero_prstamo, cantidad) esquema_prstamo_cliente = (nombre_cliente, nmero_prstamo) Esta es una descomposicin de producto sin prdida. Para determinar si estos esquemas estn en BCNF, necesitamos saber que dependencias funcionales les son aplicables. Nmero_prstamo cantidad nombre_sucursal se aplica a esquema_info_prstamo, y que solo se aplican dependencias funcionales triviales a esquema_prstamo_cliente. Aunque nmero_prestamo no es una superclave dse esquema_prstamo, si es una clave candidata de esquema_info_prstamo. As, los dos esquemas de la descomposicin estn en BCNF. Ahora es posible evitar la redundancia en el caso en que varios clientes estn asociados a un prstamo. Existe exactamente una tupla por cada prstamo en la relacin esquema_info_prstamo, y una tupla por cada cliente de cada prstamo en la relacin esquema_prstamo_cliente. As, no tenemos que repetir el nombre de la sucursal y la cantidad una vez por cada cliente asociado a un prstamo. Para que el diseo completo de la BD este en BCNF, debemos descomponer esquema_depsito de una forma parecida en los esquemas: esquema_info_depsito = (nombre_sucursal, nmero_cuenta, saldo) esquema_depsito_cliente = (nombre_cliente, nmero_cuenta) Ahora ya podemos establecer un mtodo general para generar una coleccin de esquemas BCNF. Si R no est en BCNF, no podemos descomponer R en una coleccin de esquemas BCNF R , R2, , Rn usando el siguiente 1 algoritmo, que genera no slo una descomposicin BCNF sino tambin una descomposicin de producto sin prdida. Para ver que el algoritmo genera solamente descomposiciones sin prdida, obsrvese que cuando sustituimos un esquema Ri por (Ri-) y (, ), se cumple la dependencia y (Ri-)(, )=. resultado := {R}; listo := falso; calcular F+; while (not listo) do if (existe un esquema Ri en resultado que no est en BCNF) then begin sea una dependencia funcional no trivial que se cumple en Ri tal que Ri no est en F+, y =; resultado := (resultado - Ri) (Ri-) (, ); end eslse listo := verdadero; Apliquemos el algoritmo de descomposicin BCNF al esquema: esquema_prestar = ( nombre_sucursal, activo, ciudad_sucursal, nmero_prstamo, nombre_cliente, cantidad) El conjunto de dependencias funcionales que necesitamos que se cumplan en esquema_prestar es: nombre_sucursal activo ciudad_sucursal nmero_prstamo cantidad nombre_sucursal Una clave candidata de este esquema es {nmero_prstamo, nombre_cliente}. Podemos aplicar el algoritmo as:
54
Tema 6. Diseo de Bases de Datos relacionales. La dependencia funcional nombre_sucursal activo ciudad_sucursal se cumple en esquema_prestar, pero nombre_sucursal no es una superclave. As, esquema_prestar no esta en BCNF. Sustituimos esquema prestar por: esquema_sucursal = (nombre_sucursal, ciudad_sucursal, activo) esquema_depsito = (nombre_sucursal, nmero_prstamo, nombre_cliente, cantidad) Las nicas dependencias funcionales no triviales que se cumplen en esquema_sucursal incluyen nombre_sucursal en el lado izquierdo de la flecha. Puesto que nombre_sucursal es una clave de esquema_sucursal, la relacin esquema_sucursal est en BCNF. La dependencia funcional nmero_prstamo cantidad nombre_sucursal se cumple en esquema_depsito, pero nmero_prstamo no es una clave de esquema_depsito. Sustituimos esquema_depsito: esquema_info_prstamo = (nombre_sucursal, nmero_prstamo, cantidad) esquema_prstamo_cliente = (nombre_cliente, nmero_prstamo) que si estn en BCNF. As, la descomposicin de esquema_prestar da como resultado los tres esquemas de relaciones esquema_sucursal, esquema_info_prstamo y esquema_prstamo_cliente, cada una de las cuales est en BCNF. No todas las descomposiciones BCNF conservan las dependencias, considrese el esquema: esquema:_banquero = (nombre_sucursal, nombre_cliente, nombre_banquero) El conjunto F de dependencias funcionales que necesitamos que se cumpla en esquema_banquero es: nombre_banquero nombre_sucursal nombre_cliente nombre_sucursal nombre_banquero Claramente esquema_banquero no est en BCNF puesto que nombre_banquero no es una superclave. Si aplicamos el algoritmo de descomposicin BCNF obtenemos: esquema_sucursal_banquero = (nombre_bamquero, nombre_sucursal) esquema_banquero_cliente = (nombre_cliente, nombre_banquero) Los esquemas descompuestos conservan slo nombre_banquero nombre_sucursal y las dependencias triviales, pero el cierre de {nombre_banquero nombre_sucursal} no incluye nombre_cliente nombre_sucursal nombre_banquero. La violacin de esta dependencia no puede detectarse a menos que se calcule un producto. Encontramos que las restricciones F y F2 de F a cada uno de los esquemas son las siguientes, en su 1 recubrimiento cannico: F1 = {nombre_banquero nombre_sucursal} F2 = (slo se cumplen dependencias triviales es esquema_banquero_cliente) As un recubrimiento cannico para el conjunto F es F1. Es fcil ver que la dependencia nombre_sucursal nombre_banquero no est en F+ aunque si est en F+. Por +F+ y la descomposicin no conserva las dependencias. Adems, demuestra que no siempre es posible tanto, F satisfacer los tres objetivos de diseo: BCNF Producto sin prdida Conservacin de dependencias 6.2.3. Tercera forma normal. En aquellos casos en los que no pueden satisfacerse los tres criterios de diseo, abandonamos BCNF y aceptamos una forma normal ms dbil llamada tercera forma normal ( NF). Veremos que siempre es posible 3 encontrar una descomposicin de producto sin prdida que conserve las dependencias que estn en 3NF. BCNF requiere que todas las dependencias no triviales sean de la forma , donde es una superclave. NF hace un poco menos estricta esta restriccin permitiendo las depepndencias funcionales no trivilaes cuyo lado izquierdo o sea una superclave. Un esquema de relaciones R est en 3NF con respecto a un conjunto F de dependencias funcionales si para todas las dependencias en F+ de la forma , donde R y R, por lo menos se cumple una de las condiciones siguientes: n es una depeendencia funcional trivial. n es una superclave de R. n Cada atributo A en est contenido en una clave candidata de R. La definicin de 3NF permite ciertas dependencias funcionales que no se permitan en BCNF. Una dependencia que satisface slo la tercera condicin de la definicin se llama dependencia transitiva. Obsrvese que si un esquema de relaciones est en BCNF, entonces todas las dependencias funcionales son de la forma la superclave determina un conjunto de atributos, o la dependencia es trivial. As, un esquema BCNF no puede tener ninguna dependencia transitiva. Como resultado, todo esquema BCNF est en 3NF. Volvamos al ejemplo esquema_banquero. Este esquema no tiene una descomposicin BCNF de producto sin prdida que conserve las dependencias, pero si est en 3NF. Obsrvese que {nombre_cliente, nombre_sucursal} es una clave candidata de esquema_banquero; as, el nico atributo que no est contenido en una calve candidata es nombre_banquero. La nica dependencia funcional no trivial de la forma nombre_banquero es: nombre_cliente nombre_sucursal nombre_banquero Puesto que {nombre_cliente, nombre_sucursal} es una clave candidata, esta dependencia no viola la definicin de 3NF. Ahora mostramos el algoritmo que encuentra una descomposicin en 3NF de producto sin prdida que conserva las dependencias. El hecho de que cada esquema de relaciones Ri est en 3NF se sigue directamente del requisito
55
Bases de Datos de que el conjunto F de dependencias funcionales est en forma cannica. El algoritmo asegura la conservacin de las dependencias construyendo explcitamente un esquema para cada dependencia dada. Asegura la descomposicin de producto sin prdida garantizando que por lo menos un esquema contiene una clave candidata del esquema que se est descomponiendo. Sea Fc un recubrimiento cannico de F; i:=0; for each dependencia funcional en Fc do if ninguno de los esquemas Rj 1ji contiene then begin i:= i +1; Ri:= ; end if ninguno de los esquemas Rj 1ji contiene una clave candidata de R then begin i:= i +1; Ri:= cualqueir clave candidata de R; end return (R1, R2, , Ri) Para ilustrar el algoritmo, considrese el esquema: esquema_info_banquero = (nombre_sucursal, nombre_cliente, nombre_banquero, nmero_oficina) y las dependencias funcionales: nombre_banquero nombre_sucursal nmero oficina nombre_cliente nombre_sucursal nombre_banquero En bucle for del algoritmo hace que incluyamos los siguientes esquemas en la descomposicin: esquema_oficina_banquero = ( nombre_banquero, nmero_oficina) esquema_banquero = (nombre_cliente, nombre_sucursal, nombre_banquero) Puesto que esquema_banquero contiene una clave candidata de esquema_info_banquero, hemos hecho el proceso de descomposicin.
6.2.4. Comparacin de BCNF y 3NF. Hemos visto dos formas normales: 3NF y BCNF. 3NF tiene la ventaja de que sabemos que siempre es posible obtener un diseo 3NF sin sacrificar un producto sin prdidas o la conservacin de las dependencias, pero tiene una desventaja, si no eliminamos todas las dependencias transitivas, puede ser necesario utilizar valores vacos para representar algunas de la relaciones significativas entre los datos, y est el problema de la repeticin de la informacin. Si no vemos obligados a elegir entre BCNF y la conservacin de las dependencias con 3NF, generalmente es preferible optar por 3NF. Si no podemos probar la conservacin de las dependencias eficientemente, pagamos un alto precio en el rendimiento del sistema, o un riesgo en la integridad de la BD. Con tales alternativas, la cantidad limitada de redundancia impuesta por las dependencias transitivas permitida en 3NF es la menos mala. As pues, normalmente elegimos asegurar la conservacin de las dependencias y sacrificar BCNF. Para resumir, decimos que el objetivo de un diseo de BD relacional es: BCNF Producto sin prdida Conservacin de dependencias Si no podemos lograr esto, aceptamos: 3NF Producto sin prdida Conservacin de dependencias
56
Tema 6. Diseo de Bases de Datos relacionales. 6.3.1. Dependencias multivaluadas. Las dependencias funcionales excluyen el que ciertas tuplas estn en una relacin. Si A B, entonces no podemos tener dos tuplas con los mismos valores en A y distintos en B. Las dependencias multivaluadas no excluyen la existencia de ciertas tuplas, en cambio exigen que otras tuplas de una forma determinada estn presentes en la relacin. Por esta razn las dependencias funcionales se conocen como dependencias generadoras de igualdad y las multivaluadas como dependencias generadoras de tuplas. Sea R un esquema de relaciones y sea R y R. La dependencia multivaluada se cumple en R si en cualquier relacin legal r(R ), para todos los pares de tuplas t1 y t2 en r tales que t1[]=t2[], existen las tuplas t3 y t4 en r tales que: t1[] = t2[] = t3[] = t4[] t3[] = t1[] t3[R-] = t2[R-] t4[] = t2[] t4[R-] = t1 [R-] Como ejemplo, damos un cuadro tabular de t1, t2, t3 y t4. R-- t1 a1ai ai+1 aj aj+1 an t2 a1ai bi+1 bj bj+1 bn t3 a1ai ai+1 aj bj+1 bn t4 a1ai bi+1 bj aj+1 an Intuitivamente, la dependencia multivaluada dice que la relacin entre y es indepepndiente de la relacin entre y R-. Si todas las relaciones del esquema R satisfacen la dependencia multivaluada , entonces es una dependencia multivaluada trivial del esquema R. As, es trivial si o =R. Para ilustrar la diferencia entre dependencias funcionales y multivaluadas, considrese el esquema_BC=(nmero_prstamo, nombre_cliente, calle, ciudad_cliente). Debemos repetir el nmero de prstamo una vez por cada direccin del cliente, y debemos repetir la direccin por cada uno de los prstamos que tiene el cliente. esta repeticin no es necesaria, ya que la relacin entre un cliente y su direccin es independiente de la relacin entre ese cliente y un prstamo. Si un cliente tiene un prstamo, queremos que ese prstamo est asociado con todas las direcciones del cliente. As, la siguiente relacin es ilegal: Nmero_prstamo Nombre_cliente Calle Ciudad_cliente 23 Smith North Rye 27 Smith Main Manchester Para hacer que esta relacin sea legal, necesitamos aadir las tuplas (23, Smith, Main, Manchester) y (27, Smith, North, Rye). Comparando el ejemplo anterior con la definicin de dependencia multivaluada, vemos que queremos que la dependencia multivaluada nombre_cliente calle ciudad_cliente se cumpla. La dependencia multivaluada nombre_cliente nmero_prstamo, tambin se cumplir, porque como veremos son equivalentes. Como en el caso de dependencias funcionales, usaremos dependencias multivaluadas de dos formas: n Para probar relaciones para determinar si son legales bajo un conjunto dado de dependencias funcionales y multivaluadas. n Para especificar restricciones del conjunto de relaciones legales. Por tanto, slo nos preocuparmos de las relaciones que satisfagan un conjunto de dependencias funcionales y multivaluadas. Ntese que si una relacin r no satisface una dependencia multivaluada dada, podemos construir una relacin r que satisfaga la dependencia multivaluada aadiendo tuplas a r. 6.3.2. Teora de dependencias multivaluadas. Como en le caso de las dependencias funcionales y de 3NF y de BCNF, necesitaremos dependencias multivaluadas que implica lgicamente un conjunto dado de dependencias multivaluadas. Sea D un conjunto de dependencias funcionales y multivaluadas. El cierre D+ de D es el conjunto de todas las dependencias funcionales y multivaluadas que D implica lgicamente. Podemos calcular D+ a partir de D usando las definiciones formales de dependencias funcionales y multivaluadas. Sin embargo, normalmente es ms fcil deducir los conjuntos de dependencias usando un sistema de reglas de inferencia. La lista siguiente de reglas de inferencia para dependencias funcionales y multivaluadas es segura y completa, es decir, segura porque no generan dependencias que D no implique lgicamente, y comlpeta porque nos permiten generar todas las dependencias de D+. Las tres primeras son los axiomas de Armstrong ya conocidos. n Regla de reflexividad. Si es un conjunto de atributos y entonces . n Regla de aumento. Si se cumple y es un conjunto de atributos, entonces se cumple . n Regla de transitividad. Si se cumplen y , entonces se cumple . n Regla de complementacin. Si se cumple , entonces se cumple R--.
57
Bases de Datos Regla de aumento multivaluada. Si se cumple y R y , entonces se cumple . Regla de transitividad multivaluada. Si se cumple y , entonces se cumple -. Regla de repeticin. Si se cumple , entonces se cumple . Regla de condensacin. Si se cumple y y existe tal que R y = y , entonces se cumple . Podemos simplificar el clculo del cierre utilizando las siguientes reglas: n Regla de unin multivaluada. Si se cumple y , entonces se cumple . n Regla de interseccin. Si se cumplen y , entonces se cumple . n Regla de diferencia. Si se cumplen y , entonces se cumplen y . Apliquemos estas reglas al siguiente ejemplo. Sea R=(A, B, C, G, H, I) con el conjunto de dependencias D={AB, BHI, CGH}. Ahora listamos algunos miembros de D+. ACGHI: Puesto que AB, la regla de complementacin implica que AR-B-A. R-B-A=CGHI, por tanto, ACGHI. AHI: Puesto que AB y BHI, la regla de transitividad multivaluada implica AHI-B. Puesto HI-B=HI, AHI. BH: Para demostrar esto nocesitamos aplicar la regla de condensacin. Se cumple BHI. Puesto que HHI y CGH y CGHI=, se satisface el enunciado de la regla de condensacin si es B, es HI, es CG y es H. Se concluye que BH, y por la regla de repeticin BH. ACG: Ya sabemos que ACGHI, y que AHI. Por la regla de diferencia ACGHI -HI, puesto que CGHI-HI=CG, ACG. n n n n 6.3.3. Cuarta forma normal. Volvamos al ejemplo esquema_BC=(nmero_prstamo, nombre_cliente, calle, ciudad_sucursal) en el que se cumple la dependencia multivaluada nombre_clientecalle ciudad_cliente, pero no se cumplen dependencias funcionales no triviales. Vimos anteriormente que, aunque esquema_BC est en BCNF, no es un diseo ideal, puesto que debemos repetir la informacin de la direccin de un cliente para cada prstamo. Podemos usar la dependencia multivaluada dada para mejorar el diseo de la BD, descomponiendo esquema_BC en una descomposicin de cuarta forma normal (4NF). Un esquema de relaciones R est en 4NF con respecto a un conjunto D de dependencias funcionales y multivaluadas si para todas las dependencias multivaluadas en D+ de la forma , donde R y R, se cumple por lo menos una de las siguientes condiciones: n es una dependencia multivaluada trivial n es una superclave del esquema R. Un diseo de BD est en 4NF si cada miembro del conjunto de esquemas de relaciones que comprende el diseo est en 4NF. La definicin de 4NF es distinta de la definicin de BCNF slo en el uso de dependencias multivaluadas en vez de dependencias funcionales. Todo esquema 4NF est en BCNF, ya que si un esquema R no est en BCNF, entonces existe una dependencia funcional no trivial que se cumple en R, donde no es una superclave. Puesto que implica , por la regla de repeticin, R no puede estar en 4NF. La analoga entre 4NF y BCNF se aplica al algoritmo para descomponer un esquema en 4NF, es idntico al algoritmo de descomposicin en BCNF excepto en el uso de dependencias multivaluadas en vez de funcionales. resultado := {R}; listo := falso; calcular F+; while (not listo) do if (existe un esquema Ri en resultado que no est en 4NF) then begin sea una dependencia multivaluada no trivial que se cumple en Ri tal que Ri no est en F+, y =; resultado := (resultado - Ri) (Ri-) (, ); end eslse listo := verdadero; Si aplicamos el algoritmo a esquema:_BC, encontramos que nombre_clientenmero_prstamo es una dependencia multivaluada no trivial y que nombre_cliente no es una superclave de esquema_BC. Siguiendo el algoritmo descomponemos esquema_BC en: esquema_prstamo_cliente = (nombre_cliente, nmero_prstamo) esquema_cliente = (nombre_cliente, calle, ciudad_cliente) Este par de esquemas que estn en 4NF elimina el problema de la redundancia de esquema_BC. Al igual que el caso en que se trataban nicamente dependencias funcionales, tambin estamos interesados en las descomposiciones de producto sin prdida y que conservan las dependencias.. El siguiente hecho sobre dependencias multivaluadas y productos sin prdida muestra que el algoritmo anterior genera solamente descomposiciones de producto sin prdida.
58
Tema 6. Diseo de Bases de Datos relacionales. Sea R un esquema de relaciones y D un conjunto de dependencias en R. R1 y R2 forman una descomposicin de R. Esta es una descomposicin de producto sin prdida de R si, y slo si, por lo menos una de las dependencias multivaluadas siguientes est en D+: R1R2R1 R1R2R2 Recurdese que si R1R2R1 o R1R2R2, entonces R1 y R2 son una descomposicin de producto sin prdida de R. El hecho anterior referente a las dependencias multivaluadas es una sentencia ms general de los productos sin prdida. Dice que para cada descomposicin de producto sin prdida de R en dos esquemas R1 y R2, se debe cumplir una de las dos dependencias R1R2R1 o R1R2R2. La cuestin de la conservacin de las dependencias cuando tenemos dependencias multivaluadas no es tan sencilla como en el caso de las funcionales. Sea R un esquema de relaciones y sea R1, R2, , Rn una descomposicin de R. Para un conjunto F de dependencias funcionales, la restriccin Fi de F a Ri es todas las dependencias funcionales en F+ que incluyen nicamente atributos de Ri. Ahora considrese un conjunto D de dependencias funcionales y multivaluadas. La restriccin de D a Ri es el conjunto Di, que consta de: n Todas las dependencias funcionales en D+ que incluyen nicamente atributos de Ri n Todas las dependencias multivaluadas de la forma Ri, donde Ri y est en D+. Una descomposicin del esquema R en las planificaciones R1, R2, , Rn es una descomposicin que conserva las dependencias con respecto a D si para cada conjunto de relaciones r1(R1), r2(R2), , rn(Rn) tal que para todo i, ri satisface Di, existe una relacin r(R ) que satisface D y para la cual ri=Ri(r ) para todo i. Apliquemos el algoritmo de descomposicin 4NF al esquema R=(A, B,C,G,H,I) con el conjunto de dependencias D={AB, BHI, CGH}. R no est en 4NF. Obsrvese que AB no es trivial, sin embargo A no es una superclave. Usando A en la primera iteracin del bucle while, sustituimos R por dos esquemas (A, B) y (A, C, G, H, I). (A, B) esta en 4NF, ya que todas las dependencias multivaluadas que cumplen (A, B) son triviales. Sin embargo, (A, C, G, H, I) no est en 4NF. Aplicando la dependencia CGH, sustituimos el esquema por (C, G, H) y (A, C, G, I). El primero est en 4NF, ya que AHI est en D+. Por tanto AI est es la restriccin D a (A, C, G, I). As, en una tercera iteracin del bucle while, sustituimos (A, C, G, I) por (A, I) y (A, C, G). Entonces termina el algoritmo y la descomposicin 4NF resultante es {(A, B), (C, G, H), (A, I), (A, C, G)} Esta descomposicin 4NF no conserva las dependencias ya que falla en la conservacin de BHI. Considrense las siguientes relaciones: r1 r2 r3 r4 A B C G H A I A C G a1 b1 c1 g1 h1 a1 i1 a1 c1 g1 a2 b1 c2 g2 h2 a2 i2 a2 c2 g2 como resultado de una proyeccin de la descomposicin de una relacin en (A, B, C, G, H, I). La restricin de D a (A, B,) es AB y algunas dependencias triviales., y es fcil ver que se satisface, ya que no hay dos valores de a iguales. Obsrvese que r2 satisface todas las dependencias funcionales y multivaluadas ya que no hay dos tuplas en r2 que tengan el mismo valor en ningn atributo. Lo mismo puede decirse de la otras dos relaciones. Por tanto, la versin descompuesta de la BD satisface todas las dependencias en la restriccin de D. Sin embargo, no hay ninguna relacin r en (A, B, C, G, H, I) que satisfaga D y se descomponga en esas cuatro relaciones. Ya que r=r1|x| r2|x| r3|x| r4. La relacin r no satisface BHI. Cualquier relacin s que contiene a r y satisface BHI debe incluir la tupla (a2, b 1, c2, g2, h 1, i1). Sin embargo CGH(s) incluye una tupla (c2, g2, h 1) que no est en r2. As, la descomposicin falla al detectar una violacin de BHI. Hemos visto que si nos dan un conjunto de dependencias funcionales y multivaluadas, resulta provechoso encontrar un diseo de BD que se ajuste a los tres criterios siguientes: 4NF Conservacin de dependencias Producto sin prdida Si todo lo que tenemos son dependencias funcionales, el primer criterio es justo el de BCNF. Tambin hemos visto que no siempre es posible lograr estos tres criterios. Cuando no se puedan lograr, abandonamos el objetivo de 4NF y aceptamos BCNF o incluso 3NF, si es necesario para asegurar la conservacin de las dependencias.
59
Bases de Datos Sea R un esquema de relaciones y sea R1, R2, , Rn una descomposicin de R. Se utiliza la dependencia de interseccin *(R1, R2, , Rn) para restringir el conjunto de relaciones legales a aquellas para las cuales R1, R2, , Rn es una descomposicin de producto sin prdida de R. Formalmente, si R= R1 R2 Rn decimos que una relacin r(R ) satisface la dependencia de interseccin *(R1, R2, , Rn) si: r = R1(r )|x|R2(r )|x||x|Rn(r ) Una dependencia de interseccin es trivial si una de las Ri es R. Considrese la dependencia de interseccin *(R1, R2) en el esquema R. Esta dependencia requiere que para todas las r(R ) legales: r = R1(r )|x|R2(r ) Sea R una relacin que contiene las dos tuplas t1 y t2 definida como sigue: t1[R1-R2]=(a1, a2, , ai) t2[R1-R2]=(b1, b 2, , b i) t1[R1R2]=(ai+1 , , aj) t2[R1R2]=(ai+1 , , aj) t1[R2-R1]=(aj+1 , , an) t2[R2-R1]=(bj+1 , , b n) As, t1[R1R2]= t2[R1R2], pero t1 y t2 tienen valores diferentes en todos los demas atributos. Vamos a calcular R1(r )|x|R2(r ). Cuando calculamos el producto, obtenemos dos tuplas adicionales, que son t3 y t4. Si se cumple *(R1, R2), siempre que tengamos las tuplas t1 y t2 debemos tener tambin t3 y t4. As vemos una representacin tabular de la dependencia de interseccin *(R1, R2). R1-R2 R2-R1 R1R2 t1 a1, a2, , ai ai+1 , , aj aj+1 , , an t2 b1, b 2, , b i ai+1 , , aj bj+1 , , b n t3 a1, a2, , ai ai+1 , , aj aj+1 , , an t4 b1, b 2, , b i ai+1 , , aj bj+1 , , b n De hecho, *(R1, R2) no es ms que otra forma de expresar R1R2R1. Usando las reglas de complementacin y aumento para dependencias multivaluadas, podemos demostrar que R1R2R1 implica que R1R2R2. As, *( R1, R2) es equivalente a R1R2R2. Toda dependencia de producto de la forma *( R1, R2) es equivalente a una dependencia multivaluada. Sin embargo, hay dependencias de producto que no son equivalentes a una dependencia multivaluada. El ejemplo ms sencillo de una dependencia de ste tipo est en el esquema R=(A, B, C). La dependencia de producto *((A, B), (B, C), (A, C)) no es equivalentea ninguna coleccin de dependencias multivaluadas. *((A, B), (B, C), (A, C)) r(A, B, C) A B C A B C a1 b1 c2 a1 b1 c2 a2 b1 c1 a2 b1 c1 a1 b2 c1 a1 b2 c1 a1 b1 c1 a1 b1 c1 Para ver que ningn conjunto de dependencias multivaluadas implca lgicamente a ((A, B), (B, C), (A. C)), considrese una relacin r(A, B, C). La relacin r satisface la dependencia de producto *((A, B), (B, C), (a, C)), como puede verificarse calculando: AB(r )|x|BC(r )|x|AC(r ) y demostrando que el resultado es exactamente r. Sin embargo, r no satisface ninguna dependencia multivaluada que no sea trivial. Para ver esto, comprubese que r no satisface ninguna de AB, AC, BA, BC, CA, CB. As como una dependencia multivaluada es una forma de expresar la independencia de un par de relaciones, una dependencia de producto es una forma de expresar que todas las relaciones de un conjunto son independientes. Esta nocin de independencia de relaciones es una consecuencia natural de la forma en la que generalmente definimos una relacin. Considrese esquema_prestamo = ( nombre_sucursal, nmero_prstamo, nombre_cliente, cantidad). Podemos definir una relacin prstamo como el conjunto de todas las tuplas de esquema_prstamo tales que: - El prstamo representado por nmero_prstamo lo haga la sucursal nombre_sucursal. - El prstamo representado por nmero_prstamo lo reciba el cliente nombre_cliente. - El prstamo representado por nmero_prstamo sea por cantidad$. Esta definicin de la relacin prstamo es una conjuncin de tres predicados. Sorprendentemente, puede demostrarse que esta definicin intuitiva de prstamo implica lgicamente la dependencia de producto *((nmero_prstamo, nombre_sucursal), (nmero_prstamo, nombre_cliente), (nmero_prstamo, cantidad)). As, las dependencias de producto tienen un atractivo intuitivo y corresponden a uno de los tres criterios de un buen diseo de una BD. Para dependencias funcionales y multivaluadas, fue posible dar un sistema de reglas de inferencia seguras y completas. Desafortunadamente, no se conoce un tipo de reglas as para dependencias de interseccin. 6.4.2. Forma normal de proyecto-producto.
60
Tema 6. Diseo de Bases de Datos relacionales. Un esquema de relaciones R est en forma normal de proyecto-producto (PJNF) con respecto a un conjunto D de dependencias funcionales, multivaluadas y de interseccin si para todas las dependencias de D+ de la forma *(R1, R2, , Rn) donde cada RiR y R=R1R2Rn, se cumple por lo menos una de las siguientes condiciones: n *(R1, R2, , Rn) es una dependencia de producto trivial. n Cada Ri es una superclave de R. Un diseo de BD est en PJNF si cada miembro del conjunto de esquema de relaciones que comprende el diseo est en PJNF. PJNF se llama en ocasiones quinta forma normal (5NF). Volvamos al ejemplo bancario, dada la dependencia de producto *(nmero_prstamo, cantidad), esquema_prstamo no est en PJNF. Para poner esquema_prstamo en PJNF debemos descomponerla en las tres planificaciones especificadas por la dependencia de producto: (nmero_prstamo, nombre_sucursal), (nmero_prstamo, nombre_cliente) y (nmero_prstamo, cantidad). Puesto que cada dependencia multivaluada es tambin una dependencia de interseccin, es fcil ver que cada esquema PJNF est tambin en 4NF. As, en general, no es posible encontrar una descimposicin que conserve las dependencias para un esquema dado en PJNF.
61
Bases de Datos
62
63
65
Bases de Datos En este captulo estudiaremos como pueden implementarse el gestor de archivos, el gestor de buffer, los archivos de datos y el diccionario de datos.
66
Tema 7. Estructura de archivos y sistemas. existe un sistema de archivos subyacente. Necesitamos considerar formas de representar modelos lgicos de datos en trminos de archivos. Aunque los bloques son de tamao fijo, los tamaos de los registros varan. En una BD relacional, las tuplas de relaciones distintas son ,por lo general, de tamaos distintos. En una BD de datos de red es probable que el tipo de registro propietario sea de distinto tamao que el tipo de registro miembro. Una forma de enfocar la asignacin de la BD a los archivos a almacenar en un archivo dado solamente registros de una longitud fija. Una alternativa es estructurar los archivos de una forma tal que podamos acomodar registros de varias longitudes diferentes. Los archivos de registros de longitud fija son ms fciles de implementar. 7.3.1. Registros de longitud fija. Como ejemplo, consideremos un archivo de registros depsito, definidos: type depsito = registro nombre_sucursal: char (20); nmero_cuenta: integer; nombre_cliente: char (20); saldo: real; end Si suponemos que cada carcter ocupa un byte, un entero cuatro, y un real ocho, el registro depsito tiene 52 bytes. Un enfoque sencillo es utilizar los primeros 52 bytes para el primer registro, los siguientes 52 para el segundo y as sucesivamente. Sin embargo este enfoque presenta dos problemas: 1.- Es difcil eliminar un registro de esta estructura. El espacio que ocupa el registro que se va a eliminar debe llenarse con otro registro, o debemos marcarlo para que sea ignorado. 2.- A menos que el tamao del bloque sea mltiplo de 52, algunos registros pasarn los lmites del bloque, lo que requerira tener acceso a dos bloques para leer o escribir el registro. Cuando se elimina un registro podramos mover el registro que le segua un espacio para delante, y as sucesivamente, pero esto requiere mover muchos registros, o se podra mover el ltimo registro al hueco libre. No es deseable mover registros para ocupar el espacio que deja libre un registro eliminado, ya que esto requiere tener acceso a bloques adicionales. Puesto que las inserciones suelen ser ms frecuentes que las eliminaciones, es aceptable dejar abierto el espacio que ocupa el registro eliminado y esperar una insercin posterior para ocupar el espacio. No basta simplemente marcar el registro eliminado, ya que no es fcil encontrar el espacio disponible cuando se va a realizar una insercin. Por tanto, necesitamos introducir una estructura adicional. Al principio del archivo asignamos un cierto nmero de bytes como encabezamiento del archivo. El encabezamiento contendr informacin diversa acerca del archivo. Por ahora, todo lo que hace falta almacenar aqu es la direccin del primer registro cuyo contenido se haya eliminado. Utilizamos este primer registro para almacenar la direccin del segundo registro disponible, y as, sucesivamente. Podemos considerar estas direcciones almacenadas como punteros. Al insertarse un nuevo registro, utilizamos el registro al que apunta el encabezamiento; y ste se cambia para que apunte al siguiente registro disponible. Si no hay espacio disponible aadimos el registro al final del archivo. El uso de punteros requiere mucho cuidado en la programacin. La insercin y eliminacin en archivos de registros de longitud fija es bastante fcil de implementar, porque el espacio que deja disponible un registro es exactamente el que se necesita para insertar otro. Si permitimos registros de longitud variable en un archivo, la situacin cambiara, es posible que un registro insertado no quepa en el espacio que deja libre otro eliminado, o que llene solamente parte del espacio. 7.3.2. Registros de longitud variable. Los registros de longitud variable se presentan en los DBMS de varias formas: n Almacenamiento de varios tipos de registros en un archivo. n Tipos de registros que permiten uno o ms campos de longitudes variables. n Tipos de registros que permiten campos repetidos. Existen varias tcnicas para implementar los registros de longitud variable. Para ilustrarlas utilizaremos el mismo ejemplo. El formato de registro es:
type lista_depsito = record nombre_sucursal: char (20); info_cuenta: array [1..] of record nmero_cuenta: integer; nombre_cliente: char (20); saldo: real; end end
67
Bases de Datos Definimos info_cuenta como un array con un nmero arbitrario de elementos de manera que el tamao del registro no tiene lmite. Representacin en cadena de bytes. Un mtodo sencillo para implementar los registros de longitud variable es aadir un smbolo especial de fin de registro () al final de cada registro. As podemos almacenar cada registro como una cadena de bytes consecutivos. La representacin en cadena de bytes tiene varias desventajas, las ms serias son: 1.- No es fcil volver a utilizar el espacio que ocupaba un registro eliminado. Aunque existen tcnicas para gestionar la insercin y eliminacin, resultan en un gran nmero de fragmentos pequeos de espacio que se desperdician. 2.- En general, los registros no disponen de espacio para crecer. Si un registro de longitud variable se hace ms largo debe moverse, y si el registro est sujeto, el movimiento resulta costoso. Por tanto, la representacin en cadena de bytes, normalmente, no se utiliza para almacenar registros de longitud variable. Representacin de longitud fija. Para implementar los registros de longitud variable de manera eficiente en un sistema de archivos, utilizamos uno o ms registros de longitud fija para representar un registro de longitud variable. Existen dos tcnicas para implementar archivos de registros de longitud variable utilizando registros de longitud fija: n Espacio reservado. Si hay una longitud mxima de registro que nunca se excede, podemos utilizar registros de longitud fija de esa longitud. El espacio no utilizado se llena con smbolo especial nulo o de fin de registro. n Punteros. El registro de longitud variable se representa por una lista de registros de longitud fija encadenado por medio de punteros. El mtodo de espacio reservado es til cuando gran parte de los registros es de longitud cercana al mximo. Si no es as, puede desperdiciarse una cantidad apreciable de espacio. Para representar el archivo empleando el mtodo de punteros, aadimos un campo que corresponda al puntero. Utilizamos los punteros solamente para encadenar los registros de una determinada sucursal. Una desventaja del mtodo de punteros es que desperdiciamos espacio en todos los registros menos en el primero de la cadena. Es preciso que el primero incluya el valor de nombre_sucursal, pero no los subsiguientes registros. El espacio desperdiciado es considerable, ya que esperamos que las sucursales tengan gran nmero de cuentas. Para resolver este problema permitimos dos tipos de bloques en el archivo: n Bloque ancla. Contiene el primer registro de la cadena. n Bloque de desbordamiento. Contiene registros que no son el primero. As, todos los registros dentro de un bloque tienen la misma longitud, aunque no todos los registros del archivo tienen la misma longitud.
68
Tema 7. Estructura de archivos y sistemas. Esta estrategia no es la mejor desde el punto de vista de rapidez de acceso. Cuando se hace una busqueda en una cadena se deben leer todos los bloques. Para minimizar el tiemo que se lleva una bsqueda necesitamos minimizar el tiempo que lleva transferir estos bloques a la memoria. Por tanto, conviene que los bloques de una cubeta estn almacenados en el mismo cilindro del disco o en cilindros adyacentes. Una cubeta es un conjunto de uno o ms bloques encadenados. Si quedara vaco el bloque, sera preferible que volviera a ser utilizado por la misma cadena que lo contena anteriormente. En la prctica, no es posible mantener una colocacin perfecta de los bloques en el disco sin dejar vaca una gran cantidad de espacio. Tarde o temprano, las cadenas rebosarn su cilindro y puede que no exista espacio disponible en cilindros cercanos. Si la cadena queda tan fragmentada que el rendimiento empieza a disminuir, puede reorganizarse la BD. La BD se copia en cinta y se vuelve a cargar con los bloques cambiados de sitio de forma que las cadenas no queden fragmentadas, y exista un espacio razonable para su crecimiento. Generalmente es necesario prohibir el acceso de los usuarios a la BD durante estas reorganizaciones.
69
Bases de Datos en un bloque, los registros restantes aparecern en bloques cercanos. Esta estructura de archivos, llamada agrupacin, nos permite leer muchos de los registros que se requieren leyendo slo un bloque. El uso de la agrupacin mejora el procesamiento de un producto especfico, pero resulta en un procesamiento ms lento de otros tipos de consulta, ya que para localizar todas las tuplas de una nica relacin, necesitamos encadenar todos sus registros por medio de punteros. Para determinar cuando conviene utilizar la agrupacin hay que tener en cuenta cuales son los tipos de consulta que el diseador de la BD cree que van a ser ms frecuentes. Si se utiliza con cuidado la agrupacin, puede mejorar considerablemente el rendimiento en el procesamiento de consultas.
70
Tema 7. Estructura de archivos y sistemas. El objetivo de una estrategia de reemplazo de bloques en el buffer es la minimizacin de accesos a disco. Los sistemas operativos utilizan el patrn de referencias anteriores a bloques para predecir las referencias que se harn en el futuro segn el principio de localidad. La suposicin que se hace es que es probable que se vuelva a hacer referencia a los bloques a los que se hizo referencia recientemente. Por tanto, si se debe sustituir un bloque, se sustituye aquel al que se hizo referencia menos recientemente. Esto se denomina esquema de reeemplazo de bloques LRU. El LRU es un esquema de reemplazo aceptable en sistemas operativos. Sin embargo, un DBMS puede predecir el patrn de referencias futuras con ms exactitud que un sistema operativo. Las solicitudes que hacen los usuarios al sistema operativo implican varios pasos, pero muchas veces el DBMS puede determinar por adelantado qu bloques va a necesitar cada uno de los pasos. As, los DBMS pueden tener informacin referente, por lo menos, del futuro a corto plazo. Considrese el procesamiento de un producto natural de dos relaciones, y que para procesarlo, se procesa la segunda relacin entera por cada tupla de la primera relacin. Supngase que las dos relaciones estn almacenadas en archivos separados.. Por tanto, una vez que se procese un bloque de la primera relacin, no se va a volver a necesitar hasta que se procese toda la segunda relacin, por lo que se puede eliminar de la memoria, a pesar de que se uso recientemente. El gestor del buffer debe recibir instrucciones de dejar libre el espacio que ocupa ese bloque. Esta estrategia de gestin de buffer se conoce como desechar de inmediato. Considrense ahora los bloques que contienen tuplas de la segunda relacin. Necesitamos examinar todos estos bloques una vez por cada tupla de la primera relacin. Cuando se termina el procesamiento de un bloque de la segunda relacin, sabemos que no volver a ser accedido hasta que todos los dems bloques de esta segunda relacin sean procesados. Por tanto el bloque de esta relacin que se utiliz el ltimo ser el que tarde ms en ser referenciado, y bloque ms antiguo ser el primero en ser llamado. Esto es exactamente lo opuesto a la estrategia LRU. De hecho, la estrategia ptima para sustituir bloques es la estrategia mas recientemente utilizado (MRU). Si es preciso sacar un bloque del buffer, la estrategia MRU elige el bloque que se utiliz ms recientemente. Para que la estrategia MRU funcione correctamente en este ejemplo, el sistema debe sujetar el bloque, de la segunda relacin, que se est procesando en ese momento. Despus de que se haya procesado la ltima tupla del bloque, se libera y se convierte en el bloque utilizado ms recientemente. El gestor del buffer puede utilizar informacin estadstica referente a la probabilidad de que una solicitud haga referencia a una determinada relacin. El diccionario de datos es una de las partes de la BD a la que se accede ms frecuentemente. Por ello, el gestor de buffer debe procurar no sacar los bloques del diccionario de la memoria. A menos que otros factores dicten lo contrario. Como puede ser que se acceda al ndice con mayor frecuencia que al mismo archivo, el gestor del buffer no deber, en general, sacar los bloques de ndice de la memoria mientras tenga alguna alternativa. La estrategia ideal de reemplazo de bloques de la BD necesita conocer las operaciones que se estn realizando en ella. No se conoce una sola estrategia que maneje bien todas las situaciones posibles. De hecho, un gran nmero de sistemas utiliza la estrategia LRU a pesar de sus fallos. La estrategia que utiliza el gestor de buffer para sustituir los bloques se ve influenciada por otros factores. Si el sistema est procesando en forma concurrente solicitudes de varios usuarios, puede que el subsistema de control de concurrencia tenga que retrasar ciertas solicitudes para garantizar la conservacin de la consistencia de los datos. Si el subsistema de control de concurrencia proporciona informacin al gestor del bufffer acerca de cuales son las solicitudes que se van a retrasar, el gestor del buffer puede utilizar esta informacin para alterar su estrategia de reemplazo de bloques. Los bloques que requieren las solicitudes activas (no retrasadas) pueden conservarse en el buffer a expensas de los bloques que necesitan las solicitudes retrasadas. El subsistema de recuperacin de cadas impone restricciones muy estrictas sobre la sustitucin de bloques. Si se ha modificado algn bloque, no se permitir que el gestor del buffer escriba en el disco la nueva versin del bloque del buffer, ya que esto destruira la versin antigua. En vez de ello, el gestor de bloques debe pedir la autorizacin del subsistema de recuperacin de cadas antes de grabar el bloque. Es posible que el subsistema de recuperacin de cadas exija la salida forzada de determinados bloques antes de permitir que se grabe el bloque solicitado.
71
8.2. Indexacin.
Para pemitir el acceso aleatorio rpido a los registros de un archivo se utiliza una estructura de ndice. Cada estructura de ndice est asociada con una clave de bsqueda determinada. Si el archivo est ordenado secuencialmente y elegimos incluir varios ndices en diferentes claves de busqueda, el ndice cuya clave de bsqueda especifca el orden secuencial del archivo es el ndice primario. Los dems se llaman ndices secundarios. La clave de bsqueda de un ndice primario es normalmente la clave primaria. En esta seccin suponemos que todos los archivos estn ordenados secuencialmente y , por tanto, tienen una clave de bsqueda primaria. Dichos archivos, junto con un ndice primario, se llaman archivos de ndices secuenciales. Se encuentran entre los esquemas de indexacin ms antiguos usados en los BDMS. Estn diseados para aplicaciones que requieren tanto un procesamiento secuencial del archivo completo como un acceso aleatorio a registros individuales. Hay dos tipos de ndices que pueden usarse; n ndice denso. Aparece un registro ndice para cada valor de la clave de bsqueda en el archivo. El registro contiene el valor de la clave de bsqueda y un puntero al registro. n ndice escaso. Se crean registros ndices solamente para algunos de los registros. Para localizar un registro, encontramos el registro ndice con el valor de la clave de bsqueda ms grande que sea menor o igual que el valor que estamos buscando. Empezamos en el registro al que apunta el registro ndice y seguimos los punteros del archivo hasta encontrar el registro deseado.
8.2.1. ndice primario. Generalmente es ms rpido localizar un registro con un ndice denso que con uno escaso. Sin embargo, los ndices escasos requieren menos espacio e imponen menos mantenimiento adicional para inserciones y eliminaciones.
73
Bases de Datos El diseador del sistema debe lograr un equilibrio entre el tiempo de acceso y el espacio extra. Un buen compromiso es tener un ndice escaso con una entrada de ndice por bloque. Para que esta tcnica sea completamente general, debemos considerar el caso en el que los registros para un valor de la clave de bsqueda ocupan varios bloques. Es fcil modificar el esquema para manejar esta situacin. An cuando utilizamos un ndice escaso, el ndice puede llegar a ser demasiado grande para un procesamiento eficiente. En la prctica, no es raro tener un archivo con 100.000 registros. Con 10 registros por bloque. Si tenemos un registro ndice por bloque, el ndice tiene 10.000 registros. Los registros ndice son ms pequeos que los de datos, por lo que podemos suponer que entran 100 por bloque, as pues el ndice ocupa 100 bloques. Si un ndice es lo bastante pequeo como para guardarlo en memoria, el tiempo de bsqueda es corto. Sin embargo, si le ndice es tan grande que debe guardarse en disco, una bsqueda puede ser costosa. Para resolver este problema, tratamos el ndice como cualquier otro archivo secuencial, y construimos un ndice escaso sobre el ndice primario, que puede almacenarse en memoria. Utilizando los dos niveles de indexacin, hemos ledo nicamente un bloque de ndices en vez de 100. Si suponemos que el ndice externo ya est en la memoria. Si el fichero es extremadamente grande, es posible que ni siquiera el ndice exterior quepa en memoria principal, en este caso, podemos crear otro nivel de indexacin. En la prctica, lo normal es que basten dos niveles. Frecuentemente, cada nivel de ndice corresponde a una unidad de almacenamiento fsico. As, podemos tener ndices en los niveles de pista, cilindro y disco. Sin importar cual sea la forma de ndice que se utilice, se deben actualizar todos los ndices cada vez que se inserta o elimina un registro del archivo. A continuacin describimos algoritmos para actualizar ndices de un slo nivel: n Eliminacin. Para eliminar un registro, es necesario buscar el registro que se va a eliminar. Si el registro eliminado era el ltimo que quedaba con ese valor particular de la clave de bsqueda, entonces eliminamos el valor de la clave de bsqueda del ndice. Para ndices densos, eliminamos un valor de la clave de bsqueda de la misma manera que se suprime en un archivo. Para ndices escasos, eliminamos un valor de clave sustituyendo su entrada en el ndice por el siguiente valor de la clave de bsqueda. Si el siguiente valor ya tiene una entrada de ndice, eliminamos la entrada. n Insercin. Se hace una bsqueda usando el valor de la clave de bsqueda que aparece en el registro que se va a insertar. Si el ndice es denso y el valor de la clave de bsqueda no aparece en el ndice, lo inserta. Si el ndice es escaso no se necesita hacer ningn cambio en el ndice a menos que se cree un nuevo bloque. En este caso, el primer valor de la clave de bsqueda que aparezca en el nuevo bloque se inserta en el ndice. 8.2.2. Indices secundarios. Los ndices secundarios pueden estructurarse de forma diferente a los ndices primarios. Los punteros en el ndice secundario no sealan directamente al archivo, en vez de ello, cada uno de esos punteros seala a una cubeta que contiene punteros al archivo. Este enfoque permite almacenar juntos todos los punteros de un valor de clave de bsqueda secundaria determinado. Un enfoque as es til en ciertos tipos de consultas para los que podemos hacer una parte considerable de procesamiento usando nicamente los punteros. Para las claves primarias, podemos obtener todos los punteros para un valor de la clave de bsqueda primaria determinado utilizando una revisin secuencial. Una revisin secuencial en orden de clave primaria es eficiente porque los registros estn almacenados fsicamente en un orden que se aproxima al orden de la clave primaria. Sin embargo, no podemos almacenar un archivo fsicamente ordenado tanto por la clave primaria como por una clave secundaria. Como elorden de clave secundaria y el de clave fsica son distintos, si intentamos examinar el archivo secuencialmente en orden de clave secundaria, es probable que la lectura de cada registro requiera la lectura de un nuevo bloque de disco. Almacenando punteros en una cubeta, eliminamos la necesidad de punteros adicionales en los registros mismos y de revisiones secuenciales en orden de clave secundaria. El ndice secundario puede ser denso o escaso. Si es denso, entonces el puntero de cada cubeta individual seala a los registros con el valor de la clave de bsqueda apropiado. Si el ndice secundario es escaso, entonces el puntero de cada cubeta individual seala a los valores de la clave de bsqueda en un rango apropiado. En este caso, cada entrada de cubeta es un puntero nico o bien un registro que consta de dos campos: un valor de la clave de bsqueda y un puntero a algn registro de archivo. Si las cubetas contienen nicamente punteros, debemos leer todos los registros a los que apunta la cubeta. Asociando un valor de la clave de bsqueda con cada puntero de la cubeta, eliminamos la necesidad de leer registros con un valor de la clave de bsqueda secundaria distinto del que estamos buscando. La estructura de la cubeta puede eliminarse si el ndice secundario es denso y los valores de la clave primaria forman parte de la clave de bsqueda. El procedimiento descrito para la insercin y eliminacin puede aplicarse a un archivo con mltiples ndices. Cada vez que se modifique el archivo es necesario actualizar todos los ndices. Los ndices secundarios mejoran el rendimiento en las consultas que utilizan claves que no son primarias, sin embargo, implican un gasto extra considerable en la modificacin de la BD. El diseador de una BD decide que ndices secundarios son deseables, basndose en una estimacin de la frecuencia relativa de consultas y modificaciones.
74
Tema 8. Indexacin y asociatividad (hashing). La desventaja principal de la organizacin de archivo secuencial indexado es que el rendimiento baja al crecer el archivo.: la estructura de archivo de rbol B+ es la ms ampliamente utilizada de varias estructuras de archivo que + mantienen su eficiencia a pesar de inserciones y eliminaciones. Un ndice de rbol toma B la forma de un rbol equilibrado en el que cualquier camino desde la raz del rbol hasta una hoja tiene la misma longitud. Todos los nodos del rbol tienen entre [n/2] (entero, redondeo superior) y n hijos, donde n es fijo para un determinado rbol. Veremos que la estructura de rbol B+ impone un cierto gasto extra durante la insercin y la eliminacin, adems de requerir un determinado espacio extra. No obstante, esto es aceptable en el caso de archivos con una frecuencia alta de modificacin, ya que se evita el coste de la reorganizacin del archivo. Un ndice de rbol B+ tiene varios niveles, pero tiene una estructura que difiere de la del archivo secuencial de ndices de varios niveles. Un nodo tpico de un rbol B+ es de la forma: P1 K1 P2 Pn-1 Kn-1 Pn Contiene hasta n-1 valores de clave de bsqueda K, y n punteros P. Los valores de la clave de bsqueda dentro de un nodo se guardan en un determinado orden, as, si i<j, entonces K i<Kj. Consideramos primero la estructura de los nodos hoja. Para 1i<n, Pi apunta a cualquier registro del archivo con un valor de clave de bsqueda K i o a una cubeta de punteros, cada uno de los cuales apunta a un registro del archivo con valor clave de bsqueda Ki. La estructura de cubeta se utiliza solamente si la clave de bsqueda no forma una clave primaria y el archivo no est ordenado en el orden del valor de la clave de bsqueda. El puntero Pn tiene un propsito general que indicaremos despus. Ahora que hemos visto la estructura de un nodo hoja, consideremos como se asignan valores de clave de bsqueda a nodos especficos. Cada nodo hoja puede tener hasta n-1 valores, y se permite que tengan un mnimo de [(n-1)/2] valores, adems, los rangos de valores de cada hoja no se solapan. As, si Li y Lj son nodos hoja e i<j, entonces todos los valores de la clave de bsqueda en Li son menores que cualquiera de la clave Lj. El conjunto de nodos hoja de un rbol B+ debe formar un ndice denso de manera que cada valor de la clave de bsqueda aparezca en algun nodo hoja. Ahora podemos explicar el uso del puntero Pn. Ya que existe un orden lineal de las hojas, basado en los valores de clave de bsqueda que contienen, usamos Pn para encadenar los nodos hoja en orden de clave de bsqueda.. Esto permite un procesamiento secuencial del archivo en forma eficiente. Los nodos del rbol B+ que no son hojas, forman un ndice escaso de varios niveles. La estructura de los nodos que no son hoja es la misma que la de los hoja, excepto que todos los punteros apuntan a nodos del rbol. Un nodo puede tener hasta n punteros, pero debe tener por lo menos [n/2] punteros. Consideremos un nodo que contiene m punteros. Si 1<i<m, el puntero Pi apunta la estructura que contiene los valores de la clave de bsqueda menores que K i y mayores o iguales a K i-1. El puntero Pm apunta a la parte del subrbol que contiene aquellos valores de la clave mayores que o iguales a Km-1, y el puntero P1 apunta a la parte del subrbol que contiene aquellos valores de la clave de bsqueda menores que K 1. El requisito de que cada nodo tenga por lo menos [n/2] punteros es obligatorio en todos los niveles del rbol excepto en la raz. Un rbol B+ para el archivo depsito, con n=3, suprimiendo los punteros al archivo por simplicidad, ser de la forma:
Siempre es posible construir un rbol B+, para cualquier n, en el que todos los nodos distintos del raz contienen por lo menos [n/2] punteros. Todos los ejemplos que hemos dado de rboles B+ han sido equilibrados. Es decir, la longitud de cualquier camino desde la raz hasta un nodo hoja es la misma. Esta propiedad es un requisito de un rbol B+. De hecho, la B significa balanced (equilibrado). La propiedad de equilibrio de los rboles B+ es la que asegura un buen rendimiento en las bsquedas, inserciones y eliminaciones. Supngase que queremos encontrar todos los registros con un valor de clave de bsqueda k. Primero examinamos el nodo raz y buscamos el valor de clave de bsqueda ms pequeo mayor que k. Supngase que el valor de la clave de bsqueda es Ki. Seguimos el puntero Pi-1 a otro nodo. Si tenemos m punteros en el nodo, y KKm-1, entonces seguimos Pm a otro nodo. Una vez ms buscamos el valor de la clave de bsqueda ms pequeo mayor que k y seguimos el correspondiente puntero. Finalmente llegamos a un nodo hoja, donde el puntero nos seala en registro o la cubeta deseada. As, al procesar una consulta se atraviesa un camino en el rbol desde la raz a una hoja. Si hay K valores de la clave de bsqueda en el archivo, el camino no es ms largo que log[n/2](K). En la prctica, significa que slo se necesita tener acceso a unos pocos nodos aunque el archivo sea muy grande. En la mayora de los casos, un nodo se hace para que tenga el mismo tamao de un bloque del disco.
75
Bases de Datos La insercin y la eliminacin son ms complicadas que la bsqueda, ya que puede ser necesario partir un nodo, o combinar dos si se hacen demasiado pequeos. Adems, cuando se parte un nodo o se combinan un par de nodos, debemos asegurarnos de que el equilibrio se conserva. Para introducir la idea de insercin y eliminacin en un rbol B+, supongamos temporalmente que los nodos nunca llegan a ser demasiado grandes o demasiado pequeos. Bajo esta suposicin, la insercin y la eliminacin son de la forma: n Insercin. Utilizando la misma tcnica de la bsqueda, encontramos el nodo hoja en el que aparecera l valor de la clave de bsqueda. Si el valor de la clave de bsqueda ya aparece en el nodo hoja, aadimos el nuevo registro al archivo, y si es necesario un puntero a la cubeta. Si el valor de la clave de bsqueda no aparece, insertamos el valor en el nodo hoja y lo posicionamos de forma que las claves de bsqueda estn todava en orden. Entonces, insertamos el nuevo registro en el archivo, y si es necesario, creamos una nueva cubeta con el puntero apropiado. n Eliminacin. Utilizando la misma tcnica de la bsqueda, encontramos el registro que se va a eliminar y lo quitamos del archivo. El valor de la clave de la bsqueda se quita del nodo hoja si no hay ninguna cubeta asociada con el valor de la clave de bsqueda o si la cubeta queda vaca como resultado de la eliminacin. Ahora consideremos un ejemplo en el que es necesario partir un nodo. Supngase que queremos insertar un registro con un valor nombre_sucursal=Clearview en el rbol B+ de la figura anterior. Empleando el algoritmo de bsqueda vemos que Clearview aparecera en el nodo que contiene Brighton y Downttown., y no hay espacio para insertarlo. Por tanto, el nodo se parte en dos, quedando en uno Brighton y Clearview y en el otro Downtown. En general tomamos los n valores de clave de bsqueda (los n-1 de la hoja ms el que se inserta) y ponemos el primero en el nodo existente y los valores restantes en el nuevo nodo. Habiendo partido un nodo hoja, debemos insertar el nodo hoja nuevo en la estructura del rbol B+. En nuestro ejemplo, el nodo nuevo tiene a Downtown como valor ms pequeo de la clave de bsqueda. Necesitamos insertar este valor de clave de bsqueda en el padre del nodo hoja que se parti. En nuestro ejemplo se inserta el valor Downtown en el padre, porque hay espacio disponible de clave de bsqueda. Si no hubiera sido as se hubiera tenido que partir el padre. En el peor de los casos, se deben partir todos los nodos a lo largo del camino hacia la raz. Si la misma raz se parte, el rbol se hace ms profundo. La tcnica general de insercin en un rbol B+ es determinar el nodo hoja l en el que se debe hacer la insercin. Si tiene lugar una particin, se inserta el nuevo nodo en el padre del nodo l. Si esta insercin causa una particin, se procede recursivamente hasta que o bien una insercin no cause una particin o se cree una nueva raz. Ahora consideramos las eliminaciones que causan que tres nodos contengan muy pocos punteros. Primero eliminemos Downtown del rbol B+ resultado de la insercin anterior. Localizamos la entrada de Downtown usando el algoritmo de bsqueda. Cuando eliminamos la entrada de Downtown de su nodo hoja, la hoja queda vaca. Puesto que el ejemplo n=3, y 0<[(n-1)/2], se debe eliminar este nodo del rbol B+. Para eliminar un nodo hoja, debemos eliminar el puntero que le apunta desde el padre. ste deja el nodo padre, que tena tres punteros, con slo dos punteros. Puesto que 2[n/2], el nodo todava es suficientemente grande y se ha finalizado la operacin de eliminacin. Cuando se hace una eliminacin en un padre de un nodo hoja, es posible que el nodo padre se vuelva demasiado pequeo. Esto es exactamente lo que ocurre si eliminamos Perryridge. Cuando eliminamos el puntero a este nodo hoja en su padre, el padre queda con slo un apuntador. Puesto que n=3, [n/2=2], y, por tanto, un nico puntero es muy poco. Sin embargo, como el nodo contiene informacin til, no podemos simplemente eliminarlo. En vez de ello, examinamos el nodo hermano. Este nodo hermano tiene espacio para incluir la informacin del nodo que ahora es demasiado pequeo, por lo que podemos juntar estos nodos, de forma que el nodo hermano ahora contiene las claves Mianus y Redwood. El otro nodo, el primero, ahora contiene informacin redundante y puede eliminarse de su padre. Obsrvese que la raz quedo vaca despus de la eliminacin, por lo que se redujo en un nivel la profundidad del rbol B+. No siempre es posible fusionar nodos, lo que ocurre cuando el nodo hermano ya contiene el mximo de punteros. La solucin en este caso es redistribuir los punteros de forma que cada hermano tenga los mismos punteros. Obsrvese que la redistrubicin de valores necesita un cambio de un valor de clave de bsqueda en el padre de los dos hermanos. En general, para eliminar un nodo en el rbol B+, realizamos una bsqueda del valor y lo eliminamos. Si el nodo es demasiado pequeo, lo eliminamos de su padre. Aunque las operaciones de insercin y eliminacin en rboles B+ son complicadas, requieren relativamente pocas operaciones. Puede demostrarse que el nmero de operaciones que se necesita en el peor de los casos para una insercin o eliminacin es proporcional al logaritmo del nmero de claves de bsqueda. La velocidad de las operaciones en los rboles B+ es la que hace que se utilicen frecuentemente como estructuras de ndices en implementaciones de BD.
76
Tema 8. Indexacin y asociatividad (hashing). raz del rbol hasta algn nodo hoja. Sin embargo, en un rbol B, a veces es posible encontrar el valor deseado antes de leer un nodo hoja. As, la bsqueda es ligeramente ms rpida en un rbol B, aunque en general el tiempo de bsqueda todava es proporcional al logaritmo del nmero de claves de bsqueda. Estas ventajas del rbol B sobre el B+ se compensan con varias desventajas: n Los nodos hojas y los que no son hoja tienen el mismo tamao en una rbol B+. En un rbol B, los nodos que no son hoja son ms grandes, lo que complica la gestin del almacenamiento del ndice. n La eliminacin de un rbol B es ms complicada. En un rbol B+, la entrada eliminada siempre aparece en una hoja. En un rbol B, la entrada puede aparecer en un nodo que no sea hoja. Se debe seleccionar del subrbol del nodo que contiene la entrada eliminada el valor apropiado para sustituirlo. De manera especfica, si se elimina la clave de bsqueda K i, la clave de bsqueda ms pequea que aparece en el subrbol del puntero Pi+1 debe pasarse al campo que antes ocupaba K i. Las ventajas de los rboles B son de poca importancia para ndices grandes. As, muchos implementadores de DBMS prefieren la simplicidad estructural de los rboles B+.
77
Bases de Datos construccin de tablas de smbolos para compiladores y ensambladores, pero se prefiere la asociatividad abierta para DBMS. La razn es que la eliminacin resulta problemtica cuando se emplea asociatividad cerrada. Una desventaja importante de la forma de asociatividad que acabamos de describir es que la funcin de asociacin debe elegirse cuando implementamos el sistema y no se puede cambiar fcilmente despus. Puesto que la funcin h asigna valores de la clave de bsqueda a un conjunto fijo B de direcciones de cubetas, desperdiciamos si B es excesivamente grande. Si B es demasiado pequeo, las cubetas contendrn registros de muchos valores diferentes de la clave de bsqueda y el rendimiento disminuir. Normalmente, eligiendo el tamao de B el doble del nmero de valores de la clave de bsqueda en el archivo puede lograrse un buen equilibrio entre espacio y rendimiento.
Aunque se requieren i bytes para encontrar la entrada correcta en la tabla de direcciones de cubetas, varias entradas consecutivas de la tabla pueden apuntar a la misma cubeta. Todas esas entradas tendrn un prefijo comn de asociacin, pero la longitud de este prefijo puede ser menor que i. Por tanto, con cada cubeta asociamos un entero dando la longitud del prefijo comn de asociacin. Para localizar la cubeta que tiene el valor de la clave de bsqueda Kl tomamos los primeros i bytes de h(Kl), vemos la entrada de la tabla que corresponde a esa cadena da bytes, y seguimos el puntero de la cubeta en la entrada de la tabla.. Para insertar un registro con valor de clave de bsqueda K l, seguimos el mismo procedimiento que antes para la bsqueda, terminando en alguna cubeta, llammosla j. Si hay sitio en la cubeta insertamos la informacin apropiada y despus insertamos el registro en el archivo. Si la cubeta est llena, debemos partirla y redistribuir los registros actuales ms el nuevo. Para partir la cubeta, primero debemos determinar si necesitamos aumentar el nmero de bytes que usamos en la asociacin. n Si i=ij. Entonces solamente una entrada en la tabla de direcciones de cubetas apunta a la cubeta j. Por tanto, necesitamos aumentar el tamao de la tabla de direcciones de cubetas de forma que podamos incluir punteros en las dos cubetas que resultan de la particin de j. Hacemos esto considerando un bit adicional de la asociacin. Incrementamos el valor de i en 1, duplicando as el tamao de la tabla. Cada entrada se
78
Tema 8. Indexacin y asociatividad (hashing). sustituye por dos, cada una de las cuales contiene el mismo puntero que la original. Ahora dos entradas en la tabla de direcciones de cubetas apuntan a la cubeta j. Asignamos una nueva cubeta (z, por ejemplo) y hacemos que la segunda entrada apunte a la nueva cubeta. Ponemos ij e iz a i. A continuacin, se reasocia cada registro de la cubeta j y dependiendo de los i (ahora vale iinicial+1) o se guarda en la cubeta j o bien se asigna a la cubeta z recin creada. Ahora reintentamos la insercin del nuevo registro, y normalmente tendr xito, sin embargo, si todos los registros de la cubeta j y el nuevo registro tienen el mismo prefijo de valor de asociacin, ser necesario volver a partir una cubeta. Si la funcin de asociacin se elige con cuidado, no es probable que una nica insercin requiera que una cubeta se parta ms de una vez. n Si i>ij. Entonces ms de una entrada en la tabla apuntan a la cubeta j. As, podemos partir la cubeta j sin aumentar el tamao de la tabla de direcciones de cubetas. Obsrvese que todas las entradas que apuntan a la cubeta j corresponden a prefijos de asociacin que tienen el mismo valor en los bytes ij ms ala izquierda. Asignamos una nueva cubeta (digamos z) y ponemos ij e iz al valor que resulta de aadir 1 al valor i j original. A continuacin necesitamos ajustar las entradas en la tabla de direcciones de cubetas que anteriormente apuntaban a la cubeta j. Dejamos la primera mitad de las entradas como estaban y ponemos todas las dems en la recin creada z. A continuacin, como en el caso que vimos antes, se reasocia cada registro de la cubeta j y se reasignan a j o z segn corresponda. Se reintenta la insercin En el caso menos probable de que vuelva a fallar, aplicamos uno de estos dos casos de nuevo. Obsrvese que en ambos caos necesitamos volver a calcular la funcin de asociacin nicamente en los registros de la cubeta j. Para eliminar un registro con valor de clave de bsqueda K l, seguimos el mismo procedimiento que antes para la bsqueda, terminando en alguna cubeta, digamos j. Sacamos la clave de bsqueda de la cubeta y el registro del archivo. La cubeta tambin se elimina si queda vaca, en este momento se pueden unir varias cubetas y el tamao de la tabla de direcciones de cubetas se puede partir en dos. Examinemos ahora las ventajas y desventajas de la asociacin extensible comparada con las otras planificaciones que se han estudiado. La ventaja principal de la asociacin extensible es que el rendimiento no disminuye conforme crece el archivo. Adems, se requiere un mnimo espacio adicional. Aunque la tabla de direcciones de cubetas ocupa un espacio extra adicional, contiene un puntero para cada valor de asociacin con la longitud del prefijo actual, as pues la tabla es pequea, y no es necesario reservar cubetas para un crecimiento futuro; las cubetas pueden asignarse de manera dinmica. Una desventaja de la asociacin extensible es que la bsqueda implica un nivel de indireccin especial, ya que debemos tener acceso a la tabla de direcciones de cubetas antes de acceder a la cubeta en s. Esta referencia extra slo tiene un impacto de poca importancia en el rendimiento, impacto que aumenta al llenarse la BD. As pues, la asociacin extensible parece ser una tcnica muy atractiva, siempre que se quiera aceptar la complejidad aadida que implica su implementacin.
79
Bases de Datos Si tenemos una estructura de asociacin, podemos buscar c1 y localizar la cubeta correspondiente, pero no es fcil determinar cul es la siguiente cubeta. La dificultad surge del hecho de que una funcin de asociacin buena asigna valores a las cubetas aleatoriamente. Si queremos atender consultas de rangos utilizando una estructura de asociacin, debemos elegir una funcin de asociacin que conserve el orden, es decir, si K1 y K2 son valores de la clave de bsqueda y K1<K2, entonces h(K1)<h(K2). Una funcin de este tipo asegura que las cubetas estn en orden de clave. Es difcil encontrar una funcin de asociacin que conserve el orden y cumpla los requisitos de aletoriedad y uniformidad. Debido a la dificultad para encontrar una buena funcin de asociacin que conserve el orden, la mayor parte de los sistemas utilizan indexacin.
80
Tema 8. Indexacin y asociatividad (hashing). Conceptualmente es sencillo extender el enfoque de estructura de rejilla a cualquier nmero de claves de bsqueda. Las estructuras de rejilla proporcionan una mejora importante en el tiempo de procesamiento para las consultas de claves mltiples. Sin embargo, requieren cierta cantidad de espacio y tiempo extra en las inserciones y eliminaciones de registros. 8.9.2. Funcin de asociacin dividida. Otra manera de enfocar las consultas de claves mltiples es usando una funcin de asociacin dividida. Supngase que deseamos construir una estructura adecuada para consultas en el archivo depsito que implican tanto a nombre_cliente como a nombre_sucursal. Construimos una estructura de asociacin para la clave (nombre_cliente, nombre_sucursal). La nica diferencia entre la estructura que vamos a crear y las que vimos anteriormente es que imponemos una restriccin adicional sobre la funcin de asociacin h. Los valores de asociacin se dividen en dos partes. La primera parte depende slo del valor de nombre_cliente y la segunda depende slo de nombre_sucursal. La funcin de asociacin se denomina dividida porque los valores de asociacin se dividen en segmentos que dependen de cada elemento de la clave. As, si utilizamos valores de bsqueda de seis bits, los tres primeros dependen del valor de nombre_cliente y los tres ltimos de nombre_sucursal. Como era el caso del archivo de rejilla, la asociacin dividida se extiende a un nmero arbitrario de atributos. Podemos hacer varias mejoras en la asociacin dividida si sabemos con que frecuencia especificar el usuario cada uno de los atributos en una consulta. Existen otras varias tcnicas hbridas para procesar consultas de claves mltiples. Tales tcnicas pueden ser tiles en aplicaciones en las que la persona que implementa el sistema sabe que la mayora de las consultas sern de una forma restringida.
81