Está en la página 1de 221

CONTENIDOS

PREFACIO ____________________________________________________ 4

INTRODUCCIÓN _______________________________________________ 5

MODELO ENTIDAD-RELACIÓN ____________________________________ 9

MODELO RELACIONAL _________________________________________ 28

SQL _______________________________________________________ 38

OTROS LENGUAJES RELACIONALES_______________________________ 51

INTEGRIDAD Y SEGURIDAD _____________________________________ 64

DISEÑO DE BASES DE DATOS RELACIONALES ______________________ 71

BASES DE DATOS ORIENTADAS A OBJETOS ________________________ 84

BASES DE DATOS RELACIONALES ORIENTADAS A OBJETOS ___________ 93

XML ______________________________________________________ 102

ALMACENAMIENTO Y ESTRUCTURA DE ARCHIVOS__________________ 112

INDEXACION Y ASOCIACION ___________________________________ 122

PROCESAMIENTO DE CONSULTAS _______________________________ 134

OPTIMIZACIÓN DE CONSULTAS_________________________________ 142

TRANSACCIONES ____________________________________________ 151

CONTROL DE CONCURRENCIA __________________________________ 157

SISTEMAS DE RECUPERACIÓN __________________________________ 168

ARQUITECTURAS DE SISTEMAS DE BASES DE DATOS _______________ 175

BASES DE DATOS DISTRIBUÍDAS _______________________________ 180

BASES DE DATOS PARALELAS __________________________________ 189


DESARROLLO DE APLICACIONES Y ADMINISTRACIÓN _______________ 195

CONSULTAS AVANZADAS Y RECUPERACIÓN DE LA INFORMACIÓN _____ 200

TIPOS DE DATOS AVANZADOS Y NUEVAS APLICACIONES ____________ 208

PROCESAMIENTO AVANZADO DE TRANSACCIONES _________________ 215


PREFACIO

Este volumen es un manual del profesor para la cuarta edición de Fundamentos de Bases de Datos por
Abraham Silberschatz, Henry F. Korth y S. Sudarshan. Contiene las respuestas a los ejercicios del final de
cada capítulo del libro. Antes de aportar las respuestas a los ejercicios de cada capítulo, se incluyen unos
comentarios sobre cada uno. La naturaleza de estos cometarios es variable. Incluyen explicaciones sobre la
inclusión u omisión de ciertas materias y se hace notar la manera en que se enseña el capítulo en nuestros
propios cursos. Los comentarios también incluyen sugerencias sobre las materias a omitir, si el tiempo es
escaso, consejos prácticos sobre el software y el material que se puede emplear para los ejercicios de
programación.
El inicio de esta edición se han dispuesto en la Web las soluciones de algunos problemas. Estos
problemas se han marcado con un “*” en el manual del profesor.
La página web del libro, http://www.bell-labs.com/topic/books/db-book, contiene una variedad
de información útil, incluyendo la actualización de erratas, apéndices en línea que describen modelos de datos
en red, modelos de datos jerárquicos, diseño avanzado de bases de datos relacionales y el modelo del plan de
estudios del curso. Periódicamente se actualizará esta página con material suplementario que pueda ser útil a
profesores y estudiantes.
Se suministra una lista de correo para que los usuarios se puedan comunicar entre sí y con nosotros.
Si desea formar parte de la lista envíe un email a db-book@research.bell-labs.com indicando su nombre,
afiliación, puesto y dirección de correo electrónico.
Le agradeceríamos que nos hiciera llegar los errores u omisiones del libro, así como del manual del
profesor. Aunque hemos intentado escribir un manual del profesor que ayude a los usuarios de nuestro libro
tanto como sea posible, siempre se puede mejorar. Se podrían incluir respuestas mejoradas, preguntas
adicionales, ejemplos de preguntas de test, proyectos de programación, sugerencias sobre ordenes alternativos
de presentación de las materias, referencias adicionales y otros.
Si desea sugerir cualquier mejora al libro o al manual del profesor, estaremos encantados de
escucharle. El correo electrónico por Internet debe dirigirse a db-book@research.bell-labs.com. El correo
físico debe enviarse a Avi Silberschatz, Laboratorios Bell, Room 2T-310, 600 Mountain Avenue,Murray Hill,
NJ 07974, USA. Todas las aportaciones que tengan lugar serán, naturalmente, convenientemente reconocidas
a sus autores.
Nilesh Dalvi, Sumit Sanghai, Gaurav Bhalotia y Arvind Hulgeri hicieron la mayor parte del trabajo de
preparación para la cuarta edición del manual del profesor. Este manual se ha elaborado a partir de los
manuales de las ediciones anteriores. El manual de la tercera edición fue preparado por K. V. Raghavan con la
ayuda de Prateek R. Kapadia, Sara Strandtman ayudó con el manual del profesor para las ediciones segunda y
tercera, mientras que Greg Speegle y Dawn Bezviner ayudaron a preparar el manual del profesor para la
primera edición.

A.S.
H.F.K.
S.S.

Manual de apoyo al profesor, Versión 4.0.0


CAPITULO 1

INTRODUCCIÓN

El Capítulo 1 aporta una visión general sobre la naturaleza y el propósito de los sistemas de bases de datos.
El concepto más importante de este capítulo es que los sistemas de bases de datos permiten tratar los
datos con un alto nivel de abstracción. Así, los sistemas de bases de datos se diferencian significativamente de
los sistemas de ficheros y de los entornos de programación de propósito general, con los cuales ya están
familiarizados los estudiantes. Otro aspecto importante del capítulo es animar al empleo de los sistemas de
bases de datos, en lugar de los programas de aplicaciones construidos sobre sistemas de ficheros. Así, el
capítulo motiva lo que el estudiante estudiará el resto del curso.
La idea de la abstracción en los sistemas de bases de datos merece ser enfatizada en todo el proceso,
no sólo en la discusión del Apartado 1.3. La visión general de la estructura de las bases de datos que arranca
en el Apartado 1.4 es, forzosamente, más bien breve y pretende solamente dar al estudiante una idea
aproximada de algunos conceptos. Puede que los estudiantes no sean capaces, inicialmente, de apreciar
completamente los conceptos que aquí se describen, pero deberían serlo al final del curso.
Las especificaciones de los modelos E-R, relacional y orientados a objeto, se cubren en capítulos
posteriores. Estos modelos se pueden emplear en el Capítulo 1 para reforzar el concepto de abstracción,
mientras los detalles sintácticos se postergan para más tarde en el curso.
Si los estudiantes ya han realizado un curso sobre sistemas operativos, vale la pena mostrar como se
relacionan las bases de datos -DBMS- y los sistemas operativos -OS-. También es útil diferenciar entre la
concurrencia, tal y como es enseñada en los cursos sobre sistemas operativos (con una orientación hacia
ficheros, procesos y recursos físicos) y el control de concurrencia en las bases de datos (con una orientación
hacia una granularidad más sutil que el nivel de ficheros, las transacciones de recuperación y los recursos
accedidos asociativamente, más que físicamente). Si los estudiantes están familiarizados con un sistema
operativo en particular, el enfoque de esos S.O. a un acceso de ficheros concurrentes pude emplearse como
ejemplo.
Ejercicios

1.1 ¿Cuáles son las cuatro diferencias principales entre un sistema de procesamiento de archivos y un
SGBD?

Respuesta: Algunas de las diferencias más importantes entre un sistema de gestión de bases de datos y uno
de procesamiento de archivos son:

• Ambos sistemas contienen una colección de datos y un conjunto de programas que acceden a ellos. Un
sistema de gestión de bases de datos coordina los accesos físicos y lógicos a los datos, mientras que un
sistema de procesamiento de ficheros coordina sólo el acceso físico.

• Un sistema de gestión de bases de datos reduce la cantidad de datos duplicados, asegurando que una sección
física de datos esté disponible para todos los programas autorizados a accederla, mientras que los datos
escritos por un programa sobre un sistema de procesamiento de ficheros pueden no ser accesibles por otro
programa.

• Un sistema de gestión de bases de datos está diseñado para permitir acceso flexible a los datos (es decir,
consultas), mientras que un sistema de procesamiento de ficheros está diseñado para permitir predeterminados
accesos a los datos(es decir, programas compilados).

• Un sistema de gestión de bases de datos está diseñado para coordinar a múltiples usuarios accediendo a los
mismos datos en el mismo momento. Un sistema de procesamiento de ficheros generalmente se diseña para
permitir que uno o más programas accedan a diferentes ficheros de datos al mismo tiempo. En un sistema de
procesamiento de ficheros, dos programas pueden acceder concurrentemente a un fichero sólo si ambos tienen
acceso de sólo lectura sobre el fichero.

1.2 En este capítulo se han descrito las diferentes ventajas principales de un sistema gestor de bases de
datos. ¿Cuáles son dos de los inconvenientes?

Respuesta: A continuación se indican dos inconvenientes asociados con los sistemas de bases de datos.
a. La instalación de un sistema de bases de datos requiere más conocimiento, dinero, habilidad y
tiempo.
b. La complejidad de una base de datos puede originar una disminución del rendimiento.

1.3 Explíquese la diferencia entre independencia física y lógica de los datos.

Respuesta:
• La independencia física de los datos es la capacidad para modificar el esquema físico, sin necesidad de
rescribir los programas de las aplicaciones. Tales modificaciones incluyen cambiar el almacenamiento de
registros desbloqueados a bloqueados, o de ficheros de acceso secuencial a random.

• La independencia lógica de los datos es la capacidad para modificar el esquema conceptual, sin necesidad de
rescribir los programas de las aplicaciones. Una de estas modificaciones podría ser la adición de un campo a
un registro; una vista de los programas de la aplicación oculta este cambio desde los programas.
1.4 Lístense cinco responsabilidades de un sistema de gestión de bases de datos. Para cada
responsabilidad, explíquense los problemas que ocurrirían si no se realizara esta función.

Respuesta: Un gestor de bases de datos de propósito general (DBM) tiene cinco responsabilidades:
a. interaccionar con el gestor de ficheros.
b. poner en práctica la integridad
c. poner en práctica la seguridad
d. copias de seguridad y recuperación
e. controlar las concurrencias.

Si estas responsabilidades no fueran asumidas por un determinado DBM (y los textos indican que en
ocasiones se omite alguna responsabilidad en el diseño, como es el caso del control de concurrencia en un
DBM mono puesto para un microordenador) podrían ocurrir, respectivamente, los siguientes problemas:

a. Ningún DBM puede hacer nada sin esto; si no hay interacción con el gestor de ficheros no se puede
recuperar nada que esté almacenado en los ficheros.

b. Pueden no cumplirse las restricciones de integridad, los saldos de las cuentas podían estar por debajo
del mínimo permitido, los empleados podrían ganar demasiadas horas extraordinarias (por ejemplo, horas >
80) o los pilotos de las compañías aéreas podrían volar más horas de las que permite la ley.

c. Usuarios no autorizados podrían acceder a la base de datos, o usuarios autorizados para acceder a
determinadas partes de la base de datos podrían ser capaces de acceder a otras, para las que carecen de
autorización. Por ejemplo, un estudiante de escuela superior podría tener acceso a los códigos secretos de la
defensa nacional, o los empleados podrían averiguar lo que ganan sus jefes.

d. Los datos se podrían perder de forma permanente en vez de, al menos, estar disponibles en el estado
de consistencia que existía antes del fallo.
e. Se podrían violar la restricciones de integridad a pesar del cumplimiento de la propia integridad en
cada transacción. Por ejemplo, se podrían reflejar saldos bancarios incorrectos debido a retiradas y depósitos
simultáneos, etcétera.

1.5 ¿Cuáles son las cinco funciones principales del administrador de una base de datos?

Respuesta: Las cinco funciones principales del administrador de una base de datos son:
• Crear la definición del esquema
• Definir la estructura de almacenamiento y los métodos de acceso
• Modificar el esquema y/o la organización física cuando sea necesario
• Conceder autorización para acceder a los datos
• Definir las restricciones de integridad

1.6 Lístense siete lenguajes de programación que sean procedimentales y dos que no lo sean. ¿Qué grupo
es más fácil de aprender y de usar? Justifíquese la respuesta.

Respuesta: Clasificación de lenguajes de programación:


• Procedimentales: C, C++, Java, Basic, Fortran, Cobol, Pascal

• No procedimentales: Lisp y Prolog


Nota: Lisp y Prolog soportan algunas construcciones procedimentales, pero el núcleo de ambos lenguajes es
no procedimental.

En teoría los lenguajes no procedimentales son más fáciles de aprender porque permiten al programador
concentrarse en lo que necesita ser hecho, en vez de en cómo hacerlo. En la práctica esto no siempre es cierto,
especialmente si los lenguajes procedimentales se aprenden primero.
1.7 Lístense los seis pasos principales que se deberían dar en la definición de una base de datos para una
empresa particular.

Respuesta: Los seis pasos principales en la definición de una base de datos para una determinada empresa
particular son:
• Definir los requerimientos de alto nivel de la empresa (este paso genera un documento conocido como las
especificaciones requeridas por el sistema.)

• Definir un modelo conteniendo todos los tipos apropiados de datos y las relaciones entre ellos.

• Definir las restricciones de integridad en los datos.

• Definir el nivel físico.

• Por cada problema conocido que haya de resolverse regularmente (por ejemplo, las tareas a realizar por
usuarios Web o auxiliares) definir una interface de usuario para llevar a cabo la tarea y escribir los programas
de aplicación necesarios para implantar la interface del usuario.

• Crear/inicializar la base de datos.

1.8 Considérese un array de enteros bidimensionales de tamaño n × m que se va a usar en su lenguaje de


programación preferido. Usando el array como ejemplo, ilústrese la diferencia (a) entre los tres niveles de
abstracción y (b) entre un esquema e instancias.

Respuesta: Sea tgrid un array de enteros bidimensionales de tamaño n × m.


a. • El nivel físico serían simplemente m × n (probablemente consecutivas) localizaciones de
almacenamiento de cualquier tamaño especificado para la implantación (por ejemplo, 32 bits cada una).
• El nivel conceptual es un cuadrícula de cajas, cada una conteniendo posiblemente un entero, la cuál
es n cajas de alto por m de ancho.
• Hay 2m x n vistas posibles. Por ejemplo, una vista podría ser el array entero o una fila particular del
array o todas las n filas, pero solamente columnas de 1 a i.

b. • Considérense las siguientes declaraciones Pascal:


type tgrid = array[1..n, 1..m] of integer;
var vgrid1, vgrid2 : tgrid
Entonces tgrid es un esquema, mientras que los valores de las variables vgrid1 y vgrid2 son
instancias.
• Para ilustrarlo aún más, considérese el esquema array[1..2, 1..2] of integer. Dos instancias de este
esquema son:

1 16 17 90
7 89 412 89
CAPITULO 2

MODELO ENTIDAD-RELACIÓN

Este capítulo introduce el modelo entidad-relación en detalle. El capítulo abarca numerosas características del
modelo, varias de las cuales se pueden omitir dependiendo del alcance del curso que se ha planificado.
Conjuntos de entidades débiles (Apartado 2.6), diseño de restricciones (Apartado 2.7.4) y agregación
(Apartado 2.7.5), junto con los correspondientes sub apartados del Apartado 2.9 (Reducción de un Esquema
E-R a Tablas) se pueden omitir si se dispone de poco tiempo. Se recomienda tratar la especialización
(Apartado 2.7.1), al menos con algún detalle, dado que es un concepto importante en las bases de datos
orientadas a objeto (Capítulo 8).
El propio modelo E-R y los diagramas E-R se emplean a menudo en el texto. Es importante que los
estudiantes se encuentren cómodos con ellos. El modelo E-R es un excelente contexto para introducir a los
estudiantes en la complejidad del diseño de las bases de datos. Para una empresa dada hay, a menudo, una
extensa variedad de diseños E-R. Aunque algunas elecciones son arbitrarias, frecuentemente sucede que un
diseño es intrínsecamente mejor que los restantes. Varios de los ejercicios ilustran este punto. La evaluación
de las bondades de un diseño E-R requiere un conocimiento de la empresa a modelar y de las aplicaciones a
ejecutar. A menudo es posible dirigir a los estudiantes a un debate sobre los méritos relativos de diseños
contrapuestos y así ilustrar, por ejemplo, como la comprensión de la aplicación es frecuentemente la parte
más dura del diseño de la base de datos.
Un énfasis considerable se ha puesto en la construcción de tablas a partir de diagramas E-R.
Esto sirve para desarrollar la intuición en la discusión del modelo relacional en los capítulos siguientes.
También es útil para convertir los conceptos abstractos, de las entidades y sus relaciones, en los más concretos
de las relaciones. Diversos textos sitúan esta materia junto al modelo de datos relacional, en lugar de hacerlo
el capítulo del modelo E-R. Nuestra intención, al situar esta materia aquí, es ayudar a los estudiantes a
apreciar como se emplean, en la realidad los modelos de datos E-R, mientras se estudia el modelo E-R, en vez
de hacerlo más tarde.
La materia sobre la conversión de diagramas E-R en tablas es bastante breve en algunos puntos del
libro, aportando las transparencias un mejor tratamiento de los detalles que el implícitamente dejado en el
libro.

Cambios a la tercera edición:

En la cuarta edición se han actualizado varios ejemplos, incluyendo relaciones ternarias (empleados,
sucursales, trabajo en lugar de cliente, préstamo, sucursal) y agregaciones (administración en lugar de
responsable de préstamos), para hacerlos más realistas. También se han añadido más ejemplos, así en la
especialización se emplean persona, cliente y empleado como ejemplo principal, en lugar de cuenta, cuentas
control y cuentas de ahorro, que también hace el ejemplo más realista. Se ha reemplazado D.N.I. por el más
global (y realista) id-cliente e id-empleado.
Se han añadido notaciones para hacer restricciones sin conexión y aclarar la participación total (solapamiento
y participación parcial están por defecto). Se han introducido notaciones E-R alternativas, dado que
numerosas aplicaciones del mundo real las emplean.
También se ha aportado una breve introducción a los diagramas de clase UML, que están empezando a
emplearse cada vez más en lugar de los diagramas E-R, en herramientas tales como el diseñador de Oracle.
Se ha abandonado el alcance de las dependencias de existencia, dado que las restricciones de participación
total aportan una restricción muy parecida. La distinción entre participación total y dependencias de existencia
es demasiado pequeña como para ser tenida en cuenta y sólo confunde a los estudiantes.
Las cuestiones de diseño se discuten en mayor detalle.
Figura 2.1 Diagrama E-R para una compañía de seguros de coches.

Ejercicios

2.1 Explíquense las diferencias entre los términos clave primaria, clave candidata y superclave.

Respuesta: Una superclave es un conjunto de uno o más atributos que, tomados colectivamente, permiten
identificar de forma única una entidad en el conjunto de entidades. Una superclave puede contener atributos
ajenos. Si K es una superclave, entonces también lo es cualquier superconjunto de K. Una superclave para la
que ningún subconjunto propio es también superclave, se denomina clave candidata. Es posible que varios
conjuntos diferentes de atributos puedan servir como claves candidatas. La clave primaria es una de las claves
candidatas que se elige, por el diseñador de la base de datos, como el elemento principal para identificar las
entidades dentro un conjunto de entidades.

2.2 Constrúyase un diagrama E-R para una compañía de seguros de coches cuyos clientes poseen uno o
más coches. Cada coche tiene asociado un número, de cero a cualquier valor, que almacena el número de
accidentes.

Respuesta: Véase la Figura 2.1

2.3 Constrúyase un diagrama E-R para un hospital con un conjunto de pacientes y un conjunto de
médicos. Asóciese con cada paciente un registro de las diferentes pruebas y exámenes realizados.

Respuesta: Véase la Figura 2.2

2.4 Una oficina de registro de una universidad mantiene datos acerca de las siguientes entidades: (a)
cursos, incluyendo número, título, créditos, programa de estudios y requisitos previos; (b) ofertas de cursos,
incluyendo número del curso, año, semestre, número de sección, profesor(es), horarios y aulas; (c)
estudiantes, incluyendo id-estudiante, nombre y programa; y (d) profesores, incluyendo número de
identificación, nombre, departamento y título.
Además, se deben modelar adecuadamente la matriculación de los estudiantes en los cursos y las
calificaciones otorgadas en cada uno.
Constrúyase un diagrama E-R para la oficina de registro. Documéntense todas las suposiciones que
se hagan acerca de las restricciones de correspondencia.
Respuesta: Véase la Figura 2.3.
En la respuesta dada aquí, los principales conjuntos de entidades son estudiantes, cursos, ofertas-cursos
y profesores. El conjunto de entidades ofertas-cursos es un conjunto de entidad débil dependiente de curso.
Las suposiciones hechas son:
a. una clase sólo se reúne en un lugar y en un momento preciso. Este diagrama E-R no puede modelar
una clase que se reúna en diferentes lugares y en diferentes momentos.

b. No hay garantía de que la base de datos no tenga dos clases reuniéndose en el mismo lugar y al
mismo tiempo.

Figura 2.2 Diagrama E-R para un hospital.

Figura 2.3 Diagrama E-R para una universidad.


2.5 Considérese una base de datos cuyo objeto es registrar las notas que obtienen los estudiantes en los
distintos exámenes de los diferentes cursos ofertados.
a. Constrúyase un diagrama E-R que modele los exámenes como entidades y haga uso de una relación
ternaria para la base de datos anterior.
b. Constrúyase un diagrama E-R alternativo que emplee sólo una relación binaria entre estudiantes y
ofertas-cursos. Asegúrese de que sólo existe una relación entre un determinado estudiante y un par ofertas-
cursos, y que aún se pueden representar las notas que obtiene un estudiante en los diferentes exámenes de un
curso ofertado.

Respuesta:
a. Véase la Figura 2.4
b. Véase la Figura 2.5

Figura 2.4 Diagrama E-R para la base de datos de notas.

2.6 Constrúyanse las tablas apropiadas para cada uno de los diagramas E-R de los ejercicios 2.2 al 2.4.

Respuesta:
a. Tablas de seguros de coches:
persona (id-conductor, nombre, dirección)
coche (matrícula, año, modelo)
accidente (número-informe, fecha, lugar)
participado (id-conductor, matrícula, número-informe, cantidad-daños)

b. Tablas de hospitales:
pacientes (id-paciente, nombre, seguro, fecha-admisión, fecha-alta)
doctores (id-doctor, nombre, especialidad)
pruebas (id-prueba, nombre-prueba, fecha, hora, resultado)
paciente-doctor (id-paciente, id-doctor)
registro-pruebas (id-prueba, id-paciente) realizada-por (id-prueba, id-doctor)
c. Tablas del registro de la universidad:
estudiante (id-estudiante, nombre, programa)
curso (número-curso, título, programa-estudios, créditos)
ofertas-cursos (número-curso, número-sección, año, semestre, hora, aula)
profesor (id-profesor, nombre, departamento, título)
matrículas (id-estudiante, número-curso, número-sección, semestre, año, calificación)
enseña (número-curso, número-sección, semestre, año, id-profesor)
requerimientos (curso-principal, requisitos-previos)

Figura 2.5 Otro diagrama E-R para la base de datos de notas.

2.7 Diséñese un diagrama E-R para seguir la pista de las hazañas de su equipo de deportes favorito. Se
deberían almacenar los partidos jugados, los resultados de cada partido, los jugadores y las estadísticas
individuales de cada jugador, para cada partido. Las estadísticas de resumen se deberían modelar como
atributos derivados.

Respuesta: Véase la Figura 2.6

2.8 Extiéndase el diagrama E-R del ejercicio anterior, a fin de almacenar la misma información para
todos los equipos de una liga.

Respuesta: Véase la Figura 2.7. Nótese que un jugador sólo puede pertenecer a un equipo durante una
temporada.

2.9 Explíquense las diferencias entre conjunto de entidades débiles y fuertes.

Respuesta: Un conjunto de entidades fuertes tiene una clave primaria. Todas las tuplas del conjunto se
distinguen por medio de esa clave. Un conjunto de entidades débiles no tiene clave primaria, a menos que se
incluyan los atributos del conjunto de entidades fuertes del que depende. En un conjunto de entidades débiles
las tuplas están divididas según su relación con las de la entidad fuerte. Las tuplas de cada división se
distinguen mediante un discriminador, que es un conjunto de atributos.

Figura 2.6 Diagrama E-R para las estadísticas del equipo favorito.

Figura 2.7 Diagrama E-R para las estadísticas de todos los equipos.

2.10 Se puede convertir cualquier conjunto de entidades débiles en un conjunto de entidades fuertes,
simplemente añadiendo los atributos apropiados. ¿Por qué, entonces, se tienen conjuntos de entidades
débiles?

Respuesta: Se tienen entidades débiles por varias razones:


• Se desea evitar la duplicidad de datos y las consiguientes posibles inconsistencias causadas por las claves
duplicadas de la entidad fuerte.

• Las entidades débiles reflejan la estructura lógica de una entidad que es dependiente de otra.

• Las entidades débiles se pueden borrar automáticamente cuando se borra la entidad fuerte de la que
dependen.

• Las entidades débiles se pueden almacenar físicamente con sus entidades fuertes.
2.11 Defínase el concepto de agregación. Propónganse dos ejemplos para los que este concepto es útil.

Figura 2.8 Ejemplo 1 de diagrama E-R de agregación.

Figura 2.9 Ejemplo 2 de diagrama E-R de agregación.

Respuesta: La agregación es una abstracción a través de la cual las relaciones se tratan como entidades de
nivel más alto. Así, la relación entre las entidades A y B se trata como si fuera una entidad C. Algunos
ejemplos de esto son:
a. Empleados que trabajan por proyectos. Un empleado trabajando para un proyecto en particular
utiliza diversa maquinaria. Véase la Figura 2.8
b. Los fabricantes tienen asociaciones con distribuidores para la distribución de productos. Cada
asociación tiene especificado el conjunto de productos que se van a distribuir. Véase la Figura 2.9
Figura 2.10 Diagrama E-R para el Ejercicio 2.12.

2.12 Considérese el diagrama E-R de la Figura 2.29, que modela una librería en línea.
a. Lístense los conjuntos de entidades y sus claves primarias.
b. Supóngase que la librería añade casetes de música y discos compactos a su colección. El mismo
elemento musical puede estar presente en formato de casete o de disco compacto con diferentes precios.
Extiéndase el diagrama E-R para modelar este añadido, ignorando el efecto sobre las cestas de la compra.
c. Extiéndase ahora el diagrama E-R usando generalización para modelar el caso en que una cesta de la
compra pueda contener cualquier combinación de libros, casetes de música o discos compactos.

Respuesta:

2.13 Considérese un diagrama E-R en el que el mismo conjunto de entidades aparece varias veces. ¿Por
qué está permitida esta redundancia, una mala práctica que se debería evitar siempre que sea posible?

Respuesta: Al utilizar un conjunto de entidades muchas veces se están perdiendo relaciones en el modelo.
Por ejemplo, en el diagrama E-R de la Figura 2.11: los estudiantes que toman clases son los mismos que son
atletas, pero este modelo no lo mostrará.
Figura 2.11 Diagrama E-R con duplicidad de entidades.

2.14 Considérese la base de datos de una universidad para la planificación de las aulas para los exámenes
finales. Esta base de datos se modelaría mediante un único conjunto de entidades examen, con atributos
nombre-curso, número-sección, número-aula y hora. Alternativamente, se podrían definir uno o más
conjuntos de entidades, con conjuntos de relaciones para sustituir algunos de los atributos del conjunto de
entidades examen, como

• curso con atributos nombre, departamento y número-c


• sección con atributos número-s y matriculados, que es un conjunto de entidades débiles dependiente de
curso
• aula con atributos número-a, capacidad y edificio

a. Muéstrese en un diagrama E-R el uso de los tres conjuntos de entidades adicionales listados.
b. Explíquense qué aplicaciones características influirían en la decisión de incluir o no, cada uno de los
conjuntos de entidades adicionales.

Respuesta:
a. Véase la Figura 2.12

b. Los conjuntos de entidades adicionales son útiles si se desea almacenar sus atributos como parte de
la base de datos. Para el conjunto de entidades curso se han elegido tres atributos a incluir. Si se incluyera
solamente la clave primaria (número-c) y si los cursos tuvieran sólo una sección, entonces sería apropiado
reemplazar los conjuntos de entidades curso (y sección) por un atributo (número-c) de examen. La razón de
que no sea aconsejable tener múltiples atributos de curso como atributos de examen es que, entonces, sería
difícil el mantenimiento de los datos en los cursos, en concreto si un curso tuviera varios exámenes o ninguno.
Comentarios similares aplican al conjunto de entidades aula.
Figura 2.12 Diagrama E-R para el calendario de exámenes.

2.15 Cuando se diseña un diagrama E-R para un desarrollo particular se tienen varias alternativas entre las
que hay que decidir.
a. ¿Qué criterio se deberá considerar para hacer la elección apropiada?
b. Diséñense tres diagramas E-R alternativos para representar la oficina de registro de la universidad
del Ejercicio 2.4. Lístense las ventajas de cada uno. Decídase por una de las alternativas.

Respuesta:
a. Los criterios a emplear son diseños intuitivos, expresiones fieles del concepto de mundo real y
eficiencia. Un modelo que esboza claramente los objetos y las relaciones de una forma intuitiva es mejor que
uno que no lo hace, porque es más fácil de usar y de cambiar. Decidirse entre un atributo y conjunto de
entidades para representar un objeto y decidirse entre un conjunto de entidades y un conjunto de relaciones,
influye en la precisión con que se representan los conceptos del mundo real. Si no se hace la elección de
diseño correcta, resultarán inconsistencias y /o pérdidas de información. Es preferible, por razones obvias, un
modelo que se pueda implantar de una forma eficiente.

b. Considérense tres alternativas diferentes para el problema del Ejercicio 2.4.

• Véase la Figura 2.13


• Véase la Figura 2.14
• Véase la Figura 2.15

Cada alternativa tiene ventajas, dependiendo del uso previsto de la base de datos. El esquema 2.13 se ha visto
anteriormente. El esquema 2.15 no requiere una entidad independiente para requisitos-previos. Sin embargo,
será difícil almacenar todos los requisitos previos(siendo un atributo multivalorado). El esquema 2.14 trata los
requisitos previos, así como las aulas, como entidades independientes, siendo útil para la recogida de datos
sobre los requisitos previos y el uso las habitaciones. El esquema 2.13 está entre medias de los otros, trata los
requisitos previos como entidades independientes, pero las aulas no. Dado que una oficina de registro
probablemente ha de responder preguntas generales sobre el número de clases que tiene un estudiante, los
requisitos previos de un curso o acerca de los lugares concretos en que tienen lugar las clases, el esquema 2.14
es seguramente la mejor elección.
Figura 2.13 Diagrama E-R para una universidad (a).

Figura 2.14 Diagrama E-R para una universidad (b).


Figura 2.15 Diagrama E-R para una universidad (c).

2.16 Un diagrama E-R se puede ver como un grafo. ¿Qué significan los siguientes términos de estructura
en un esquema de desarrollo?
a. El grafo es inconexo.
b. El grafo es acíclico.

Respuesta:
a. Si un par de conjuntos de entidades están conectados por una línea en un diagrama E-R, los
conjuntos de entidades están relacionados, aunque sea indirectamente. Un grafo desconectado implica que hay
parejas de conjuntos de entidades que no están relacionadas entre sí. Si se divide el grafo en los componentes
conectados se tiene, en efecto, una base de datos independiente.

b. Como se ha indicado en la respuesta del apartado anterior, una conexión en el grafo entre un par de
conjuntos de entidades indica una relación (posiblemente indirecta) entre ellos. Si hay un ciclo en el grafo,
entonces cada par de conjuntos de entidades del ciclo están relacionadas entre sí en, al menos, dos maneras
distintas. Si el diagrama E-R es acíclico hay sólo una conexión entre cada par de conjuntos de entidades y, por
lo tanto, sólo una relación.

2.17 En el Apartado 2.4.3 se representó una relación ternaria (Figura 2.30a) usando relaciones binarias,
como se muestra en la Figura 2.30b. Considérese la alternativa mostrada en la Figura 2.30c. Discútanse las
ventajas relativas de estas dos representaciones alternativas entre una relación ternaria y relaciones binarias.

Respuesta: El modelo de la Figura 2.30c no será capaz de representar todas las relaciones ternarias.
Considérese el conjunto de relaciones ABC siguiente.
Figura 2.30 Diagrama E-R para el Ejercicio 2.17 (no se muestran los atributos).

A B C
1 2 3
4 2 7
4 8 3

Si ABC está partido en tres conjuntos de relaciones AB, BC y AC, los tres implicarán que la relación (4, 2, 3)
es una parte de ABC.

2.18 Considérese la representación de una relación ternaria usando relaciones binarias como se describió
en el Apartado 2.4.3 (mostrado en la figura 2.30b).
a. Muéstrese una instancia sencilla de E, A, B, C, RA, RBy RC que no pueda corresponderse con ninguna
instancia de A, B, C y R.
b. Modifíquese el diagrama E-R de la Figura 2.30b para introducir restricciones que garanticen que
cualquier ejemplar de E, A, B, C, RA, RB y RC que satisfaga las restricciones, corresponda a una instancia de
A, B, C y R.
c. Modifíquese la traducción anterior para manejar restricciones de participación total sobre las
relaciones ternarias.
d. La representación anterior requiere que se cree un atributo clave primaria para E. Muéstrese la forma
en que tratar E, como un conjunto de entidades débiles, de manera que no se requiera un atributo clave
primaria.

Respuesta:
a. Sea E = {e1, e2}, A = {a1, a2}, B = {b1}, C = {c1}, RA = {(e1, a1), (e2, a2)}, RB = {(e1, b1)} y RC = {(e1,
c1)}. Se ve que debido a la tupla (e2, a2), no existe ninguna instancia de R que se corresponda con E, RA, RB y
RC.
Figura 2.31 Diagrama E-R del Ejercicio 2.31b.

Figura 2.32 Diagrama E-R del Ejercicio 2.31d.

b. Véase la Figura 2.31. La idea es introducir restricciones de participación total entre E y las relaciones
RA, RB y RC, para que cada tupla en E tenga una relación con A, B y C.

c. Supóngase que A participa totalmente en la relación R, entonces introdúzcase una restricción de


participación total entre A y RA.

d. Considérese a E como un conjunto de entidades débiles y a RA, RB y RC como su conjunto de


relaciones identificadoras. Véase la Figura 2.32.

2.19 Un conjunto de entidades débiles siempre se puede convertir en un conjunto de entidades fuertes,
añadiéndole a sus atributos los de la clave primaria de su conjunto de entidades identificadoras. Descríbase
qué tipo de redundancia resultaría si se hiciese así.

Respuesta: La clave primaria de un conjunto de entidades débiles se puede deducir de su relación con el
conjunto de entidades fuertes. Si se añaden los atributos de la clave primaria al conjunto de entidades débiles,
estarán presentes tanto en el conjunto de entidades como en el de relaciones y serán lo mismo. En
consecuencia, habrá redundancia.

2.20 Diséñese una jerarquía de especialización-generalización para las ventas de una compañía de
vehículos a motor. La compañía vende motocicletas, coches de pasajeros, mono volúmenes y autobuses.
Justifíquese la colocación de los atributos en cada nivel de la jerarquía. Explíquese por qué se deberían
colocar en un nivel más alto o más bajo.

Respuesta: La Figura 2.33 presenta una posible jerarquía; podría haber muy distintas soluciones. La jerarquía
de especialización-generalización para la compañía de vehículos a motor se muestra en la figura. Los
atributos modelo, tasa-impuestos-ventas y volumen-ventas son necesarios para todos los tipos de vehículos.
Los vehículos comerciales son objeto del impuesto de vehículos comerciales y cada tipo tiene una capacidad
de transporte de pasajeros específica de él. Algunos tipos de vehículos no comerciales están sujetos al
impuesto de vehículos de lujo. Los coches solamente pueden se de varios tipos, tales como coches deportivos,
sedán, familiares, etc., por tanto el atributo tipo.

Figura 2.33 Diagrama E-R de una compañía que vende vehículos a motor.

2.21 Explíquese la distinción entre las restricciones de diseño definidas por condición y las definidas por
el usuario. ¿Cuáles de estas restricciones se pueden comprobar automáticamente? Explíquese la respuesta.

Respuesta: En una jerarquía de especialización-generalización debe ser posible decidir qué entidades son
miembros del conjunto de entidades de nivel inferior. En una restricción de diseño definidas por condición, la
pertenencia al conjunto de entidades de nivel inferior se evalúa partiendo de si una entidad cumple, o no, una
condición explícita o predicado. Los conjuntos de entidades de bajo nivel definidas por usuario no están
restringidos por una condición de pertenencia; Más bien las entidades están asignadas, por el usuario de la
base de datos, a un conjunto de entidades determinado.
Las restricciones de diseño definidas por condición sólo se pueden manejar automáticamente por el
sistema. Siempre que se inserta cualquier tupla en la base de datos, se puede decidir automáticamente su
pertenencia a los varios conjuntos de entidades de nivel inferior, mediante la evaluación de los
correspondientes predicados de pertenencia. Igualmente, cuando se actualiza una tupla, se puede volver a
evaluar automáticamente su pertenencia a los varios conjuntos de entidades.

2.22 Explíquese la distinción entre las restricciones disjuntas y solapadas.

Respuesta: En una restricción de diseño disjunta, una entidad no puede pertenecer a más de un conjunto de
entidades de nivel inferior. En generalizaciones solapadas la misma entidad puede pertenecer a más de un
conjunto de entidades de nivel inferior. Así, en el ejemplo del libro sobre los grupos de trabajo de empleados,
un jefe puede participar en más de un grupo de trabajo.
Figura 2.34 Diagrama E-R para el Ejercicio 2.24 (no se muestran los atributos).

Figura 2.35 UML equivalente de la Figura 2.9c

2.23 Explíquese la distinción entre las restricciones totales y parciales.

Respuesta: En una restricción de diseño total, cada entidad de nivel superior deber pertenecer a un conjunto
de entidades de nivel inferior. Lo mismo no tiene por qué ser cierto en una restricción de diseño parcial. Por
ejemplo, algunos empleados pueden no pertenecer a ningún grupo de trabajo.

2.24 En la Figura 2.31 se muestra una estructura reticular de generalización y especialización. Para los
conjuntos de entidades A, B y C explíquese cómo se heredan los atributos desde los conjuntos de entidades de
nivel más alto X e Y. Discútase cómo manejar el caso en que un atributo de X tiene el mismo nombre que un
atributo de Y.

Respuesta: A hereda todos los atributos de X y, además, puede definir los suyos propios. Análogamente C
hereda, junto con sus propios atributos, todos los de Y. B hereda los atributos de X e Y. Si algunos de los
atributos nombre pertenecen a X e Y, puede referirse a B mediante el nombre cualificado X.nombre o
Y.nombre.

2.25 Dibújense equivalentes UML de los diagramas E-R de las Figuras 2.9c, 2.10, 2.12, 2.13 y 2.17.

Respuesta: Véanse las Figuras 2.35 a 2.39


2.26 Considérense dos bancos que deciden fusionarse. Asúmase que ambos bancos usan exactamente el
mismo esquema de bases de datos E-R - el de la Figura 2.22. (Esta suposición es, naturalmente, muy irreal; se
considera un caso más realista en el Apartado 19.8). Si el banco fusionado tiene sólo una base de datos, hay
varios problemas potenciales:

• La posibilidad de que los dos bancos originales tengan sucursales con el mismo nombre
• La posibilidad de que algunos clientes lo sean de ambos bancos originales
• La posibilidad de que algunos números de préstamo o de cuenta fueran usados en ambos bancos originales
(para diferentes préstamos o cuentas, por supuesto).

Por cada uno de estos problemas potenciales descríbase por qué existen de hecho dificultades potenciales.
Propóngase una solución a este problema. En la solución, explíquese cualquier cambio que se tenga que hacer
y descríbase cómo afectará al esquema y a los datos.

Figura 2.36 UML equivalente de la Figura 2.10

Figura 2.37 UML equivalente de la Figura 2.12


Figura 2.38 UML equivalente de la Figura 2.13

Figura 2.39 UML equivalente de la Figura 2.17

Respuesta: En este ejemplo se asume que ambos bancos tienen los identificadores compartidos para los
clientes, como es el caso del D.N.I. La solución general se presenta en el siguiente ejercicio. Cada uno de los
problemas mencionados tiene dificultades potenciales.
a. nombre-sucursal es la clave primaria del conjunto de entidades sucursal. Por lo tanto, al fusionar los
conjuntos de entidades de los dos bancos, si ambos tienen una sucursal con el mismo nombre uno de ellos se
perderá.

b. los clientes participan en los conjuntos de relaciones banquero-consejero, prestatario e impositor.


Al fusionar los conjuntos de entidades cliente de los dos bancos, las tuplas duplicadas del mismo cliente se
borrarán. Por consiguiente se actualizarán las relaciones, de entre los tres conjuntos mencionados, que estén
involucradas con las tuplas borradas. Nótese que si la representación tabular de un conjunto de relaciones se
obtiene tomando una unión de las claves primarias de los conjuntos de entidades participantes, no será
necesario modificar ninguno de estos conjuntos de relaciones.

c. El problema causado por préstamos o cuentas con el mismo número en ambos bancos, es similar al
causado por las sucursales de los dos bancos con igual nombre-sucursal.

Para resolver los problemas originados por la fusión no es necesario modificar el esquema. Mezclar los
conjuntos de entidades cliente eliminando tuplas duplicadas con el mismo campo D.N.I. Antes de fusionar los
conjuntos de entidades sucursal, prefijar el nombre del banco antiguo al atributo nombre-sucursal en cada
tupla. Los conjuntos de entidades empleado y pago se pueden fusionar directamente. No hay que realizar
ninguna eliminación de duplicados. Antes de fusionar los conjuntos de entidades préstamos y cuentas,
siempre que haya un número común en ambos bancos, el número antiguo se reemplaza por un número nuevo
único, en uno de los bancos.
Los conjuntos de relaciones siguientes se pueden fusionar. Cualquier relación, en un conjunto de
relaciones que implica una tupla que se ha modificado previamente por la fusión, se modifica para conservar
el mismo significado. Por ejemplo, sea 1611 un número de préstamo común en ambos bancos antes de la
fusión y supongamos que se remplaza por un nuevo y único número 2611 en uno de los bancos, digamos en el
banco 2. Ahora todas las relaciones en prestatario, préstamo-sucursal y préstamo-pago del banco 2 que estén
referidas al número de préstamo 1611, habrán de modificarse para referirse a 2611. Entonces la fusión con los
conjuntos de relaciones correspondientes del banco 1 podrán tener lugar.

2.27 Reconsidérese la situación descrita en el Ejercicio 2.26 bajo la suposición de que un banco está en
España y el otro en Portugal. Como antes, los bancos usan el esquema de la Figura 2.22, excepto que el banco
portugués usa un número de identificación asignado por el gobierno portugués, mientras que el banco español
usa el D.N.I. español para la identificación de clientes. ¿Qué problemas (además de los identificados en el
Ejercicio 2.24) ocurrirían en este caso multinacional? ¿Cómo se podrían resolver? Asegúrese de considerar
ambos esquemas y los valores de los datos actuales en la construcción de la respuesta.

Respuesta: Este es un caso en el que los esquemas de los dos bancos difieren, con lo que la fusión se hace
más difícil. El atributo de identificación para las personas en España es el D.N.I. y en Portugal el seguro-
social. Por lo tanto, el esquema fusionado no puede emplear ninguno de estos. En su lugar se introduce un
nuevo atributo id-persona que se usa por todos en el esquema fusionado. No es necesario ningún otro cambio
en el esquema. Los valores del atributo id-persona se pueden obtener de diferentes maneras. Una forma sería
prefijar un código de país a los antiguos valores de D.N.I. o seguro-social (por ejemplo “E” y “P”,
respectivamente), para obtener los correspondientes valores de id-persona. Otra manera sería asignar nuevos
números, empezando en el 1 y hacia arriba, un número para cada valor de D.N.I. y seguro-social en las
antiguas bases de datos.
Una vez hecho esto, se puede proceder a la fusión de acuerdo a la respuesta de la pregunta anterior.
Si un conjunto de relaciones en particular, por ejemplo prestatario, implica sólo a clientes españoles, se puede
expresar en la base de datos fusionada especializando el conjunto de entidades cliente en e-cliente y p-cliente,
y haciendo que sólo e-cliente participe en el prestatario fusionado. Análogamente, empleados se puede
especializar si es necesario.
CAPITULO 3

MODELO RELACIONAL

Este capítulo presenta el modelo relacional y tres lenguajes relacionales. El modelo relacional (Apartado 3.1)
se emplea intensamente a través del texto, así como el álgebra relacional (Apartado 3.2). El capítulo también
abarca el cálculo relacional de tuplas (Apartado 3.6) y el cálculo relacional de dominios (Apartado 3.7) (el
cual es la base del lenguaje QBE descrito en el Capítulo 5). Las clases que enfaticen sólo el SQL pueden
omitir los lenguajes de cálculo relacional.
Nuestra notación para el cálculo relacional de tuplas hace que resulte fácil presentar el concepto de
una consulta segura. El concepto de seguridad para el cálculo relacional de dominios, aunque idéntico al
cálculo de tuplas, es mucho más engorroso desde el punto de vista de la notación y requiere una presentación
cuidadosa. Esta consideración puede sugerir que se aporte un poco menos de énfasis en los cálculos de
dominios, para las clases que no hayan planificado tratar QBE.
El Apartado 3.3 presenta operaciones de álgebra relacional extendidas, tales como reuniones
externas y agregaciones. La evolución de los lenguajes de consultas, tales como SQL, indica claramente la
importancia de estas operaciones extendidas. Algunas de estas operaciones, como las reuniones externas,
pueden ser expresadas por medio del cálculo relacional de tuplas / dominios, mientras las extensiones son
requeridas para otras operaciones, como es el caso de la agregación. Hemos decidido no presentar tales
extensiones al cálculo relacional y, en cambio, restringir nuestra atención a las extensiones del álgebra.
Figura 3.38. Diagrama E-R

Ejercicios

3.1 Diséñese una base de datos relacional para la oficina de registro de una universidad. La oficina
conserva datos sobre cada curso, incluyendo el profesor, el número de estudiantes matriculados y la hora y el
lugar de las clases. Por cada pareja estudiante – curso, se guarda una calificación.

Respuesta: Los atributos subrayados indican la clave primaria.

estudiante (id-estudiante, nombre, programa)


curso (número-curso, título, programa-estudios, créditos)
ofertas-cursos (número-curso, número-sección, año, semestre, hora, aula)
profesor (id-profesor, nombre, departamento, título)
matrículas (id-estudiante, número-curso, número-sección, semestre, año, calificación)
enseña (número-curso, número-sección, semestre, año, id-profesor)
requerimientos (curso-principal, requisitos-previos)

3.2 Descríbanse las diferencias de significado entre los términos relación y esquema de la relación.
Ilústrese la respuesta haciendo referencia a la solución propuesta para el Ejercicio 3.1.

Respuesta: Un esquema de la relación es una definición de tipos y una relación es una instancia de ese
esquema. Por ejemplo, estudiante (ss#, nombre) es un esquema de la relación y ss# nombre es una relación
basada en ese esquema.

ss# nombre
123-45-6789 Tom Jones
456-78-9123 Joe Brown
3.3 Diséñese una base de datos relacional correspondiente al diagrama E-R de la Figura 3.38.

Respuesta: El esquema de la base de datos relaciones se presenta a continuación.

persona (id-conductor, nombre, dirección)


coche (matrícula, año, modelo)
accidente (número-informe, lugar, fecha)
posee (id-conductor, matrícula)
participado (número-informe, id-conductor, matrícula, importe-daños)

empleado (nombre-persona, calle, ciudad)


trabaja (nombre-persona, nombre-compañía, sueldo)
compañía (nombre-compañía, ciudad)
jefe (nombre-persona, nombre-jefe)
Figura 3.39. Base de datos relacional para los Ejercicios 3.5, 3.8 y 3.10.

3.4 En el Capítulo 2 se mostró la manera de representar los conjuntos de relaciones de varios a varios, de
varios a uno, de uno a varios y de uno a uno. Explicar la manera en que las claves primarias ayudan a
representar estos conjuntos de relaciones en el modelo relacional.

Respuesta: Supóngase que la clave primaria del esquema de la relación R es {Ai1, Ai2 , ...,Ain} y que la clave
primaria del esquema de la relación S es {Bi1, Bi2 , ...,Bim}. Entonces una relación entre los dos conjuntos se
puede representar como una tupla (Ai1, Ai2 , ...,Ain, Bi1, Bi2 , ...,Bim). En una relación de uno a uno, cada valor en
{Ai1, Ai2 , ...,Ain} aparecerá en una tupla e igualmete para {Bi1, Bi2 , ...,Bim}. En una relación de varios a uno (por
ejemplo de varios A a un B), cada valor en {Ai1, Ai2 , ...,Ain} aparecerá una vez y cada valor en {Bi1, Bi2 , ...,Bin}
puede aparecer varias veces. En una relación de varios a varios, los valores en ambos {Ai1, Ai2 , ...,Ain} y {Bi1,
Bi2 , ...,Bim}aparecerán varias veces. Sin embargo, en todos los casos anteriores {Ai1, Ai2 , ...,Ain ,Bi1, Bi2 , ...,Bim}
es una clave primaria, por lo que ninguna tupla en (Aj1 , ...,Ajn Bk1 , ...,Bkm) aparecerá más de una vez.

3.5 Considérese la base de datos relacional de la Figura 3.39, donde las claves primarias están
subrayadas.
Formúlese una expresión del álgebra relacional, otra del cálculo relacional de tuplas y una tercera del cálculo
relacional de dominios, para cada una de las consultas siguientes:
a. Averiguar los nombres de todos los empleados que trabajan para el Banco Importante.
b. Averiguar el nombre y la ciudad de residencia de todos los empleados que trabajan para el Banco
Importante.
c. Averiguar el nombre, la calle y ciudad de residencia, de todos los empleados que trabajan para el
Banco Importante y ganan mas de 10.000€ anuales.
d. Averiguar el nombre de todos los empleados de esta base de datos que viven en la misma ciudad que
la compañía para la que trabajan.
e. Averiguar el nombre de todos los empleados que viven en la misma ciudad y en la misma calle que
sus jefes.
f. Averiguar el nombre de todos los empleados de esta base de datos que no trabajan para el Banco
Importante.
g. Averiguar el nombre de todos los empleados que ganan más que cualquier empleado del Banco
Pequeño.
h. Supóngase que las compañías pueden estar ubicadas en varias ciudades. Buscar todas las empresas
con sede en todas las ciudades en las que tiene sede el Banco Pequeño.
Respuesta:
a. Õnombre-persona (snombre-compañía = “Banco Importante” (trabaja))

b. Õnombre-persona (empleado |x|


(snombre-compañía = “Banco Importante” (trabaja)))

c. Õnombre-persona, calle, ciudad


(s(nombre-compañía = “Banco Importante” Ù sueldo > 2.000.000)
trabaja |x| empleado)
1

d. Õnombre-persona (empleado |x| trabaja |x| compañía)

e.
1
Õnombre-persona ((empleado |x| jefe)
|x| (nombre-jefe = empleado2.nombre-persona Ù empleado.calle = empleado2.calle
Ù empleado.ciudad = empleado2.ciudad)(r empleado2 (empleado)))

f. Las soluciones siguientes asumen que todas las personas trabajan para una compañía. Si se permite
que aparezcan personas en la base de datos (por ejemplo en empleado) pero que no aparezcan en trabaja, el
problema se complica. Más adelante se dan soluciones para este caso más realista.
Õnombre-persona (snombre-compañía ¹ “Banco Importante” (trabaja))

Si las personas no pueden trabajar para cualquier compañía:


Õnombre-persona (empleado) - Õnombre-persona
(s(nombre-compañía = “Banco Importante”) (trabaja))

g.
1
Õnombre-persona (trabaja) - Õtrabaja.nombre-persona (trabaja
|x| (trabaja.sueldo £ trabaja2.sueldo Ù trabaja2.cpnmbre-compañía =“Banco Pequeño”)
r trabaja2 (trabaja)))

h. Nota: El Banco Pequeño se incluirá en cada respuesta.


Õnombre-compañïa (compañía ÷
(Õciudad (snombre-compañía = “Banco Pequeño” (compañía))))

3.6 Considérese la relación de la Figura 3.21, que muestra el resultado de la consulta “Averígüese el
nombre de todos los clientes que tienen un préstamo en el banco.” Escríbase de nuevo la consulta para incluir
no solamente el nombre, sino también la ciudad de residencia de cada cliente.
Obsérvese que ahora el cliente Sotoca ya no aparece en el resultado, aunque en realidad tiene un préstamo del
banco.
a. Explíquese por qué Sotoca no aparece en el resultado.
b. Supóngase que desea que Sotoca aparezca en el resultado. ¿Cómo habría que modificar la base de
datos para conseguirlo?
c. Nuevamente, supóngase que desea que Sotoca aparezca en el resultado. Escríbase una consulta
empleando una reunión externa que cumpla esta condición sin que haya que modificar la base de datos.

Respuesta: La nueva consulta es


Õnombre-cliente,ciudad-cliente,importe(prestatario |x| préstamo |x| cliente)
1 1

a. Aunque Sotoca tenga un préstamo, en la relación cliente no aparece ninguna dirección para Sotoca.
Dado que ninguna tupla de cliente se une con la tupla Sotoca de prestatario, Sotoca no puede aparecer en el
resultado.

b. La mejor solución es insertar la dirección de Sotoca en la relación cliente. Si se desconoce la


dirección, se pueden emplear valores nulos. Si el sistema de base de datos no soporta nulos, se puede emplear
un valor especial (tal como desconocido) para la ciudad y la calle de Sotoca. El valor especial escogido no
debe ser un nombre que se pueda corresponder con el de una calle o ciudad real.

c. Õnombre-cliente,ciudad-cliente,importe((prestatario |x| préstamo) ]x| cliente)


1 1 l

3.7 Las operaciones de reunión externa amplían la operación reunión natural, de manera que las tuplas
de las relaciones participantes no se pierdan en el resultado de la reunión. Descríbase la manera en que la
operación reunión zeta puede ampliarse para que las tuplas de la relación de la izquierda, derecha, o ambas,
no se pierdan en el resultado de una reunión zeta.

Respuesta:
a. La reunión zeta externa por la izquierda de r(R) y s(S) (r ]x|q s) se puede definir como
(r |x|q s) È ((r - ÕR(r |x|q s)) × (nulo,nulo, . . ., nulo))
La tupla de nulos es de tamaño igual al número de atributos en S.

b. La reunión zeta externa por la derecha de r(R) y s(S) (r |x[q s) se puede definir como
(r |x|q s) È ((nulo,nulo, . ., nulo) × (s - Õs(r |x|q s)))
La tupla de nulos es de tamaño igual al número de atributos en R.

c. La reunión zeta externa completa de r(R) y s(S) (r ]x[q s) se puede definir como
(r |x|q s) È ((nulo,nulo, . . ., nulo) × (s - Õs(r |x|q s))) È ((r - ÕR(r |x|q s)) × (nulo,nulo, . . ., nulo))
La primera tupla de nulos es de tamaño igual al número de atributos en R y la segunda es de tamaño igual al
número de atributos en S.

3.8 Considérese la base de datos relacional de la Figura 3.39. Se da una expresión del álgebra relacional
para cada petición:
a. Modificar la base de datos de forma que Santos viva en Tres Cantos.
b. Dar a todos los empleados del Banco Importante un aumento de sueldo del 10%.
c. Dar a todos los jefes de la base de datos un aumento de sueldo del 10%.
d. Dar a todos los jefes de la base de datos un aumento de sueldo del 10%, a menos que su sueldo esté
por encima de 100.000 € anuales. En tal caso, darles sólo un 3%.
e. Borrar todas las tuplas de la relación trabaja para los empleados del Banco Pequeño.

Respuesta:
a. empleado ¬ Pnombre-persona,calle,“Tres Cantos”
(snombre-persona =“Santos”(empleado))
È (empleado - snombre-persona =“Santos”(empleado))

b. trabaja ¬ Pnombre-persona,nombre-compañía, 1.1 * salario (


(s(nombre-compañía = “Banco Importante”) (trabaja))
È (trabaja - snombre-compañía = “Banco Importante” (trabaja))

c. La sintaxis de actualización permite referenciar sólo a una relación sencilla. Dado que esta
actualización requiere acceder a las dos relaciones a actualizar (trabaja) y jefe, se deben seguir varios pasos.
En primer lugar, identificar las tuplas de trabaja que se han se actualizar y almacenarlas en una relación
temporal (t1) Después, crear una relación temporal (t2) que contenga las nuevas tuplas. Finalmente borrar las
tuplas en t1, desde trabaja, e insertar las tuplas t2.
t1 ¬ Ptrabaja.nombre-persona, nombre-compañía, salario
(strabaja.nombre-persona = nombre-jefe (trabaja × jefe))
t2 ¬ Pnombre-persona,nombre-compañía, 1.1 * salario (t1)
trabaja(trabaja - t1) È t2

d. La misma situación surge aquí. Como antes, t1, contiene las tuplas que se han de actualizar y t2
contiene estas tuplas en su forma actualizada.
t1 ¬ Ptrabaja.nombre-persona, nombre-compañía, salario
(strabaja.nombre-persona = nombre-jefe (trabaja × jefe))
t2 ¬ Ptrabaja.nombre-persona, nombre-compañía, salario*1.03
(st1.salario * 1.1 > 100.000(t1))
t2 ¬ t2 È(Ptrabaja.nombre-persona, nombre-compañía, salario*1.1
(st1.salario * 1.1 £ 100.000(t1))
trabaja(trabaja - t1) È t2
e. trabaja ¬ trabaja - snombre-compañía = “Banco Pequeño” (trabaja)

3.9 Utilizando el ejemplo bancario, escríbanse consultas del álgebra relacional para averiguar las cuentas
por más de dos clientes:
a. Utilizando una función de agregación.
b. Sin utilizar funciones de agregación.

Respuesta:
a. t1 ¬ número-cuenta Gcount nombre-cliente (impositor)
Õnúmero-cuenta (snúmero-titulares>2 (rtitulares-cuenta (número-cuenta,número-titulares)(t1)))

b. t1 ¬ (rd1(impositor) × rd2(impositor) × rd3(impositor))


t2 ¬ s(d1.número-cuenta = d2.número-cuenta = d3.número-cuenta)(t1)
Õd1.número-cuenta (s(d1.nombre-cliente ¹ d2.nombre-cliente Ù
d2.nombre-cliente ¹ d3.nombre-cliente Ù d3.nombre-cliente ¹ d1.nombre-cliente )(t2))

3.10 Considérese la base de datos relacional de la Figura 3.39. Se da una expresión del álgebra relacional
para cada una de las consultas siguientes:
a. Averiguar la compañía con mayor número de empleados.
b. Averiguar la compañía con nómina (suma de sueldos de sus empleados) más reducida.
c. Averiguar las compañías cuyos empleados ganan un sueldo más alto, en media, que el sueldo medio
del Banco Importante.

Respuesta:
a. t1 ¬ nombre-compañía G count-distinct nombre-persona (trabaja)
t2 ¬ max número-empleados(r fuerza-compañía (nombre-compañía,número-empleados)(t1))
Õnombre-compañía(r t3 (nombre-compañía,número-empleados)(t1) |x| r t4 (número-empleados)(t2))

b. t1 ¬ nombre-compañía G sum sueldo (trabaja)


t2 ¬ min nómina (r nómina-compañía (nombre-compañía,nómina)(t1))
Õnombre-compañía(r t3 (nombre-compañía,nómina)(t1) |x| r t4 (nómina)(t2))

c. t1 ¬ nombre-compañía G avg sueldo (trabaja)


t2 ¬ snombre-compañía = “Banco Importante” (t1)
Õ t3.nombre-compañía((r t3(nombre-compañía,salario-medio)(t1))
| x| t3.salario-medio > banco-importante.salario-medio (r banco-importante (nombre-compañía,salario-medio)(t2)))

3.11 Dense dos motivos por los que se puede decidir definir una vista.

Respuesta:
a. Las condiciones de seguridad pueden requerir que la base de datos lógica no sea totalmente visible
para todos los usuarios.
b. Puede que se desee crear un conjunto personalizado de relaciones que se adapte mejor que el modelo
lógico a la intuición de un usuario concreto.
3.12 Cítense dos problemas importantes del procesamiento de la operación actualización, expresadas en
términos de vistas.

Respuesta: Las vistas presentan problemas significativos si se expresan con ellas actualizaciones.
La dificultad radica en que las modificaciones de la base de datos, expresadas en términos de vistas, deben
traducirse en modificaciones de las relaciones reales en el modelo lógico de la base de datos.
a. Dado que la vista puede no tener todos los atributos de las tablas subyacentes, la inserción de una
tupla en la vista insertará tuplas en las tablas subyacentes, tomando valores nulos los atributos no participan
de la vista. Esto puede no ser conveniente, especialmente si el atributo en cuestión es parte de la clave
primaria de la tabla.

b. Si una vista es una reunión de varias tablas subyacentes y una inserción da como resultado tuplas con
nulos en las columnas de la reunión, no se logrará el efecto deseado de la inserción. En otras palabras, una
actualización para una vista puede no ser capaz de expresar, en absoluto, como actualiza para las relaciones de
base. Para un ejemplo explicativo, consultar el de la actualización de información-crédito, en el Apartado
3.5.2.

3.13 Sean los siguientes esquemas de relación:


R = (A, B, C)
S = (D, E, F)
Sean las relaciones r(R) y s(S). Se da una expresión del cálculo relacional de tuplas que sea equivalente a cada
una de las expresiones siguientes:
a. PA(R)
b. sB = 17 (r)
c. rxs
d. PA, F (sC = D(r x s))

Respuesta:
a. {t | $ q Î r (q[A] = t[A])}

b. {t | t Î r Ù t[B] = 17}

c. {t | $ p Î r $ q Î s (t[A] = p[A] Ù t[B] = p[B]Ù t[C] = p[C] Ù t[D] = q[D]


Ù t[E] = q[E] Ù t[F] = q[F])}

d. {t | $ p Î r $ q Î s (t[A] = p[A] Ù t[F] = q[F] Ù p[C] = q[D]}

3.14 Sea R = (A, B, C) y sean r1 y r2 relaciones del esquema R. Se da una expresión del cálculo relacional
de dominios que sea equivalente a las expresiones siguientes:
a. PA(r1)
b. sB = 17 (r1)
c. . r1 È r2
d. . r1 Ç r2
e. . r1 - r2
f. PA, B(r1) |x| PB, C(r2)

Respuesta:
a. {< t > | $ p, q (< t, p, q > Î r1)}

b. {< a, b, c > | < a, b, c > Î r1 Ù b = 17}


c. {< a, b, c > | < a, b, c > Î r1 Ú < a, b, c > Î r2}

d. {< a, b, c > | < a, b, c > Î r1 Ù < a, b, c > Î r2}

e. {< a, b, c > | < a, b, c > Î r1 Ù < a, b, c > Ï r2}

f. {< a, b, c > | $ p, q (< a, b, p > Î r1 Ù < q, b, c > Î r2)}

3.15 Repítase el Ejercicio 3.5 usando el cálculo relacional de tuplas y el de dominios.

Respuesta:
a. Averiguar los nombres de todos los empleados que trabajan para el Banco Importante:
i. {t | $ s Î trabaja (t[nombre-persona] = s[nombre-persona]
Ù s[nombre-compañía] = “Banco Importante”)}
ii. { < p > | $ c, s (< p, c, s >Î trabaja Ù c = “Banco Importante”)}

b. Averiguar el nombre y la ciudad de residencia de todos los empleados que trabajan para el Banco
Importante:
i.{t |$ r Î empleado $ s Î trabaja (t[nombre-persona] = r[nombre-persona]
Ù t[ciudad] = r[ciudad] Ù r[nombre-persona] = s[nombre-persona]
Ù s[nombre-compañía] = “Banco Importante”)}
ii. {< p,c > | $ co, sa, st (< p,co,sa >Î trabaja
Ù < p,st,c >Î empleado Ù co = “Banco Importante”)}

c. Averiguar los nombres, direcciones y ciudades de residencia de todos los empleados que trabajan
para el Banco Importante y ganan más de 10.000 € anuales.
i. {t | t Î empleado Ù ($ s Î trabaja ( s[nombre-persona] = t[nombre-persona]
Ù s[nombre-compañía] = “Banco Importante” Ù s[sueldo] >
10.000))}
ii. {< p, s, c > | < p, s, c > Î empleado Ù $ co, sa (< p,co,sa > Î trabaja
Ù co = “Banco Importante” Ù sa > 10.000)}

d. Averiguar el nombre de todos los empleados de esta base de datos que viven en la misma ciudad que
la compañía para la que trabajan:
i. {t | $ e Î empleado $ w Î trabaja $ c Î compañía
(t[nombre-persona] = e[nombre-persona]
Ù e[nombre-persona] = w[nombre-persona]
Ù w[nombre-compañía] = c[nombre-compañía] Ù e[ciudad] = c[ciudad])}
ii. {< p > | $ st, c, co, sa (< p,st,c > Î empleado
Ù < p,co,sa > Î trabaja Ù < co,c > Î compañía)}

e. Averiguar el nombre de todos los empleados que viven en la misma ciudad y en la misma calle que
sus jefes:
i. { t | $ l Î empleado $ m Î jefe $ r Î empleado
(l[nombre-persona] = m[nombre-persona] Ù m[nombre-jefe] =
r[nombre-persona]
Ù l[calle] = r[calle] Ù l[ciudad] = r[ciudad] Ù t[nombre-persona] =
l[nombre-persona])}
ii. {< t > | $ s, c, m (< t, s, c > Î empleado Ù < t,m > Î jefe Ù <
m, s, c > Î empleado)}

f. Averiguar el nombre de todos los empleados de esta base de datos que no trabajan para el Banco
Importante:
Si se permite que aparezcan personas en la base de datos (por ejemplo en empleado) pero que no
aparezcan en trabaja, el problema se complica. Más adelante se dan soluciones para este caso más realista.
i. { t | $ w Î trabajas ( w[nombre-compañía] ¹ “Banco Importante”
Ù t[nombre-persona] = w[nombre-persona])}
ii. { < p > | $ c, s (< p, c, s > Î trabaja Ù c ¹ “Banco Importante”)}
Si las personas no pueden trabajar para cualquier compañía:
i. { t | $ e Î empleado ( t[nombre-persona] = e[nombre-persona] Ù ¬ $ w Î trabaja
(w[nombre-compañía] = “Banco Importante”
Ù w[nombre-persona] = t[nombre-persona]))}
ii. { < p > | $ s, c (< p, s, c > Î empleado) Ù ¬ $ x, y
(y = “Banco Importante”Ù < p, y, x > Î trabaja)}

g. Averiguar el nombre de todos los empleados que ganan más que cualquier empleado del Banco
Pequeño:
i. { t | $ w Î trabaja ( t[nombre-persona] = w[nombre-persona] Ù " s Î trabaja
(s[nombre-compañía] = “Banco Pequeño” Þ w[sueldo] >
s[sueldo]))}
ii. {< p > | $ c, s (< p, c, s > Î trabaja Ù " p2, c2, s2
(< p2, c2, s2 > Ï trabaja Ú c2 ¹ “Banco Pequeño” Ú s >
s2))}

h. Supóngase que las compañías pueden estar ubicadas en varias ciudades. Buscar todas las empresas
con sede en todas las ciudades en las que tiene sede el Banco Pequeño.
Nota: El Banco Pequeño se incluirá en cada respuesta.
i. {t | " s Î compañía (s[nombre-compañía] = “Banco Pequeño” Þ
$ r Î compañía (t[nombre-compañía] = r[nombre-compañía] Ù r[ciudad] =
s[ciudad]))}
ii. {< co > | " co2, ci2 (< co2, ci2 > Ï compañía
Ú co2 ¹ “Banco Pequeño” Ú < co,ci2 > Î compañía)}

3.16 Sean R = (A,B) y S = (A,C), y sean las relaciones r(R) y s(S). Escribir expresiones del álgebra
relacional equivalentes a las siguientes expresiones del cálculo relacional de dominios:
a. {<a> | $ b (<a, b> Î r Ù b = 17)}
b. {<a, b, c> | <a, b> Î r Ù <a, c> Î s}
c. {<a> | $ b (<a, b> Î r) Ú " c ($ d (<d, c> Î s) Þ <a, c> Î s)}
d. {<a> | $ c (<a, c> Î s) Ù $ b1, b2 (<a, b1> Î r Ù < c, b2> Î r Ù b1 > b2))}

Respuesta:
a. ÕA (sB = 17 (r))

b. r |x| s

c. ÕA(r) È (r ¸ sB(ÕC(s)))

d. Õr.A ((r |x| s) |x| c=r2.A?Ù r.B >r2.B (rr2(r)))


1 1

Es interesante notar que (d) es una abstracción de la célebre consulta “Averiguar los empleados que ganan
más que su propio jefe.” Para observar esto, sea R = (emp, sal), S = (emp, jef).

3.17 Sean R = (A, B) y S = (A ,C), y sean las relaciones r(R) y s(S). Utilizando la constante especial nulo,
escríbanse expresiones del cálculo relacional de tuplas equivalentes a cada una de las siguientes:
a. r |x[ s
b. r ]x[ s
c. r ]x| s

Respuesta:
a. {t | $r Î R $s Î S (r[A] = s[A] Ù t[A] = r[A] Ù t[B] = r[B] Ù t[C] = s[C]) Ú
$s Î S(¬$r Î R(r[A] = s[A]) Ù t[A] = s[A] Ù t[C] = s[C] Ù t[B] = nulo)}

b. {t | $r Î R $s Î S (r[A] = s[A] Ù t[A] = r[A] Ù t[B] = r[B] Ù t[C] = s[C]) Ú


$r Î R(¬$s Î S(r[A] = s[A]) Ù t[A] = r[A] Ù t[B] = r[B] Ù t[C] = nulo) Ú
$s Î S(¬$r Î R(r[A] = s[A]) Ù t[A] = s[A] Ù t[C] = s[C] Ù t[B] = nulo)}

c. {t | $r Î R $s Î S (r[A] = s[A] Ù t[A] = r[A] Ù t[B] = r[B] Ù t[C] = s[C]) Ú


$r Î R(¬$s Î S(r[A] = s[A]) Ù t[A] = r[A] Ù t[B] = r[B] Ù t[C] = nulo)}

3.18 Dense dos motivos por los que se puedan introducir valores nulos en la base de datos.

Respuesta: Se pueden introducir nulos en la base de datos porque el valor actual es desconocido o no existe.
Por ejemplo, un empleado cuya dirección ha cambiado y cuya nueva dirección todavía no se conoce, debería
conservarse con una dirección nula. Si las tuplas de empleados tienen un atributo compuesto dependencias y
un empleado en concreto no tiene dependencias, entonces el atributo de ese empleado deberían tener un valor
nulo.

3.19 Algunos sistemas permiten los valores nulos marcados. Un valor nulo marcado ^i es igual a sí
mismo, pero si i ¹ j, entonces ^i ¹ ^j. Una aplicación de valores nulos marcados debe permitir ciertas
actualizaciones mediante el uso de vistas. Considérese la vista información-préstamo (Apartado 3.5).
Muéstrese la manera en que se puedan utilizar valores nulos marcados para permitir la inserción de la tupla
(“González”, 1900) mediante información-préstamo.

Respuesta:
Para insertar la tupla (“González”, 1900) en la vista información-préstamo, se puede hacer lo siguiente:
prestatario ¬ (“González”,^k) È prestatario
préstamo ¬ (^k ^, 1900) È préstamo
de tal manera que ^k es un nuevo nulo marcado, que todavía no existe en la base de datos.
CAPITULO 4

SQL

El capítulo 4 abarca el lenguaje relacional SQL. la discusión está basada en el SQL-92, dado que el SQL más
reciente:1999 aún no está ampliamente soportado. Las aplicaciones aportadas por SQL:1999 están cubiertas
en los Capítulos 9 y 22. Las restricciones de integridad y las características de autorización del SQL-92 se
describen en el Capítulo 6. Al ser SQL un lenguaje muy amplio, muchas de sus características no se abarcan
aquí, al no ser apropiadas para un curso de introducción de bases de datos. Libros estándar sobre SQL, tales
como Date y Darwen [1993] y Melton y Simon [1993], o manuales de sistemas de bases de datos, se pueden
emplear como suplemento por aquellos estudiantes que quieran ahondar más profundamente en la
problemática del SQL.
Aunque es posible cubrir este capítulo haciendo sólo los ejercicios escritos, se recomienda
enormemente el acceso a un sistema de bases de datos actual, que soporte SQL. El modelo de ejercicios
empleado tiene por objeto crear una base de datos moderadamente extensa y dar a los estudiantes una lista de
consultas en Inglés, para escribirlas y ejecutarlas mediante SQL. Publicamos las respuestas apropiadas (esto
es, el resultado de las relaciones que deberían tener lugar, Este enfoque permite que los estudiantes
comprueben sus propias respuestas para corregirlas inmediatamente, sin tener que esperar a su evaluación y,
por lo tanto, hace que el proceso de aprendizaje sea más rápido. Unos pocos de tales ejemplos están
disponibles en la página Web de este libro.
Los ejercicios correspondientes al diseño de la base de datos se han pospuesto mejor hasta después
del Capítulo7.
Dando por hecho que los protocolos ODBC y JDBC se han convertido rápidamente en el medio principal de
acceso a bases de datos, se ha extendido significativamente la cobertura de estos dos protocolos, incluyendo
algunos ejemplos. Sin embargo, nuestro alcance es sólo una introducción y omite muchos detalles que son
útiles en la práctica. Los manuales / tutorías online o los libros de texto que tratan estos protocolos, se
deberían emplear como suplementos para ayudar a que los estudiantes hagan un uso completo de estos
protocolos.

Cambios a la tercera edición:

La cobertura del SQL se ha extendido para incluir la cláusula with, ODBC, JDBC y esquemas, catálogos y
entornos (Apartado 4.14).
Ejercicios

4.1 Considérese la base de datos de seguros de la Figura 4.12, donde las claves primarias están
subrayadas.
Formúlense las siguientes consultas SQL para esta base de datos relacional.
a. Buscar el número total de las personas cuyos coches se han visto involucrados en un accidente en
1989.
b. Buscar el número de accidentes en los cuales se ha visto involucrado un coche perteneciente a
“Santos”.
c. Añadir un nuevo accidente a la base de datos; supóngase cualquier valor para los atributos
necesarios.
d. Borrar el Mazda de “Santos”.
e. Actualizar el importe de daños del coche de matrícula "2002BCD" en el accidente con número de
informe "AR2197" a 3.000 €.

Respuesta: Nota: La relación participado relaciona conductores, coches y accidentes.


a. Buscar el número total de las personas cuyos coches se han visto involucrados en un accidente en
1989.
Nota: esto no es lo mismo que el número total de accidentes en 1989. Las personas con varios accidentes sólo
se deben contar una vez.
select count (distinct nombre)
from accidente, participado, persona
where accidente.número-informe = participado.número-informe
and participado.id-conductor = persona.id-conductor
and fecha between date ’1989-00-00’ and date ’1989-12-31’

b. Buscar el número de accidentes en los que se ha visto involucrado un coche perteneciente a


“Santos”.
select count (distinct *)
from accidente
where exists
(select *
from participado, persona
where participado.id-conductor = persona.id-conductor
and persona.nombre = ’Santos’
and accidente.número-informe = participado.número-informe)

c. Añadir un nuevo accidente a la base de datos; supóngase cualquier valor para los atributos
necesarios.
Se supone que el conductor era “Santos”, aunque podría haber sido cualquier otro. También se
supone que “Santos” tiene un Toyota. En primer lugar se debe encontrar la matrícula del coche en cuestión.
Entonces, las relaciones participado y accidente se deben actualizar con el fin de registrar el accidente y
asociarlo al coche dado. Se asumen los valores “Berkeley” para lugar, ’2001-09-01’ para fecha, 4007 para
número-informe y 3.000 para el importe de los daños.

persona (id-conductor, nombre, dirección)


coche (matrícula, modelo, año)
accidente (número-informe, fecha, lugar)
posee (id-conductor, matrícula)
participado (id-conductor, coche, número-informe, importe-daños)

Figura 4.12. Base de datos de seguros.


insert into accidente
values (4007, ’2001-09-01’, ’Berkeley’)

insert into participado


select o.id-conductor, c.matrícula, 4007, 3.000
from persona p, posee o, coche c
where p.nombre = ’Santos’ and p.id-conductor = o.id-conductor and
o.matrícula = c.matrícula and c.modelo = ’Toyota’

d. Borrar el Mazda de “Santos”.


Dado que modelo no es una clave de la relación coche, se puede asumir que sólo uno de los coches de Santos
es un Mazda, o borrar todos los Mazda de Santos (la consulta es la misma). De nuevo se supone que nombre
es una clave de persona.
delete coche
where modelo = ’Mazda’ and matrícula in
(select matrícula
from persona p, posee o
where p.nombre = ’Santos’ and p.id-conductor = o.id-conductor)

Nota: Los registros accidente y participado asociados con el Mazda todavía existen.

e. Actualizar el importe de daños del coche de matrícula "2002BCD" en el accidente con número de
informe "AR2197" a 3.000 €.
update participado
set importe-daños = 3.000
where número-informe = “AR2197” and id-conductor in
(select id-conductor
from posee
where matrícula = “2002BCD”)

4.2 Considérese la base de datos de empleados de la Figura 4.13, donde las claves primarias están
subrayadas.
Proporciónese una expresión SQL para cada una de las consultas siguientes:
a. Buscar los nombres de todos los empleados que trabajan para el Banco Importante.
b. Buscar los nombres y ciudades de residencia de todos los empleados que trabajan en el Banco
Importante.
c. Buscar los nombres, direcciones y ciudades de residencia de todos los empleados que trabajan en el
Banco Importante y que ganan más de 10.000 €.
d. Buscar todos los empleados que viven en la ciudad de la empresa para la que trabajan.
e. Buscar todos los empleados que viven en la misma ciudad y en la misma calle que sus jefes.
f. Buscar todos los empleados que no trabajan en el Banco Importante.
g. Buscar todos los empleados que ganan más que cualquier empleado del Banco Pequeño.
h. Supóngase que las empresas pueden tener sede en varias ciudades. Buscar todas las empresas con
sede en todas las ciudades en las que tiene sede el Banco Pequeño.
i. Buscar todos los empleados que ganan más que el sueldo medio de los empleados de su empresa.
j. Buscar la empresa que tiene el mayor número de empleados.
k. Buscar la empresa que tiene el menor sueldo medio.
l. Averiguar las compañías cuyos empleados ganan un sueldo más alto, en media, que el sueldo medio
del Banco Importante.
Respuesta:
a. Averiguar los nombres de todos los empleados que trabajan para el Banco Importante.
select nombre-empleado
from trabaja
where nombre-compañía = ’Banco Importante’

b. Averiguar el nombre y la ciudad de residencia de todos los empleados que trabajan para el Banco
Importante.
select e.nombre-empleado, ciudad
from empleado e, trabaja w
where w.nombre-compañía = ’Banco Importante’ and
w.nombre-empleado = e.nombre-empleado

c. Averiguar los nombres, direcciones y ciudades de residencia de todos los empleados que trabajan
para el Banco Importante y ganan más de 10.000 € anuales.
Si las personas pueden trabajar para varias compañías la solución siguiente sólo listará aquellas que ganen
más de 10.000 € anuales sólo del “Banco importante”.
select *
from empleado
where nombre-empleado in
(select nombre-empleado
from trabaja
where nombre-compañía = ’Banco Importante’ and sueldo ¿ 10.000)

Al igual que en la solución de la consulta anterior, también se puede emplear una reunión para resolver esto.
d. Buscar todos los empleados que viven en la ciudad de la empresa para la que trabajan.
select e.nombre-empleado
from empleado e, trabaja w, compañía c
where e.nombre-empleado = w.nombre-empleado and e.ciudad = c.ciudad and
w.nombre-compañía = c.nombre-compañía

e. Buscar todos los empleados que viven en la misma ciudad y en la misma calle que sus jefes.
select P.nombre-empleado
from empleado P, empleado R, jefe M
where P.nombre-empleado = M.nombre-empleado and
M.nombre-jefe = R.nombre-empleado and
P.calle = R.calle and P.ciudad = R.ciudad

f. Buscar todos los empleados que no trabajan en el Banco Importante.


Las soluciones siguientes asumen que todas las personas trabajan sólo para una compañía.
select nombre-empleado
from trabaja
where nombre-compañía ¹ ’Banco Importante’

Si se permite que aparezcan personas en la base de datos (por ejemplo en empleado) pero que no aparezcan en
trabaja, o si las personas pueden trabajar para más de una compañía, la solución es un poco más complicada.
select nombre-empleado
from empleado
where nombre-empleado not in
(select nombre-empleado
from trabaja
where nombre-compañía = ’Banco Importante’)

g. Buscar todos los empleados que ganan más que cualquier empleado del Banco Pequeño.
Las soluciones siguientes asumen que todas las personas trabajan sólo para una compañía.
select nombre-empleado
from trabaja
where sueldo > all
(select sueldo
from trabaja
where nombre-compañía = ’Banco Pequeño’)

Si las personas pueden trabajar para varias compañías y se desea considerar el sueldo total de cada persona, el
problema es más complejo. Aunque puede resolverse empleando una subconsulta anidada, seguidamente se
presenta la manera de hacerlo con la cláusula with.
with sueldo-total-empleado as
(select nombre-empleado, sum(sueldo) as sueldo-total
from trabaja
group by nombre-empleado
)
select nombre-empleado
from sueldo-total-empleado
where sueldo-total > all
(select sueldo-total
from sueldo-total-empleado, trabaja
where trabaja.mombre-compañía = ’Banco Pequeño’ and
sueldo-total-empleado.nombre-empleado = trabaja.nombre-empleado
)

h. Supóngase que las empresas pueden tener sede en varias ciudades. Buscar todas las empresas con
sede en todas las ciudades en las que tiene sede el Banco Pequeño.
La solución más simple emplea la comparación contains que fue incluida en Sistem R original, lenguaje
Sequel, pero que no está presente en las posteriores versiones SQL.
select T.nombre-compañía
from compañía T
where (select R.ciudad
from compañía R
where R.nombre-compañía = T.nombre-compañía)
contains
(select S.ciudad
from compañía S
where S.nombre-compañía = ’Banco Pequeño’)

Lo que sigue es una solución en SQL estándar.


select S.nombre-compañía
from compañía S
where not exists ((select ciudad
from compañía
where nombre-compañía = ’Banco Pequeño’)
except
(select ciudad
from compañía T
where S.nombre-compañía = T.nombre-compañía))
i. Buscar todos los empleados que ganan más que el sueldo medio de los empleados de su empresa.
La solución siguiente supone que todas las personas trabajan, a lo sumo, para una compañía.

empleado (nombre-empleado, calle, ciudad)


trabaja (nombre-empleado, nombre-compañía, sueldo)
compañía (nombre-compañía, ciudad)
jefe (nombre-empleado, nombre-jefe)

Figura 4.13. Base de datos de empleados.

select nombre-empleado
from trabaja T
where sueldo > (select avg (sueldo)
from trabaja S
where T.nombre-compañía = S.nombre-compañía)

j. Buscar la empresa que tiene el mayor número de empleados.


select nombre-compañía
from trabaja
group by nombre-compañía
having count (distinct nombre-empleado) >= all
(select count (distinct nombre-empleado)
from trabaja
group by nombre-compañía)

k. Buscar la empresa que tiene el menor sueldo medio.


select nombre-compañía
from trabaja
group by nombre-compañía
having sum (sueldo) <= all (select sum (sueldo)
from trabaja
group by nombre-compañía)

l. Encontrar las compañías cuyos empleados ganan un salario mayor, en promedio, que el salario
medio del Banco Importante.
select nombre-compañía
from trabaja
group by nombre-compañía
having avg (sueldo) > (select avg (sueldo)
from trabaja
where nombre-compañía = ’Banco Importante’)

4.3 Considérese la base de datos relacional de la Figura 4.13. Formúlese una expresión SQL para cada
una de las consultas siguientes.
a. Modificar la base de datos de forma que Santos viva en Ávila
b. Incrementar en un 10% el sueldo de todos los empleados del Banco Importante.
c. Incrementar en un 10% el sueldo de todos los jefes del Banco Importante.
d. Incrementar en un 10% el sueldo de todos los jefes del Banco Importante, a menos que su sueldo
pase a ser mayor que 100.000 €,en cuyo caso, se incrementará su sueldo sólo en un 3%.
e. Borrar todas las tuplas de la relación trabaja correspondientes a los empleados del Banco Pequeño.

Respuesta: La solución para la parte a supone que cada persona sólo tiene una tupla en la relación
empleado. Las soluciones para las partes c y d suponen que cada persona trabaja, cómo máximo, para una
compañía.
a. Modificar la base de datos de forma que Santos viva en Tres Cantos.
update empleado
set ciudad = ’Tres Cantos’
where nombre-persona = ’Santos’

b. Incrementar en un 10% el sueldo de todos los empleados del Banco Importante.


update trabaja
set sueldo = sueldo * 1.1
where nombre-compañía = ’Banco Importante’

c. Incrementar en un 10% el sueldo de todos los jefes del Banco Importante.


update trabaja
set sueldo = sueldo * 1.1
where nombre-empleado in (select nombre-jefe
from jefe)
and nombre-compañía = ’Banco Importante’

d. Incrementar en un 10% el sueldo de todos los jefes del Banco Importante, a menos que su sueldo
pase a ser mayor que 100.000 €, en tal caso, incrementarlo sólo en un 3%.
update trabaja T
set T.sueldo = T.sueldo * 1.03
where T.nombre-empleado in (select nombre-jefe
from jefe)
and T.sueldo * 1.1 > 100.000
and T.nombre-compañía = ’Banco Importante’

update trabaja T
set T.sueldo = T.sueldo * 1.1
where T.nombre-empleado in (select nombre-jefe
from jefe)
and T.sueldo * 1.1 <= 100.000
and T.nombre-compañía = ’Banco Importante’

SQL-92 aporta una operación case (consultar el Ejercicio 4.11), usando la cuál se presenta una solución más
concisa:

update trabaja T
set T.sueldo = T.sueldo
(case
when (T.sueldo . 1.1 > 100.000) then 1.03
else 1.1
)
where T.nombre-empleado in (select nombre-jefe
from jefe) and
T.nombre-compañía = ’Banco Importante’

e. Borrar todas las tuplas de la relación trabaja para los empleados del Banco Pequeño.
delete trabaja
where nombre-compañía = ’Banco Pequeño’
4.4 Sean los siguientes esquemas de relaciones:

R = (A, B, C)
S = (D, E, F)

Además, considérense las relaciones r(R) y s(S). Obténgase la expresión SQL equivalente a las consultas
siguientes:
a. PA(r)
b. s B = 17 (r)
c. r x s
d. PA,F (s C = D (r x s))

Respuesta:
a. ÕA(r)
select distinct A
from r

b. sB = 17 (r)
select *
from r
where B = 17

c. r×s
select distinct *
from r, s

d. ÕA,F (sC =D(r × s))


select distinct A, F
from r, s
where C = D

4.5 Sea R = (A, B, C) y sean r1 y r2 relaciones sobre el esquema R. Proporciónese una expresión SQL
equivalente a cada una de las siguientes consultas:
a. r1 U r2
b. r1 Ç r2
c. r1 - r2
d. PAB (r1) |x| PBC (r2)

Respuesta:
a. r1 È r2
(select *
from r1)
union
(select *
from r2)

b. r1 Ç r2
Se puede escribir esto empleando la operación intersect, que es el enfoque preferido pero, por variar, se
presenta una solución empleando una subconsulta anidada.
select *
from r1
where (A, B, C) in (select *
from r2)
c. r1 - r2
select . from r1
where (A, B, C) not in (select
. from r2)

Esto también se puede resolver empleando la cláusula except.

d. ÕAB(r1) |x| ÕBC(r2)


select r1.A, r2.B, r3.C
from r1, r2
where r1.B = r2.B

4.6 Sean R = (A, B) y S = (A ,C) y sean las relaciones r(R) y s(S). Formúlese una expresión SQL
equivalente a cada una de las consultas siguientes.
a. {<a> | $ b (<a, b> Î r Ù b = 17)}
b. {<a, b, c> | <a, b> Î r Ù <a, c> Î s}
c. {<a> | $ c (<a, c> Î s Ù $ b1 , b2 (<a, b1> Î r Ù <c, b2> Î r Ù b1 >
b2 ))}

Respuesta:
a. {<a> | $ b (<a, b> Î r Ù b = 17)}
select distinct A
from r
where B = 17
b. {<a, b, c> | <a, b> Î r Ù <a, c> Î s}
select distinct r.A, r.B, s.C
from r, s
where r.A = s.A
c. {<a> | $ c (<a, c> Î s Ù $ b1 , b2 (<a, b1> Î r Ù <c, b2> Î r Ù b1 >
b2))}
select distinct s.A
from s, r e, r m
where s.A = e.A and s.C = m.A and e.B > m.B

4.7 Demuéstrese que en SQL <> all es equivalente a not in.

Respuesta: Sea S el conjunto que denota el resultado de una subconsulta SQL. Se compara (x <> all S) con
(x not in S). Si un valor concreto x1 cumple (x1 <> all S) entonces para todos los elementos y de S x1 ¹ y. Así,
x1 no es un miembro de S y debe cumplir (x1 not in S). Análogamente, supóngase que hay un determinado
valor x2 que cumple (x2 not in S). No puede ser igual a ningún elemento w que pertenezca a S y, por tanto, se
cumplirá (x2 <> all S). Por lo tanto las dos expresiones son equivalentes.

4.8 Considérese la base de datos relacional de la Figura 4.13. Utilizando SQL, defínase una vista que
contenga nombre-jefe y el sueldo medio de todos los empleados que trabajan para ese jefe. Explicar por qué
el sistema de base de datos no debería permitir que las actualizaciones se expresaran en términos de esta vista.
Respuesta:
create view salinfo as
select nombre-jefe, avg(sueldo)
from jefe m, trabaja w
where m.nombre-empleado = w.nombre-empleado
group by nombre-jefe

No se debería permitir actualizar en esta vista, porque no hay manera de determinar como cambiar los datos
subyacentes. Por ejemplo, supóngase que el requerimiento es “cambiar el sueldo medio de los empleados que
trabajan para Santos a 200€”. ¿Se debería modificar el sueldo, de cualquiera que trabajara para Santos, a
200€? ¿O debería ,el primer (o más, si es necesario) empleado encontrado que trabaja para Santos, tener su
salario ajustado para que la media sea de 200€? Ninguno de estos enfoques tiene realmente sentido.

4.9 Considérese la consulta SQL


select p.a1
from p, r1, r2
where p.a1 = r1.a1 or p.a1 = r2.a1

¿Bajo qué condiciones la consulta anterior devuelve los valores de p.a1 que están tanto en r1 como en r2 ?
Examínense cuidadosamente los casos en que r1 o r2 pueden estar vacíos.

Respuesta: La consulta selecciona aquellos valores de p.a1 que son iguales a algunos valores de r1.a1 o r2.a1
si y sólo si ambos, r1 y r2, no están vacíos. Si están vacíos uno o ambos, r1 y r2 , el producto cartesiano de p, r1
y r2 está vacío, por lo que el resultado de la consulta también lo es. Naturalmente, si el propio p está vacío, el
resultado es el esperado, es decir, vacío.

4.10 Escríbase una consulta SQL, sin emplear la cláusula with, para encontrar todas las sucursales donde
la cantidad total de depósitos sea menor que la cantidad total media depositada en todas las sucursales usando:
a. Una consulta anidada en la cláusula from.
b. Una consulta anidada en una cláusula having.

Respuesta: Se obtienen los nombres de las sucursales además de la cantidad total de depósitos de la
sucursal.
a. Empleando una consulta anidada en la cláusula from.

select nombre-sucursal, saldo-total


from (select nombre-sucursal, sum (saldo)
from cuenta
group by nombre-sucursal) as total-sucursal (nombre-sucursal, saldo-total)
where saldo-total ¡
( select avg (saldo-total)
from (select nombre-sucursal, sum (saldo)
from cuenta
group by nombre-sucursal) as total-sucursal (nombre-sucursal, saldo-
total)
)
b. Empleando una consulta anidada en una cláusula having.

select nombre-sucursal, sum (saldo)


from cuenta
group by nombre-sucursal
having sum (saldo) ¡
( select avg (saldo-total)
from (select nombre-sucursal, sum (saldo)
from cuenta
group by nombre-sucursal) as total-sucursal (nombre-sucursal, saldo-
total)
)

4.11 Supóngase que se tiene una relación notas(id-estudiante, puntuación) y que se quiere clasificar a los
estudiantes en función de la puntuación del modo siguiente: SS: si la puntuación es menor que 5 AP: si la
puntuación es mayor o igual que 5 y menor que 7, NT: si la puntuación es mayor o igual que 7 y menor que
8,5 SB: si la puntuación es mayor o igual que 8,5. Escríbanse consultas para hacer lo siguiente:
a. Mostrar la clasificación de cada estudiante, en términos de la relación notas.
b. Encontrar el número de estudiantes por clasificación.

Respuesta: Se emplea la operación case aportada por SQL-92:


a. Para mostrar la clasificación de cada estudiante:

select id-estudiante,
(case
when puntuación < 5 then ’SS’,
when (puntuación ³ 5 and puntuación < 7) then ’AP’,
when (puntuación ³ 7 and puntuación < 8,5) then ’NT’,
else ’SB’
end) as clasificación
from notas

b. Para encontrar el número de estudiantes por clasificación se usa la siguiente consulta, donde
clasificación es el resultado de la consulta dada como solución de la parte a.

select clasificación, count(id-estudiante)


from clasificación
group by clasificación

4.12 SQL-92 proporciona una operación n-aria denominada coalesce que se define como sigue:
coalesce(A1,A2, . . . , An) devuelve el primer Ai no nulo en la lista A1,A2, . . .,An, y devuelve nulo si todos los
A1,A2, . . .,An son nulos. Muéstrese cómo expresar la operación coalesce usando la operación case.

Respuesta:
case
when A1 is not nulo then A1
when A2 is not nulo then A2
...
when An is not nulo then An
else nulo
end
4.13 Sean a y b relaciones con los esquemas A(nombre, dirección, puesto) y B(nombre, dirección,
sueldo), respectivamente. Indíquese como expresar a natural full outer join b, utilizando la operación full
outer join con una condición on y la operación coalesce. Compruébese que la relación resultado no contiene
dos copias de los atributos nombre y dirección y que la solución es válida, incluso si dichos atributos de
alguna tupla en a o b toman valor nulo para los atributos nombre o dirección.

Respuesta:
select coalesce(a.nombre, b.nombre) as nombre,
coalesce(a.dirección, b.dirección) as dirección,
a.puesto,
b.sueldo
from a full outer join b on a.nombre = b.nombre and
a.dirección = b.dirección

4.14 Dada una definición de esquema SQL para la base de datos de empleados de la Figura 4.13, elíjase
un dominio apropiado para cada atributo y una clave primaria para cada esquema de relación.

Respuesta:
create domain nombres-compañía char(20)
create domain nombres-ciudad char(30)
create domain nombres-persona char(20)

create table empleado


(nombre-empleado nombres-persona,
calle char(30),
ciudad nombres-ciudad,
primary key (nombre-empleado))

create table trabaja


(nombre-empleado nombres-persona,
nombre-compañía nombres-compañía,
sueldo numeric(8, 2),
primary key (nombre-empleado))

create table compañía


(nombre-compañía nombres-compañía,
ciudad nombres-ciudad,
primary key (nombre-compañía))

create table jefe


(nombre-empleado nombres-persona,
nombre-jefe nombres-persona,
primary key (nombre-empleado))

4.15 Escríbanse condiciones check para el esquema del ejercicio anterior para asegurar que:
a. Cada empleado trabaja para una empresa con sede en la ciudad de residencia del empleado.
b. Ningún empleado gana un sueldo mayor que el de su jefe.
Respuesta:
a. condición check para la tabla trabaja:
check((nombre-empleado, nombre-compañía) in
(select e.nombre-empleado, c.nombre-compañía
from empleado e, compañía c
where e.ciudad = c.ciudad
)
)

b. condición check para la tabla trabaja:


check(
sueldo < all
(select sueldo-jefe
from (select nombre-jefe, jefe.nombre-empleado as nombre-emp,
sueldo as sueldo-jefe
from trabaja, jefe
where trabaja.nombre-empleado = jefe.nombre-jefe)
where nombre-empleado = nombre-emp
)
)

La solución es ligeramente complicada por el hecho de que dentro del ámbito de la expresión select, la
relación externa trabaja, dentro de la cuál se realiza la inserción, es inaccesible. De ahí, el cambio de nombre
del atributo nombre-empleado a nombre-emp. Bajo estas circunstancias es más natural emplear declaraciones,
las cuales se introducen en el Capítulo 6.

4.16 Descríbanse las circunstancias en que se debería utilizar SQL incorporado, en lugar de SQL o de un
lenguaje de programación de propósito general.

Respuesta: Escribir consultas en SQL es generalmente más fácil que codificar las mismas consultas en un
lenguaje de programación de propósito general. No obstante, no todos los tipos de consultas se pueden
escribir en SQL. Además, acciones no declarativas tales como la impresión de un informe, interactuando con
un usuario o enviando los resultados de una consulta a un interface de usuario gráfico, no puede hacerse desde
dentro de SQL. Bajo circunstancias en las que se desea el mejor de ambos mundos, se puede elegir SQL
incorporado o SQL dinámico, en vez de emplear sólo SQL o un lenguaje de programación de propósito
general.
El SQL incorporado tiene la ventaja de que los programas son menos complicados, dado que evita el
agrupamiento de las llamadas de las funciones ODBC o JDBC, pero requiere un procesador especial.
CAPITULO 5

OTROS LENGUAJES RELACIONALES

En este capítulo se estudian dos lenguajes relacionales adicionales, QBE y Datalog. QBE, basado en el cálculo
relacional de dominios, constituye la base para los lenguajes de consultas, soportado por un gran número de
sistemas de bases de datos y diseñado para ordenadores personales, tales como Microsoft Access, FoxPro, etc.
Desafortunadamente no hay ningún estándar para QBE; nuestro alcance está basado en la descripción original
del QBE. La descripción tendrá que ser completada mediante el material de las guías de usuario de los
sistemas de bases de datos específicos que están siendo empleados. Uno de los puntos a tener en cuenta es la
semántica precisa de las operaciones de agregación, la cual es particularmente no estándar.
El lenguaje Datalog tiene varias similitudes con Prolog, que algunos estudiantes pueden haber
estudiado en otros cursos. Datalog se diferencia de Prolog en que su semántica es puramente declarativa, en
oposición a la semántica operacional de Prolog. Es importante enfatizar la diferencias, dado que la semántica
declarativa es capaz de utilizar estrategias de evaluación de consultas eficientes. Hay varias implantaciones de
Datalog disponibles en el dominio publico, tales como el sistema Coral de la Universidad de Wisconsin –
Madison, y XSB del State University de New York, Stony Brook, los cuales se pueden emplear para ejercicios
de programación. El sistema Coral también soporta objetos complejos tales como relaciones anidadas
(tratadas posteriormente en el Capítulo 9). Consultar la sección Herramientas, al final del Capítulo 5, para las
URLs de estos sistemas.

Cambios a la tercera edición:

La sintaxis y semántica, de agregaciones y actualizaciones QBE, se han modificado para simplificar la


semántica y eliminar algunas ambigüedades en las semánticas anteriores. La versión de QBE soportada por
Microsoft Access se ha tratado brevemente. Se ha eliminado Quel.
Ejercicios

5.1 Considérese la base de datos de seguros de la Figura 5.14, donde las claves primarias están
subrayadas. Formúlense las siguientes consultas en QBE:
a. Buscar el número total de las personas cuyos coches se han visto involucrados en un accidente en
1989.
b. Buscar el número de accidentes en los que se ha visto involucrado un coche perteneciente a
“Santos”.
c. Añadir un nuevo accidente a la base de datos; supóngase cualquier valor para los atributos
necesarios.
d. Borrar el Mazda de “Santos”.
e. Actualizar a 3.000 € el importe de daños del coche de matrícula "2002BCD", en el accidente con
número de informe "AR2197".

Respuesta: La relación participado relaciona coches y accidentes. Supóngase que el atributo fecha tiene
el formato “YYYY-MM-DD”.
a. Buscar el número total de las personas cuyos coches se han visto involucrados en un accidente en
1989.

accidente número-informe fecha lugar


informe fecha

participado id-conductor coche número-informe importe-daños


P.CNT.UNQ.ALL informe

condiciones
fecha =
( ³ 1989-00-00 and
£ 1989-12-31 )

b. Buscar el número de accidentes en los que se ha visto involucrado un coche perteneciente a


“Santos”.

persona id-conductor nombre dirección


conductor Santos

participado id-conductor coche número-informe importe-daños


conductor P.CNT.ALL

c. Añadir un nuevo accidente a la base de datos; supóngase cualquier valor para los atributos
necesarios.
Se supone que el conductor era “Santos”, aunque podría haber sido cualquier otro. También se supone que
“Santos” sólo tiene un Toyota.

acidente número-informe fecha lugar


I. 4007 1997-01-01 Berkeley

persona (id-conductor, nombre, dirección)


coche (matrícula, modelo, año)
accidente (número-informe, fecha, lugar)
posee (id-conductor, matrícula)
participado (id-conductor, coche, número-informe, importe-daños)

Figura 5.14. Base de datos de seguros.


participado id-conductor coche número-informe importe-daños
I. conductor matrícula 4007 3000

posee id-conductor matrícula


conductor matrícula

coche matrícula año modelo


matrícula año Toyota

persona id-conductor nombre dirección


conductor Santos

d. Borrar el Mazda de “Santos”.

persona id-conductor nombre dirección


conductor Santos

posee id-conductor matrícula


conductor matrícula

coche matrícula año modelo


D. matrícula Mazda

e. Actualizar a 3.000 € el importe de daños del coche de matrícula "2002BCD", en el accidente con
número de informe "AR2197".

posee id-conductor matrícula


conductor "2002BCD"

participado id-conductor coche número-informe importe-daños


conductor “AR2197” U.3000

5.2 Considérese la base de datos de empleados de la Figura 5.15. Proporcionar expresiones en QBE y
Datalog para cada una de las siguientes consultas:
a. Averiguar los nombres de todos los empleados que trabajan para el Banco Importante.
b. Averiguar el nombre y la ciudad de residencia de todos los empleados que trabajan para el Banco
Importante.
c. Averiguar el nombre, dirección y ciudad de residencia, de todos los empleados que trabajan para el
Banco Importante y ganan mas de 10.000€ anuales.
d. Buscar todos los empleados que viven en la ciudad de la empresa para la que trabajan.
e. Buscar todos los empleados que viven en la misma ciudad y en la misma calle que sus jefes.
f. Buscar todos los empleados que no trabajan en el Banco Importante.
g. Buscar todos los empleados que ganan más que cualquier empleado del Banco Pequeño.
h. Supóngase que las empresas pueden tener sede en varias ciudades. Buscar todas las empresas con
sede en todas las ciudades en las que tiene sede el Banco Pequeño.
Respuesta:

a. Averiguar los nombres de todos los empleados que trabajan para el Banco Importante.
i.

trabaja nombre-persona nombre-compañía sueldo


P._x Banco Importante

ii. consulta(X) :- trabaja(X, “Banco Importante”, Y)

b. Averiguar el nombre y la ciudad de residencia de todos los empleados que trabajan para el Banco
Importante.
i.

trabaja nombre-persona nombre-compañía sueldo


_x Banco Importante

empleado nombre-persona calle ciudad


P._x P._y

ii. consulta (X, Y ) :- empleado (X, Z, Y ), trabaja(X, “Banco Importante”, W)

c. Averiguar los nombres, direcciones y ciudades de residencia de todos los empleados que trabajan
para el Banco Importante y ganan más de 10.000 € anuales. Si las personas pueden trabajar para varias
compañías las soluciones siguientes únicamente listarán aquellas que ganen más de 10.000 € anuales, sólo del
“Banco Importante”.
i.

empleado nombre-persona calle ciudad


P._x P._y P._z

trabaja nombre-persona nombre-compañía sueldo


_x Banco Importante > 10.000

ii.
consulta (X, Y, Z ) :- vive (X, Z, Y ), trabaja(X, “Banco Importante”, W)
W > 10.000

d. Encontrar todos los empleados que viven en la misma ciudad en que está localizada la compañía
para la que trabajan.
i.

empleado nombre-persona calle ciudad


P._x _y

trabaja nombre-persona nombre-compañía sueldo


_x _c

compañía nombre-compañía ciudad


_c _y

ii. consulta (X) :- empleado (X, Y, Z), trabaja(X, V, W), compañía(V, Z)


e. Buscar todos los empleados que viven en la misma ciudad y en la misma calle que sus jefes.
i.

empleado nombre-persona calle ciudad


P._x _s _c
_y _s _c

jefe nombre-persona nombre-jefe


x y

ii. consulta (X) :- vive (X, Y, Z), jefe (X, V ), vive (V, Y, Z)

f. Buscar todos los empleados que no trabajan en el Banco Importante. Las soluciones siguientes
asumen que todas las personas trabajan para una compañía.
i.

trabaja nombre-persona nombre-compañía sueldo


P._x ¬ Banco Importante

ii. consulta (X) :- trabaja (X, Y, Z), Y ¹ “Banco Importante”

Si se permite que aparezcan personas en la base de datos (por ejemplo en empleado) pero que no aparezcan en
trabaja, o si las personas pueden trabajar para más de una compañía, la soluciones se complican ligeramente.
Se presentan a continuación:
i.

empleado nombre-persona calle ciudad


P._x

trabaja nombre-persona nombre-compañía sueldo


¬ _x Banco Importante

ii.
consulta (X) :- empleado (X, Y, Z), ¬p1 (X)
p1 (X) :- trabaja(X, “Banco Importante”, W)

g. Averiguar el nombre de todos los empleados que ganan más que cualquier empleado del Banco
Pequeño. Las soluciones siguientes asumen que todas las personas trabajan, como máximo, para una
compañía.
i.

trabaja nombre-persona nombre-compañía sueldo


Banco Pequeño _y
P._x > MAX.ALL._y

trabaja nombre-persona nombre-compañía sueldo


P._x _y
¬ Banco Pequeño > _y
ii.
consulta (X) :- trabaja (X, Y, Z), ¬p (X)
p (X) :- trabaja(X, C, Y 1), trabaja(V, “Banco Pequeño”, Y ), Y >Y1

h. Supóngase que las empresas pueden tener sede en varias ciudades. Buscar todas las empresas con
sede en todas las ciudades en las que tiene sede el Banco Pequeño.

Nota: El Banco Pequeño se incluirá en cada respuesta.


i.

ubicado-en nombre-compañía ciudad


Banco Pequeño _x
P._c _y
Banco Pequeño _y

condiciones
CNT.ALL._y =
CNT.ALL._x

ii.
consulta (X) :- compañía(X, C), not p(X)
p(X) :- compañía(X, C1), compañía(“Banco Pequeño”, C2), not compañía(X, C2)

5.3 Considérese la base de datos relacional de la Figura 5.15, donde las claves primarias están
subrayadas. Formúlense expresiones en QBE para cada una de las consultas siguientes:
a. Buscar todos los empleados que ganan más que el sueldo medio de los empleados de su empresa.
b. Buscar la empresa que tiene el mayor número de empleados.
c. Buscar la empresa que tiene el menor sueldo medio.
d. Averiguar las compañías cuyos empleados ganan un sueldo más alto, en media, que el sueldo medio
del Banco Importante.

Respuesta:
a. Buscar todos los empleados que ganan más que el sueldo medio de los empleados de su empresa.
Las soluciones siguientes asumen que todas las personas trabajan sólo para una compañía.

trabaja nombre-persona nombre-compañía sueldo


P. _y _x
_Y _z

condiciones
_x > AVG.ALL._z

b. Buscar la empresa que tiene el mayor número de empleados.

trabaja nombre-persona nombre-compañía sueldo


_x P.G.
_y G.

condiciones
CNT.UNQ._x ³ MAX.CNT.UNQ.ALL._y
c. Buscar la empresa que tiene el menor sueldo medio.

empleado (nombre-persona, calle, ciudad)


trabaja (nombre-persona, nombre-compañía, sueldo)
compañía (nombre-compañía, ciudad)
jefe (nombre-persona, nombre-jefe)

Figura 5.15. Base de datos de empleados.

trabaja nombre-persona nombre-compañía sueldo


P.G. _x
G. _y

condiciones
SUM.ALL._x £ MIN.SUM.ALL._y

d. Encontrar las compañías cuyos empleados ganan un salario mayor, en promedio, que el salario
medio del Banco Importante.

trabaja nombre-persona nombre-compañía sueldo


P.G. _x
Banco Importante _y

condiciones
AVG.ALL._x> AVG.ALL._y

5.4 Considérese la base de datos relacional de la Figura 5.15. Formúlense expresiones en QBE para cada
una de las consultas siguientes:
a. Modificar la base de datos de forma que Santos viva en Tres Cantos.
b. Dar un 10% de aumento de sueldo a todos los empleados del Banco Importante.
c. Dar un 10% de aumento de sueldo a todos los jefes de la base de datos.
d. Dar un 10% de aumento de sueldo a todos los jefes de la base de datos, a menos que su sueldo esté
por encima de 100.000 € anuales. En tal caso, darles sólo un 3%.
e. Borrar todas las tuplas de la relación trabaja para los empleados del Banco Pequeño.

Respuesta: Las soluciones suponen que cada persona sólo tiene una tupla en la relación empleado. Las
soluciones para las partes c y d suponen que cada persona trabaja, cómo máximo, para una compañía.
a. Modificar la base de datos de forma que Santos viva en Tres Cantos.

empleado nombre-persona calle ciudad


Santos Ávila

b. Incrementar en un 10% el sueldo de todos los empleados del Banco Importante.

trabaja nombre-persona nombre-compañía sueldo


Banco Importante _x
U. _x * 1.1
c. Proporciónese a todos los jefes de la base de datos un aumento salarial del 10%.

jefe nombre-persona nombre-jefe


_x

trabaja nombre-persona nombre-compañía sueldo


_x _y
U. _y * 1.1

d. Increméntese en un 10% el sueldo de todos los jefes del Banco Importante, a menos que su sueldo
pase a ser mayor de 100.000 €. En tales casos, incrementarlo sólo en un 3%. Se deben realizar dos
operaciones de actualización independientes. Cada operación de actualización tiene su propio conjunto de
tablas de estructura.
Primera actualización:

jefe nombre-persona nombre-jefe


_x

trabaja nombre-persona nombre-compañía sueldo


_x _y
U. _y * 1.03

condiciones
_y > 100000/1.1

Segunda actualización:

jefe nombre-persona nombre-jefe


_x

trabaja nombre-persona nombre-compañía sueldo


_x _y
U. _y * 1.1

condiciones
_y £ 100000/1.1

e. Borrar todas las tuplas de la relación trabaja para los empleados del Banco Pequeño.

trabaja nombre-persona nombre-compañía sueldo


D. Banco Pequeño

5.5 Sean los siguientes esquemas de relación:

R = (A, B, C)
S = (D, E, F)
Considérense las relaciones r(R) y s(S). Proporciónense expresiones en QBE y Datalog equivalentes a cada
una de las siguientes consultas:

a. PA(r)
b. s B = 17 (r)
c. r x s
d. PA,F (s C = D (r x s))

Respuesta:
a. PA(r)
i.
r A B C
P.

ii. consulta (X) :- r (X, Y, Z)

b. s B = 17 (r)
i.

r A B C
P. 17

ii. consulta (X, Y, Z) :- r (X, Y, Z), Y = 17

c. r x s
i.

resultado A B C D E F
P _a _b _c _d _e _f

r A B C
_a _b _c

s D E F
_d _e _f

ii. consulta (X, Y, Z, U, V, W) :- r (X, Y, Z), s(U, V, W)

d. PA,F (s C = D (r x s))
i.

resultado A F
P. _a _f

r A B C
_a _c

s D E F
_c _f

ii. consulta (X, Y ) :- r (X, V, W), s(W, Z, Y )

5.6 Sea R = (A, B, C) y sean r1 y r2 relaciones del esquema R. Proporcionar expresiones en QBE y
Datalog equivalentes a cada una de las siguientes consultas:

a. r1 U r2
b. r1 Ç r2
c. r1 - r2
d. PAB (r1) |x| PBC (r2)

Respuesta:
a. r1 U r2
i.
resultado A B C
P. _a _b _c
P. _d _e _f

r1 A B C
_a _b _c

r2 A B C
_d _e _f

ii.
consulta(X, Y, Z) :- r1 (X, Y, Z)
consulta(X, Y, Z) :- r2 (X, Y, Z)

b. r1 Ç r2
i.

r1 A B C
P. _a _b _c

r2 A B C
_a _b _c

ii. consulta(X, Y, Z) :- r1 (X, Y, Z), r2 (X, Y, Z)

c. r1 - r2
i.

r1 A B C
P. _a _b _c

r2 A B C
¬ _a _b _c

ii. consulta(X, Y, Z) :- r1 (X, Y, Z), no r2 (X, Y, Z)


d. PAB (r1) |x| PBC (r2)
i.
resultado A B C
P. _a _b _c

r1 A B C
_a _b

r2 A B C
_b _c

ii. consulta(X, Y, Z) :- r1 (X, Y, V), r2 (W, Y, Z)

5.7 Sean R = (A, B) y S = (A ,C) y sean las relaciones r(R) y s(S). Escríbanse expresiones en QBE y
Datalog para cada una de las consultas siguientes:

a. {<a> | $ b (<a, b> Î r Ù b = 17)}


b. {<a, b, c> | <a, b> Î r Ù <a, c> Î s}
c. {<a> | $ c (<a, c> Î s Ù $ b1 , b2 (<a, b1> Î r Ù <c, b2> Î r Ù b1 >b2 ))}

Respuesta:
a. {<a> | $ b (<a, b> Î r Ù b = 17)}
i.
r A B
P. 17

ii. consulta (X) :- r (X, 17)

b. {<a, b, c> | <a, b> Î r Ù <a, c> Î s}


i.
r A B
_a _b

s A C
_a _c

result A B C
P. _a _b _c

ii. consulta(X, Y, Z) :- r(X, Y), s(X, Z)

c. {<a> | $ c (<a, c> Î s Ù $ b1 , b2 (<a, b1> Î r Ù <c, b2> Î r Ù b1 >b2 ))}


i.

r A B
_a >_s
_c _s

s A C
P._a _c

ii. consulta (X) :- s (X, Y ), r (X, Z), r (Y, W), Z > W


5.8 Considérese la base de datos relacional de la Figura 5.12. Escríbase un programa Datalog para cada
una de las siguientes consultas:
a. Buscar todos los empleados que trabajan (directa o indirectamente) bajo la dirección de “Santos”.
b. Buscar las ciudades de residencia de todos los empleados que trabajan (directa o indirectamente)
bajo la dirección de “Santos”.
c. Buscar todas las parejas de empleados que tienen (directa o indirectamente) un jefe en común.
d. Buscar todas las parejas de empleados que tienen (directa o indirectamente) un jefe en común y que
estan al mismo número de niveles bajo el jefe.

Respuesta:
a. Buscar todos los empleados que trabajan (directa o indirectamente) bajo la dirección de “Santos”.
consulta (X) :- p (X)
p (X) :- jefe (X, “Santos”)
p (X) :- jefe (X, Y ), p(Y )

b. Buscar todas las ciudades de residencia de todos los empleados que trabajan (directa o
indirectamente) bajo la dirección de “Santos”.
consulta(X, C) :- p(X), empleado(X, S, C)
p(X) :- jefe(X, “Santos”)
p(X) :- jefe(X, Y), p(Y)

c. Buscar todas las parejas de empleados que tengan (directa o indirectamente) un jefe en común.
consulta(X, Y) :- p(X, W), p(Y, W)
p(X, Y) :- jefe(X, Y)
p(X, Y) :-jefe(X, Z), p(Z, Y)

d. Buscar todas las parejas de empleados que tengan (directa o indirectamente) un jefe en común y que
esten al mismo número de niveles de supervisión bajo el jefe en común.
consulta(X, Y) :- p(X, Y)
p(X, Y) :- jefe(X, Z), jefe(Y, Z)
p(X, Y) :- jefe(X, V), jefe(Y, W), p(V, W)

5.9 Escríbase una vista del álgebra relacional extendida equivalente a la regla Datalog
p(A,C,D) :– q1 (A,B), q2 (B,C), q3 (4,B), D = B + 1 .

Respuesta: Asúmase que q1, q2 y q3 son are ejemplares del esquema (A1, A2).La vista del álgebra relacional
es

create view P as
Õq1.A1,q2.A2,q1.A2+1(sq3.A1=4 Ù q1.A2=q2.A1 Ù q1.A2=q3.A2(q1 × q2 × q3))

5.10 Descríbase cómo una regla de Datalog arbitraria puede expresarse como una vista del álgebra
relacional extendida.

Respuesta: Una regla de Datalog tiene dos partes, la cabeza y el cuerpo. El cuerpo es una lista de
literales separados por comas. Un literal positivo tiene la forma p(t1, t2, . . . , tn ), done p es el nombre de una
relación con n atributos y t1, t2, . . . , tn son constantes o variables. Un literal negativo tiene la forma ¬p(t1, t2, .
. . , tn), donde p tiene n atributos. En el caso de literales aritméticos, p será un operador aritmético como >, =
etc.
Se consideran sólo reglas seguras; consultar el Apartado 5.2.4 para las definiciones de seguridad de
las reglas de Datalog. Además, se asume que cada variable que aparece en un literal aritmético también lo
hace en un literal no aritmético positivo.
Considérese primero una regla sin ningún literal negativo. Para expresar la regla como una vista del
álgebra relacional extendida, se escribe como una reunión de todas las relaciones referidas en los literales no
aritméticos (positivos) del cuerpo, seguidos por una selección. La condición de selección es una conjunción
que se obtiene como sigue. Si p1 (X, Y ), p2 (Y, Z) tienen lugar en el cuerpo, donde p1 es del esquema (A, B) y
p2 del (C, D), entonces p1.B = p2.C debería pertenecer a la conjunción. Los literales aritméticos pueden
entonces añadirse a la condición.
A modo de ejemplo, la consulta Datalog

consulta(X, Y) :- trabaja(X, C, S1), trabaja(Y, C, S2), S1 > S2, jefe(X, Y)

se convierte en la siguiente expresión de álgebra relacional:

E1 = s(w1.nombre-compañía = w2.nombre-compañía Ù w1.sueldo > w2.sueldo Ù


jefe.nombre-persona = w1.nombre-persona Ù jefe.nombre-jefe=w2.nombre-persona)
( rw1(trabaja) × rw2(trabaja) × jefe)

Supóngase que la regla dada ahora tiene literales negativos. Primero supóngase que no hay constantes en los
literales negativos; recuérdese que todas las variables de un literal negativo deben, también, aparecer en un
literal positivo. Sea ¬q(X, Y ) el primer literal negativo del esquema (E, F). Sea Ei la expresión del álgebra
relacional obtenida después de que se hayan tratado todos los literales, positivos y negativos. Para tratar este
literal negativo se genera la expresión

Ej = Ei |x| (ÕA1,A2(Ei) - q)

donde A1 y A2 son los nombres de atributo de dos columnas en Ei que se corresponden, respectivamente, a X e
Y.
Considérense ahora que aparecen constantes en un literal negativo. Supóngase un literal negativo de
la forma ¬q(a, b, Y ), donde a y b son constantes. Entonces, en la expresión anterior que define Ej ,se
reemplaza q por sA1=a Ù A2=b(q).
Procediendo de una misma manera, se procesan los literales negativos restantes, resultando
finalmente en una expresión Ew.
Finalmente, los atributos deseados se proyectan de la expresión. Los atributos en Ew,
correspondientes a las variables en la cabeza de la regla, se convierten en los atributos de la proyección.
Así, finalmente, la regla de ejemplo se convierte en la vista:

create view consulta as


Õw1.nombre-persona,w2.nombre-persona (E2)

Si hay reglas múltiples para el mismo predicado, la expresión del álgebra relacional que define la vista es la
unión de las correspondientes expresiones a las reglas individuales.
La conversión anterior se puede ampliar para manejar reglas que cumplan algunas formas más
débiles de las condiciones de seguridad y, en algunos casos limitados, donde la variables en predicados
aritméticos no aparezcan en un literal no aritmético positivo.
CAPITULO 6

INTEGRIDAD Y SEGURIDAD

Este capítulo presenta varios tipos de restricciones de integridad, incluyendo restricciones de los dominios,
restricciones de integridad referencial, asertos y disparadores, así como seguridad y autorización. Las
restricciones de integridad referencial y las restricciones de los dominios, son un importante aspecto de las
especificaciones del diseño de una base de datos relacional. Los asertos están viendo incrementar su empleo.
Los disparadores se usan ampliamente, aunque cada base de datos soporta su propia sintaxis y semántica para
disparadores; los disparadores estaban estandarizados como parte de SQL:1999 y es de esperar que las bases
de datos faciliten soporte para disparadores SQL:1999.
Las dependencias funcionales ahora se muestran como parte de la normalización, en vez de como
parte del capítulo de las restricciones de integridad, tal y como se hacía en la tercera edición. La razón del
cambio es que se emplean casi exclusivamente en el diseño de bases de datos y ningún sistema de base de
datos, que se sepa, soporta dependencias funcionales como las restricciones de integridad. Tratándolos en el
contexto de la normalización, se ayuda a motivar a los estudiantes a dedicar esfuerzo para comprender la
problemática del razonamiento con dependencias funcionales.
La seguridad es el principal asunto por sí mismo. Dado que cualquier sistema es solamente tan
seguro como lo es su componente más débil, un diseñador de sistemas debe considerar todos los aspectos de
seguridad. Este capítulo se centra sólo en los aspectos de seguridad que son específicos de las bases de datos.
En un curso posterior, esta materia se puede completar con la discusión de cuestiones de seguridad en los
sistemas operativos y en los sistemas distribuidos.

Cambios a la tercera edición:

El tratamiento de los disparadores está ahora basado en el estándar SQL:1999. En el momento de la


publicación de la tercera edición los disparadores no estaban estandarizados. La noción de funciones para la
autorización se ha introducido en esta edición, ahora que es parte del estándar SQL:1999. El tratamiento de la
encriptación ha sido actualizado para cubrir los desarrollos recientes.
Ejercicios

6.1 Complétese la definición del LDD de SQL de la base de datos de la Figura 6.2, para incluir las
relaciones préstamo y prestatario.

Respuesta:
create table préstamo
(número-préstamo char(10),
nombre-sucursal char(15),
importe integer,
primary key (número-préstamo),
foreign key (nombre-sucursal) references sucursal)

create table prestatario


(nombre-cliente char(20),
número-préstamo char(10),
primary key (nombre-cliente, número-préstamo),
foreign key (nombre-cliente) references cliente,
foreign key (número-préstamo) references préstamo)

Declarar como clave primaria de la relación prestatario a la pareja nombre-cliente, número-préstamo, asegura
que la relación no contenga duplicados.

6.2 Considérese la siguiente base de datos relacional:

empleado (nombre-empleado, calle, ciudad)


trabaja (nombre-empleado, nombre-compañía, sueldo)
compañía (nombre-compañía, ciudad)
jefe (nombre-empleado, nombre-jefe)

Se da una definición en el LDD de SQL de esta base de datos. Identifíquense las restricciones de integridad
referencial que deben cumplirse, e inclúyanse en la definición del LDD.

Respuesta:
create table empleado
(nombre-persona char(20),
calle char(30),
ciudad char(30),
primary key (nombre-persona))

create table trabaja


(nombre-persona char(20),
nombre-compañía char(15),
sueldo integer,
primary key (nombre-persona),
foreign key (nombre-persona) references empleado,
foreign key (nombre-compañía) references compañía)

create table compañía


(nombre-compañía char(15),
ciudad char(30),
primary key (nombre-compañía))

create table jefe


(nombre-persona char(20),
nombre-jefe char(20),
primary key (nombre-persona),
foreign key (nombre-persona) references empleado,
foreign key (nombre-jefe) references empleado)

Nótese que son posibles tipos de datos alternativos. Se pueden aceptar otras elecciones para los atributos not
null.

6.3 Las restricciones de integridad referencial, tal y como se han definido en este capítulo, implican
exactamente dos relaciones. Considérese una base de datos que incluya las siguientes relaciones:

trabajador-fijo (nombre, despacho, teléfono, sueldo)


trabajador-tiempo-parcial (nombre, sueldo-por-hora)
dirección (nombre, calle, ciudad)

Supóngase que se desea exigir que cada nombre que aparece en dirección, aparezca en trabajador-fijo o en
trabajador-tiempo-parcial, pero no necesariamente en ambos.
a. Propóngase una sintaxis para expresar esta restricción.
b. Discútanse las acciones que el sistema debe realizar para aplicar una restricción de este tipo.

Respuesta:
a. Por sencillez, se presenta una variante de la sintaxis del SQL. Como parte de la expresión create
table para dirección, se incluye

foreign key (nombre) references trabajador-fijo o trabajador-tiempo-parcial

b. Para reforzar esta ligadura, siempre que una tupla se inserte en la relación dirección, se debe hacer
una búsqueda sobre el valor nombre en la relación trabajador-fijo y (si falla la búsqueda) en la relación
trabajador-tiempo-parcial (o viceversa).

6.4 SQL permite la dependencia de una clave externa para referirse a la misma relación, como en el
ejemplo siguiente:
create table jefe
(nombre-empleado char(20) not null,
nombre-jefe char(20),
primary key nonbre-empleado,
foreign key (nombre-jefe) references jefe
on delete cascade )

Aquí, nombre-empleado es una clave para la tabla jefe, lo que significa que cada empleado tiene como
máximo un jefe. La orden de clave externa requiere que cada jefe también sea un empleado. Explíquese qué
sucede exactamente cuando se borra una tupla de la relación jefe.

Respuesta: Las tuplas de todos los empleados del jefe, a todos los niveles, también se borran. Esto sucede en
una serie de pasos. El borrado inicial disparará el de todas las tuplas correspondientes a los empleados
directos del jefe. Estos borrados originarán los borrados de las tuplas de los empleados del segundo nivel, y
así sucesivamente, hasta sean borradas, directa o indirectamente, todas las tuplas de empleados.

6.5 Supóngase que hay dos relaciones r y s, tales que la clave externa B de r hace referencia a la clave
primaria A de s. Descríbase la manera en que puede utilizarse el mecanismo de los disparadores para
implementar la opción on delete cascade, cuando se borra una tupla de s.
Respuesta: Se definen disparadores para cada relación cuya clave primaria está referida por la clave externa
de alguna otra relación. El disparador se activaría siempre que una tupla se borre de la relación referenciada.
La acción realizada por el disparador consistiría en recorrerse todas las relaciones referenciadas y borrar todas
las tuplas en aquellas cuyo valor del atributo clave externa sea el mismo que el del atributo clave primaria, de
la tupla borrada en la relación de referencia. Estos conjuntos de disparadores se ocuparán de la operación on
delete cascade.

6.6 Escríbase un aserto para la base de datos bancaria, que asegure que el valor del activo de la sucursal
de Navacerrada sea igual a la suma de todos los importes prestados por esa sucursal.

Respuesta: El nombre del aserto es arbitrario. Se ha elegido el nombre Navacerrada. Nótese que al aplicar el
aserto sólo a la sucursal de Navacerrada, se debe restringir la atención sólo a las tuplas de Navacerrada en la
relación sucursal, en vez de escribir una restricción sobre la relación entera.
create assertion Navacerrada check
(not exists (select *
from sucursal
where nombre-sucursal = ’Navacerrada’ and
activo ¹ (select sum (importe)
from préstamo
where nombre-sucursal = ’Navacerrada’)))

6.7 Escríbase una disparador SQL que lleve a cabo la siguiente acción: Al borrar una cuenta, para cada
propietario de la cuenta, compruébese si tiene algunas otras cuentas y, si no es así, bórresele de la relación
impositor.

Respuesta:
create trigger disparador-comprobación-borrado after delete on cuenta
referencing old row as fila-antigua
for each row
delete from impositor
where impositor.nombre-cliente not in
( select nombre-cliente from impositor
where número-cuenta<> fila-antigua.número-cuenta )
end

6.8 Considérese la vista sucursal-cliente definida como sigue:

create view sucursal-cliente as


select nombre-sucursal, nombre-cliente
from impositor, cuenta
where impositor.número-cuenta = cuenta.número-cuenta

Supóngase que la vista esta materializada, es decir, la vista se calcula y se almacena.


Escríbanse reglas activas para el mantenimiento de la vista, es decir, para mantenerla actualizada según las
inserciones y borrados de impositor o cuenta. No preocuparse de las actualizaciones.

Respuesta: Para insertar en la vista materializada sucursal-cliente, se debe definir un disparador de base de
datos sobre las inserciones en impositor y cuenta. Se asume que el sistema de base de datos hace uso de una
vinculación inmediata para la ejecución de las reglas. Además, se supone que la versión actual de una relación
se denota por el propio nombre de la relación, mientras que el conjunto de tuplas recién insertadas se denota
calificando el nombre de la relación con el prefijo – insertado.
Las reglas activas para esta inserción se dan a continuación
define trigger insertar en sucursal-cliente vía impositor
after insert on impositor
referencing new table as insertado for each statement
insert into sucursal-cliente
select nombre-sucursal, nombre-cliente
from insertado,cuenta
where insertado.número-cuenta = cuenta.número-cuenta

define trigger insertar en sucursal-cliente vía cuenta


after insert on cuenta
referencing new table as insertado for each statement
insert into sucursal-cliente
select nombre-sucursal, nombre-cliente
from impositor, inserted
where impositor.número-cuenta = insertado.número-cuenta

Nótese que si la vinculación de la ejecución fuese diferida (en vez de inmediata), entonces el
resultado de la reunión del conjunto de las nuevas tuplas de cuenta con el de las nuevas tuplas de impositor,
habría sido insertado por ambas reglas activas, duplicando las correspondientes tuplas en sucursal-cliente.
El borrado de una tupla desde sucursal-cliente es similar a la inserción, excepto en que un borrado
desde impositor o cuenta implicará la unión natural de estas relaciones para tener un menor número de tuplas.
Se denota el conjunto de tuplas recién borradas calificando el nombre de la relación con la palabra clave
borrado.

define trigger borrar desde sucursal-cliente vía impositor


after delete on impositor
referencing old table as borrado for each statement
delete from sucursal-cliente
select nombre-sucursal, nombre-cliente
from borrado,cuenta
where borrado.número-cuenta = cuenta.número-cuenta

define trigger borrar desde sucursal-cliente vía cuenta


after delete on cuenta
referencing old table as borrado for each statement
delete from sucursal-cliente
select nombre-sucursal, nombre-cliente
from impositor, borrado
where impositor.número-cuenta = borrado.número-cuenta

6.9 Confecciónese una lista de los problemas de seguridad de un banco. De cada elemento de la lista,
especifíquese si afecta a la seguridad física, a la personal, a la del sistema operativo o a la de las bases de
datos.

Respuesta: Considérese el problema de proteger la base de datos del banco.


Algunas medidas de seguridad, a cada uno de los cuatro niveles, se mencionan seguidamente
a. Nivel físico – El sistema desde el que se puede acceder y modificar a las relaciones, debería situarse
en una habitación cerrada, bien guardada e inexpugnable.
b. Nivel humano – Una apropiada política de transferencia de llaves debería reforzarse, para restringir
el acceso a las “dependencias del sistema” anteriormente mencionadas. Las contraseñas para poder acceder a
la base de datos deberían ser conocidas sólo por los usuarios de confianza.
c. Nivel de sistema operativo – Las contraseñas deberían ser difíciles de imaginar y modificarse
regularmente. Ningún usuario debería ser capaz de obtener accesos no autorizados al sistema, debido un fallo
del software en el sistema operativo.
d. Nivel de sistema de base de datos . Los usuarios deberían estar autorizados a acceder sólo a las
partes pertinentes de la base de datos. Por ejemplo, debería permitirse al cajero de un banco modificar los
valores del saldo de los clientes, pero no el de su propio sueldo.

6.10 Utilizando las relaciones de la base de datos bancaria de ejemplo, escríbase una expresión SQL para
definir las siguientes vistas:
a. Una vista que contenga los números de cuenta y los nombres de los clientes (pero no los saldos) de
todas las cuentas de la sucursal de El Escorial.
b. Una vista que contenga el nombre y la dirección de todos los clientes que tengan cuenta en el banco,
pero no tengan ningún préstamo.
c. Una vista que contenga el nombre y el saldo medio de la cuenta de cada cliente de la sucursal de
Collado Villalba.

Respuesta:
a.
create view El-Escorial as
select número-cuenta, nombre-cliente
from impositor, cuenta
where nombre-sucursal = ’El Escorial’ and
impositor.número-cuenta = cuenta.número-cuenta
b.
create view sin-deudas as
select * from cliente
where nombre-cliente in
(select nombre-cliente
from impositor)
minus
(select nombre-cliente
from prestatario)
c.
create view saldo-medio as
select nombre-cliente, avg(saldo)
from impositor, cuenta
where impositor.número-cuenta = cuenta.número-cuenta
y nombre-sucursal = ’Collado Villalba’
group by nombre-cliente

6.11 Para cada una de las vistas definidas en el Ejercicio 6.10, explíquese la manera en que deben
realizarse las actualizaciones (si es que se deben permitir). Sugerencia: Consultar la discusión de las vistas del
Capítulo 3.

Respuesta: Para insertar (número-cuenta, nombre) en la vista El-Escorial , se inserta la tupla ( El Escorial,
número-cuenta, nulo) en la relación cuenta y la tupla (nombre, número-cuenta) en la relación impositor.
Actualizar las vistas sin-deudas y saldo-medio presenta serios problemas. Si se inserta en la vista sin-deudas,
el sistema debe reflejar la inserción si el cliente tiene un préstamo. El coste de la actualización a través de esta
vista es tan alto, que la mayoría de los sistemas lo rechazarían. La vista saldo-medio no puede actualizarse,
dado que el resultado de una operación de agregación depende de varias tuplas, no sólo de una.

6.12 En el Capítulo 3 se describió el uso de las vistas para facilitar el acceso a la base de datos de los
usuarios que sólo necesiten ver una parte de la misma. En este capítulo se ha descrito el uso de las vistas
como mecanismo de seguridad. ¿Pueden entrar en conflicto estas dos finalidades de las vistas? Explíquese la
respuesta.

Respuesta: Generalmente un mecanismo de seguridad y vistas bien diseñado, puede evitar conflictos entre la
facilidad de los accesos y la seguridad. Sin embargo, como se muestra en los ejemplos siguientes, los dos
propósitos entran en conflicto si los mecanismos no se han diseñado cuidadosamente.
Supóngase que se tiene una base de datos de empleados y un usuario cuya vista implica los datos de
empleados que ganan menos de 10.000€. Si este usuario inserta al empleado Santos, cuyo sueldo es 9.000 €,
pero accidentalmente teclea 90.000€, diversos sistemas de bases de datos existentes aceptarán esta
actualización como válida, a través de una vista. Sin embargo, el mecanismo de seguridad impedirá que el
usuario acceda a borrar esta tupla errónea.

6.13 ¿Cuál es la finalidad de tener categorías diferentes para la autorización de índices y para la de
recursos?

Respuesta: Las autorizaciones de índices y recursos deberían ser categorías especiales que permitan a
determinados usuarios crear relaciones (y los índices para operar sobre ellas), al impedir que estas
operaciones, lentas y que modifican el esquema, estén disponibles para muchos usuarios. Separar las
autorizaciones de índices y recursos permite a un usuario construir un índice sobre relaciones existentes, por
ejemplo por razones de optimización, pero denegarle el derecho a crear nuevas relaciones.

6.14 Los sistemas de bases de datos que guardan cada relación en un archivo diferente del sistema
operativo pueden utilizar los esquemas de seguridad y de autorización del sistema operativo, en lugar de
definir un esquema especial propio. Discútanse las ventajas e inconvenientes de ese enfoque.

Respuesta: Los sistemas de bases de datos tienen requerimientos especiales que son típicamente más
refinados que la mayoría de los sistemas operativos. Por ejemplo, un usuario sencillo puede tener diferentes
privilegios sobre diferentes ficheros en todo el sistema, incluyendo modificaciones de índices y atributos que,
generalmente, los sistemas de ficheros no controlan. La ventaja de emplear los mecanismos de seguridad de
los sistemas operativos es que simplifican los sistemas de bases de datos, y se pueden usar para simples
(leer/escribir) medidas de seguridad.

6.15 ¿Cuáles son las dos ventajas de cifrar los datos guardados en una base de datos?

Respuesta:
a. Los datos cifrados permiten que usuarios autorizados accedan a los datos, sin preocuparse que otros
usuarios o el administrador del sistema consigan cualquier información.
b. La encriptación de los datos puede simplificar o incluso fortalecer otros mecanismos de
autorización. Por ejemplo, la distribución de las claves criptográficas sólo entre usuarios de confianza es,
tanto una manera sencilla de controlar los accesos de lectura, como una capa adicional de seguridad sobre la
que ofrecen las vistas.

6.16 Quizás los elementos de datos más importantes de cualquier sistema de bases de datos sean las
contraseñas que controlan el acceso a la base de datos. Propóngase un esquema para guardar de manera
segura las contraseñas. Asegúrese de que el esquema permita al sistema comprobar las contraseñas
proporcionadas por los usuarios que intenten iniciar una sesión en el mismo.

Respuesta: Una manera de almacenar contraseñas sería cifrarlas y, posteriormente, usar un índice asociativo
sobre el identificativo de usuario. El identificativo de usuario se puede emplear para acceder fácilmente a la
contraseña cifrada. La contraseña empleada en un intento de conexión se cifra y compara con la encriptación
de la contraseña correcta almacenada. Una ventaja de este plan es que las contraseñas no se almacenan en
texto transparente y que, incluso, no es necesario que exista código para el descifrado.
CAPITULO 7

DISEÑO DE BASES DE DATOS RELACIONALES

Este capítulo presenta los principios del diseño de bases de datos relacionales. Los estudiantes universitarios
frecuentemente encuentran difícil este capítulo. Es aceptable cubrir solamente los Apartados 7.1, 7.2 y 7.4,
para aquellas clases que encuentren la materia particularmente difícil. Sin embargo, un cuidadoso estudio de
las dependencias y normalizaciones de los datos, es una buena manera de introducir a los estudiantes a los
aspectos formales de la teoría de bases de datos relacionales.
Hay muchas maneras de hacer constar las definiciones de las formas normales. Se ha elegido un
estilo que, pensamos, es el más fácil de presentar y el que más claramente transmite la intuición de las formas
normales.

Cambios a la tercera edición:

Hay muchos cambios a este capítulo desde la tercera edición. La 1FN se define ahora formalmente. Las
dependencias funcionales se tratan en este capítulo, en lugar de hacerlo en el Capítulo 6. La razón es que la
normalización aporta la motivación real para las dependencias funcionales, dado que se emplean sobre todo
para la normalización.
Se ha descrito un procedimiento simplificado para la inferencia de la dependencia funcional, basado en el
cierre de atributos y se aportan procedimientos simplificados para la comprobación de las formas normales.
La cobertura de la teoría de las dependencias multi valoradas y las formas normales más allá de la 4FN (es
decir, PJNF y DKNF) ha sido trasladada al Apéndice C (el cuál está disponible en la Web, no en el libro
impreso).
El proceso de diseño de esquemas relacionales se ha descrito significativamente con mayor detalle, además de
algunos problemas de diseño que no se perciben mediante los procesos de normalización usuales.
Ejercicios

7.1 Explíquese qué se entiende por repetición de la información e imposibilidad de representación de la


información. Explíquese el motivo por el que estas propiedades pueden indicar un mal diseño de bases de
datos relacionales.

Respuesta:
• Repetición de información es una condición en una base de datos relacional, donde los valores de un
atributo se determinan por los valores de otro en la misma relación y, ambos valores, se repiten a través de la
relación.
Esto es un mal diseño de base de datos relacional, porque incrementa el almacenamiento necesario para la
relación y hace más difícil la actualización de la relación.

• Incapacidad para representar información es una condición donde una relación entre sólo un subconjunto
propio de los atributos en una relación. Esto es mal diseño de base de datos relacional porque todos los
atributos sin relación deben rellenarse con valores nulos, de lo contrario una tupla sin información de relación
no se puede insertar en la relación.

• Pérdida de información es una condición de una base de datos relacional, que resulta de la descomposición
de una relación en dos, que no se pueden combinar para recrear la relación original. Es un mal diseño de base
de datos relacional porque ciertas consultas que no se pueden responder empleando la relación reconstruida,
podrían haber sido contestadas empleando la relación original.

7.2 Supóngase que se descompone el esquema R = (A, B, C, D, E) en

(A, B, C)
(A, D, E).

Demuéstrese que esta descomposición es una descomposición de reunión sin pérdida, si se cumple el
siguiente conjunto F de dependencias funcionales:
A g BC
CD g E
BgD
EgA

Respuesta: Una descomposición {R1, R2} es una descomposición de reunión sin pérdida si R1 Ç R2 ® R1 o R1
Ç R2 ® R2. Sea R1 = (A, B, C), R2 = (A, D, E) y R1 Ç R2 = A. Dado que A es una clave candidata (véase el
Ejercicio 7.11), por lo tanto R1 Ç R2 ® R1.

7.3 Indíquese el motivo de que ciertas dependencias funcionales se denominen dependencias funcionales
triviales.

Respuesta: Ciertas dependencias funcionales se denominan triviales porque son cumplidas por todas las
relaciones.

7.4 Indíquense todas las dependencias funcionales que satisface la relación de la Figura 7.21.

Respuesta: Las dependencias funcionales no triviales son: A ® B y C ® B y una dependencia lógica


implícita: AC ® B . Hay 19 dependencias funcionales triviales de la forma a ® b, donde b Í a. C no
determina funcionalmente a A, porque las tuplas primera y tercera tienen valores iguales de C pero diferentes
de A. La mismas tuplas también muestran que B no determina funcionalmente a A. Igualmente, A no
determina funcionalmente a C, porque las primeras dos tuplas tienen valores iguales de A pero diferentes de
C. La mismas tuplas también muestran que B no determina funcionalmente a C.

7.5 Utilícese la definición de dependencia funcional para argumentar que cada uno de los axiomas de
Armstrong (reflexividad, aumentatividad y transitividad) es válido.

Respuesta: La definición de dependencia funcional es: a ® b contiene sobre R si en cualquier relación legal
r(R), para todos los pares de tuplas t1 y t2 en r tales que t1[a] = t2[a], es también el caso que t1[b] = t2[b].
Regla de la reflexividad: si a es un conjunto de atributos y b Í a, entonces a ® b.
Asúmase que $ t1 y t2 tales que t1[a] = t2[a]

t1[b] = t2[b] dado que b Í a


a ® b definición de FD

Regla de la aumentatividad: si a ® b y g es un conjunto de atributos, entonces ga ® gb.


Asúmase que $ t1 y t2 tales que t1[ga] = t2[ga]

t1[g] = t2[g] g Í ga
t1[a] = t2[a] a Í ga
t1[b] = t2[b] definición de a ® b
t1[gb] = t2[gb] gb = g È b
ga ® gbdefinición de FD

Regla de la transitividad: si a ® b y b ® g, entonces a ® g.


Asúmase que $ t1 y t2 tales que t1[a] = t2[a]

t1[b] = t2[b] definición de a ® b


t1[g] = t2[g] definición de b ® g
a®g definición de FD

7.6 Explíquese el modo en que las dependencias funcionales pueden utilizarse para indicar lo siguiente:
• Existe un conjunto de relaciones de uno a uno entre los conjuntos de entidades cuenta y cliente.
• Existe un conjunto de relaciones varios a uno entre los conjuntos de entidades cuenta y cliente.

Figura 7.21. Relación del Ejercicio 7.4.

Respuesta: Supongamos que Pk(r) denota el atributo clave primaria de la relación r.


• Las dependencias funcionales Pk(cuenta)®Pk (cliente) y Pk(cliente) ® Pk(cuenta) indican una relación de
uno a uno porque dos tuplas cualesquiera con el mismo valor de cuenta, deben tener el mismo valor de cliente
y dos tuplas cualesquiera de acuerdo en cliente, deben tener el mismo valor de cuenta.

• La dependencia funcional Pk(cuenta)®Pk (cliente) indica una relación de muchos a uno, dado que cualquier
valor de cuenta que se repita tendrá el mismo valor de cliente, pero muchos valores de cuenta pueden tener el
mismo valor de cliente.
7.7 Considérese la siguiente regla propuesta para las dependencias funcionales: Si a ® b y g ® b
entonces a ® g. Pruébese que esta regla no es segura mostrando una relación r que satisfaga a ® b y g ® b,
pero no cumpla a ® g.

Respuesta: Considérese la siguiente regla: si A ® B y C ® B, entonces A ® C. Así, a = A, b = B, g = C. La


siguiente relación r es un contra ejemplo para la regla.

r: A B C
a1 b1 c1
a1 b1 c2

Nota: A ® B y C ® B, (dado que ninguna de las 2 tuplas tiene el mismo valor de C, C ® B es una
trivialidad). Sin embargo, no es el caso que A ® C dado que el mismo valor de A está en dos tuplas, pero el
valor de C en esas tuplas difiere.

7.8 Utilícense los axiomas de Armstrong para probar la seguridad de la regla de la unión. (Sugerencia:
utilícese la regla de la aumentatividad para probar que, si a ® b, entonces a ® ab.Aplíquese nuevamente la
regla de la aumentatividad, empleando a ® g, y luego aplíquese la regla de la transitividad).

Respuesta: Para probar que:

i a ® b y a ® g, entonces a ® bg.

Siguiendo la sugerencia, se deduce:


a®b dado
aa ® ab regla de la aumentatividad:
a ® ab unión de conjuntos idénticos
a®g dado
ab ® g b regla de la aumentatividad:
a ® bg regla de la transitividad y conmutatividad de la unión de conjuntos

7.9 Utilícense los axiomas de Armstrong para probar que la regla de la descomposición es correcta.

Respuesta: La regla de la descomposición y sus derivaciones desde los axiomas de Armstrong se presentan a
continuación:

si a ® bg, entonces a ® b y a ® g

a ® bg dado
bg ® b regla de la reflexividad
a®b regla de la transitividad
bg ® g regla reflexiva
a®g regla transitiva

7.10 Utilícense los axiomas de Armstrong para probar que la regla de la pseudotransitividad es correcta.
Respuesta: Prueba utilizando los axiomas de Armstrong de la regla de la pseudotransitividad:

si a ® b y gb ® d, entonces ag ® d.

a®b dado
ag ® g b regla de la aumentatividad y conmutatividad de la unión de conjuntos
g b ® d dado
ag ® d regla de la transitividad

7.11 Calcúlese el cierre del siguiente conjunto de dependencias funcionales F, para el esquema de la
relación R=(A, B, C, D, E).

A ® BC
CD ® E
B®D
E®A

Indíquese las claves candidatas de R.

Respuesta: Cálculo del cierre del siguiente conjunto de dependencias funcionales F para el esquema de la
relación R = (A, B, C, D, E).
A ® BC
CD ® E
B®D
E®A

Listado de las claves candidatas de R.

Nota: No es razonable esperar que los estudiantes enumeren todo de F+. Alguna representación abreviada del
resultado sería aceptable, mientras que se encuentran los miembros no triviales de F+.

Comenzando con A ® BC, se concluye: A ® B y A ® C.

Dado que A ® B y B ® D, A ® D (descomposición, transitiva)


Dado que A ® CD y CD ® E, A ® E (unión, descomposición, transitiva)
Dado que A ® A, se tiene (reflexiva)
A ® ABCDE desde los pasos anteriores (unión)
Dado que E ® A, E ® ABCDE (transitiva)
Dado que CD ® E, CD ® ABCDE (transitiva)
Dado que B ® D y BC ® CD, BC ® ABCDE (aumentativa, transitiva)
También, C ® C, D ® D, BD ® D, etc.

Por lo tanto, cualquier dependencia funcional con A, E, BC, o CD en el lado izquierdo de la flecha está en F+,
no importa qué otros atributos aparecen en el FD.
Permítase * para representar cualquier conjunto de atributos en R, entonces F+ es BD ® B, BD ® D, C ® C,
D ® D, BD ® BD, B ® D, B ® B, B ® BD, y todos los FDs de la forma A* ® a, BC * ® a, CD * ® a, E*
® a donde a es cualquier subconjunto de {A, B, C, D, E}. Las claves candidatas son A, BC, CD y E.

7.12 Utilizando las dependencias funcionales del Ejercicio 7.11, calcúlese B+.

Respuesta: Calculando B+ por medio del algoritmo de la Figura 7.7, se empieza con resultado = {B}.
Considerando FDs de la forma b ® g en F, se encuentra que solamente dependencias que satisfacen b Í
resultado son B ® B y B ® D. Por lo tanto resultado = {B, D}. Ninguna dependencia más en F aplica ahora.
Por eso B+ = {B, D}

7.13 Utilizando las dependencias funcionales del Ejercicio 7.11, calcúlese el recubrimiento canónico Fc.

Respuesta: El conjunto dado de FDs F es:

A ® BC
CD ® E
B ®D
E ®A

El lado izquierdo de cada FD en F es único. Ninguno de los atributos en el lado izquierdo o derecho de
cualquiera de los FDs es ajeno. Por lo tanto, el recubrimiento canónico Fc es igual a F.

7.14 Considérese el algoritmo de la Figura 7.22 para calcular a+. Pruébese que este algoritmo es más
eficiente que el mostrado en la Figura 7.7 (Apartado 7.3.3) y que calcula a+ correctamente.

Respuesta: El algoritmo es correcto porque:


• Si se añade A a resultado hay una prueba que a ® A. Para ver esto obsérvese que trivialmente a ® a, por
lo que a es parte correcta de resultado. If A Ï a se añade a resultado, debe haber algún FD b ® g tal que A Î
g y b sea todavía un subconjunto de resultado. (De lo contrario fdcount sería distinto de cero y la condición if
sería falsa.) Una prueba completa puede venir dada mediante la inducción sobre la profundidad de la
recursividad, para una ejecución de addin, pero tal prueba sólo se puede esperar de estudiantes con buenos
conocimientos de matemáticas.

• Si A Î a+, entonces se añade eventualmente A a resultado. Esto se verifica por inducción sobre la longitud
de la prueba de a ® A empleando los axiomas de Armstrong. Primero obsérvese que si el procedimiento
addin es llamado con algún argumento b, todos los atributos en b se añadirán a resultado. También si un
determinado fdcount de FD está a 0, todos los atributos en su cola se añadirán definitivamente a resultado. El
caso de la base de la prueba, A Î a Þ A Î a+, es obviamente cierto porque la primera llamada a addin tiene
el argumento a. La hipótesis inductiva es que, si a ® A se puede probar en n pasos o menos, entonces A Î
resultado. Si hay una prueba en n + 1 pasos que a ® A, entonces el último paso era una aplicación de
reflexividad, aumentatividad o transitividad sobre un hecho a ® b probado en n o menos pasos.
resultado := Ø;
/* fdcount es un array cuyo i enésimo elemento contiene el número de atributos en la parte izquierda del i
enésimo FD, que no se conocen aún para estar en a+ */
for i := 1 a |F| do
begin
supóngase que b ® g denota el i enésimo FD;
fdcount [i] :=|b|;
end
/* aparece es un array con una entrada por cada atributo. La entrada por atributo A es una lista de enteros.
Cada entero i de la lista indica que A aparece en el lado izquierdo del i enésimo FD */
for each atributo A do
begin
aparece [A] := NIL;
for i := 1 a |F| do
begin
supóngase que b ® g denota el i enésimo FD;
if A Î b then sumar i a aparece [A];
end
end
addin (a);
return (resultado);

procedure addin (a);


for each atributo A en a do
begin
if A Ï resultado then
begin
resultado := resultado È {A};
for each elemento i de aparece[A] do
begin
fdcount [i] :=fdcount [i] - 1;
if fdcount [i] := 0then
begin
supóngase que b ® g denota el i enésimo FD;
addin (g);
end
end
end
end

Figura 7.22. Un algoritmo para calcular a+


st
Si se empleó reflexividad o aumentatividad en el paso (n + 1) , A debe haber estado en resultado al final del
nth paso. De lo contrario, por la hipótesis inductiva b Í resultado. Por lo tanto, la dependencia empleada en
probar b ® g, A Î g tendrá fdcount definido a 0 por el final del paso enésimo. Por tanto, A se añadirá a
resultado.
Para ver que este algoritmo es más eficiente que el presentado en el capítulo, nótese que se busca
cada FD una vez en el programa principal. El array resultante parece tiene un tamaño proporcional al de los
FDs dados. Las llamadas de recursividad a addin resultan en procesamiento lineal en el tamaño de parece.
Por tanto el algoritmo tiene complejidad temporal, que es lineal en el tamaño de los FDs dados. Por otro lado,
el algoritmo dado en el texto tiene complejidad temporal cuadrática, por ello puede realizar el bucle tantas
veces como el número de FDs, rastreando todos ellos una vez en cada bucle.
7.15 Dado el esquema de la base de datos R(a, b, c), y una relación r del esquema R, escríbase una
consulta SQL para comprobar si se cumple la dependencia funcional b g c sobre la relación r; Escríbase
también una declaración SQL que haga cumplir la dependencia funcional. Supóngase que no hay ningún valor
nulo.

Respuesta:
a. La consulta se presenta a continuación. Su resultado es no vacío si y sólo si b g c no se mantiene en
r.
select b
from r
group by b
having count(distinct c) > 1

b.
create assertion b-hasta-c check
(not exists
(select b
from r
group by b
having count(distinct c) > 1
)
)

7.16 Demuéstrese que la siguiente descomposición del esquema R, del Ejercicio 7.2, no es una
descomposición de reunión sin pérdida.
(A, B, C)
(C, D, E).

Sugerencia: Se da un ejemplo de la relación r en el esquema R, de tal manera que


Õ A, B, C (r) |x| Õ C, D, E (r) ¹ r

Respuesta: Siguiendo la sugerencia, se emplea el siguiente ejemplo de r:

A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2

Con R1 = (A, B, C), R2 = (C, D, E) :


a. ÕR1 (r) sería:

A B C
a1 b1 c1
a2 b2 c1

b. ÕR2 (r) sería:

C D E
c1 d1 e1
c. ÕR1 (r) |x| ÕR2 (r) sería:
A B C D E
a1 b1 c1 d1 e1
a1 b1 c1 d2 e2
a2 b2 c1 d1 e1
a2 b2 c1 d2 e2

Claramente, ÕR1 (r) |x| ÕR2 (r) ¹ r. Por lo tanto, esto es una reunión con pérdida.

7.17 Sea R1, R2, . . . , Rn una descomposición del esquema U. Sea u(U) una relación y sea ri = ÕRI (u);
Demuéstrese que
u Í r1 |x| r2 |x| ... |x| rn

Respuesta: Considérese alguna tupla t en u.


Nótese que ri = ÕRi (u) implica que t[Ri] Î ri, 1 £ i £ n. Así,

t[R1] |x| t[R2] |x| . . . |x| t[Rn] Ï r1 |x| r2 |x| . . . |x| rn


1 1 1 1 1

Mediante la definición de reunión natural,

t[R1] |x| t[R2] |x| . . . |x| t[Rn] = Õa (sb (t[R1] × t[R2] × . . . × t[Rn]))
1 1

donde la condición b se cumple si los valores de los atributos con el mismo nombre en una tupla son iguales y
donde a = U. El producto cartesiano de tuplas sencillas genera una tupla. El proceso de selección se cumple
porque todos los atributos con el mismo nombre deben tener igual valor, dado que son proyecciones desde la
misma tupla. Finalmente, la cláusula de proyección elimina nombres de atributos duplicados.
Mediante la definición de descomposición, U = R1 È R2 È ... . È Rn, que significa que todos los
atributos de t están en t[R1] |x| t[R2] |x| ... . . |x| t[Rn]. Es decir, t es igual al resultado de esta reunión.
1 1 1

Dado que t es una tupla cualquiera de u,

u Ì r1 |x| r2 |x| . . . |x| rn


1 1 1

7.18 Demuéstrese que la descomposición del Ejercicio 7.2 no es una descomposición que preserve las
dependencias.

Respuesta: La dependencia B g D no está preservada. F1, la restricción de F a (A, B, C) es A g ABC, A g


AB, A g AC, A g BC, A g B, A g C, A g A, B g B, C g C, AB g AC, AB g ABC, AB g BC, AB g AB,
AB g A, AB g B, AB g C, AC (igual que AB), BC (igual que AB), ABC (igual que AB). F2, la restricción de F
a (C, D, E) es A g ADE, A g AD, A g AE, A g DE, A g A, A g D, A g E, D g D, E (igual que A), AD,
AE, DE, ADE (igual que A). Se ve fácilmente que (F1 È F2)+ no contiene B g D, dado que el único FD en F1
È F2 con B como el lado izquierdo es B g B, un FD trivial. Se verá en el Ejercicio 7.22 que B g D está
efectivamente en F+. Así, B g D no está preservado. Nótese que CD g ABCDE tampoco está preservado.
Un argumento sencillo es el siguiente: F1 no contiene dependencias con D en el lado derecho de la
flecha. F2 no contiene dependencias con B en el lado izquierdo de la flecha. Por lo tanto, para B g D al estar
preservado debe haber un FD, B g a en F+1 y a g D en F+2 (así B g D se deduciría por transitividad). Dado
que la intersección de dos esquemas es A, a = A. Obsérvese que B g A no está en F+1, pues B+ = BD.

7.19 Demuéstrese que es posible asegurar que una descomposición que preserve dependencias en 3FN es
una descomposición de reunión sin pérdida garantizando que, al menos, un esquema contiene una clave
candidata para el esquema que se está descomponiendo. (Sugerencia: Demuéstrese que la reunión de todas las
proyecciones en los esquemas de la descomposición no pueden tener más tuplas que la relación original).
Respuesta: Sea F un conjunto de dependencias funcionales que se cumplen en un esquema R. Sea s = {R1,R2,
. . . , Rn} una descomposición que preserva dependencias en 3FN de R. Sea X una clave candidata de R.
Considérese una instancia legal r de R. Sea j = ÕX (r) |x| ÕR1 (r) |x| ÕR2 (r) . . . ÕRn(r). Se desea
probar que r = j.
Se parte de que si t1 y t2 son dos tuplas en j tales que t1[X] = t2[X], entonces t1 = t2. Para probar esta
afirmación se emplea el siguiente método inductivo;
Sea F´ = F1 È F2 È . . . È Fn, donde cada Fi es la restricción de F al esquema Ri en s. Considérese el
empleo del algoritmo dado en la Figura 7.7 para calcular el cierre de X bajo F´. Se emplea la inducción sobre
el número de veces que el bucle for se ejecuta este algoritmo.

• Base : En el primer paso del algoritmo, resultado se asigna a X y, por tanto, dado que t1[X] = t2[X], se sabe
que t1[resultado] = t2[resultado] es cierto.
• Paso de inducción : Supongamos que se cumple t1[resultado] = t2[resultado] al final de la k ejecución del
bucle for.

Supóngase que la dependencia funcional considerada en la k + 1 ejecución del bucle for es b g g y que b Í
resultado. b Í resultado implica que t1[b] = t2[b] es cierto. El hecho de que se cumpla b g g para algún
conjunto de atributos Ri en s y que t1[Ri] y t2[Ri] estén en PRi (r), implica que t1[g] = t2[g] es también cierto.
Dado que ahora g se ha añadido a resultado por medio del algoritmo, se sabe que t1[resultado] = t2[resultado]
es cierto al final de la k + 1 ejecución del bucle for.

Dado que s está preservando las dependencias y X es una clave de R, todos los atributos de R están en
resultado cuando finaliza el algoritmo. Así, t1[R] = t2[R] es cierto, es decir, t1 = t2 tal y como se afirmó
anteriormente.
Esta afirmación implica que el tamaño de PX (j) es igual al de j. Nótese también que PX (j) = PX (r)
= r (dado que X es una clave de R). De esta manera se ha probado que el tamaño de j es igual al de r.
Empleando el resultado del Ejercicio 7.17, se sabe que r Í j. Por lo que se concluye que r = j.
Nótese que como X está trivialmente en 3FN, s È {X} es una descomposición de reunión sin pérdida
que preserva las dependencias en 3FN.

7.20 Indíquense los tres objetivos de diseño de las bases de datos relacionales y explíquese el motivo de
que cada uno de ellos sea deseable.

Respuesta: Los tres objetivos del diseño son descomposición de reunión sin pérdida, descomposición que
preserva las dependencias y minimización de la repetición de información. Son convenientes para poder
mantener una base de datos veraz, comprobar rápidamente la exactitud de las actualizaciones y la menor
cantidad de espacio posible.

7.21 Se da una descomposición de reunión sin pérdida en FNBC del esquema R del ejercicio 7.2.

Respuesta: A partir del Ejercicio 7.11, se sabe que B g D no es trivial y el lado izquierdo no es una
superclave. Mediante el algoritmo de la Figura 7.13 se deducen las relaciones {(A, B, C, E), (B, D)}. Esto es,
en FNBC.

7.22 Se da un ejemplo de un esquema de relación R’ y un conjunto de dependencias funcionales F’ tales


que, al menos, haya tres descomposiciones de reunión sin pérdida distintas de R’ en FNBC.
Respuesta: Dada la relación R’ = (A, B, C, D), el conjunto de dependencias funcionales F’ = A g B, C g D,
B g C permite tres descomposiciones FNBC distintas.

R1 = {(A, B), (C, D), (B, C)}

está en FNBC como lo están

R2 = {(A, B), (C, D), (A, C)}


R3 = {(B, C), (A, D), (A, B)}

7.23 Al diseñar una base de datos relacional, indíquese el motivo de que se pueda escoger un diseño que
no sea FNBC.

Respuesta: FNBC no siempre preserva las dependencias. Por lo tanto, se pude querer elegir otra forma
normal (específicamente 3FN) con el fin de hacer, durante las actualizaciones, más fácil la verificación de las
dependencias. Esto evitaría reuniones para verificar las dependencias e incrementaría el rendimiento del
sistema.

7.24 Se da una descomposición en 3FN de reunión sin pérdida que conserve las dependencias del esquema
R del Ejercicio 7.2.

Respuesta: Primero se nota que las dependencias dadas en el Ejercicio 7.2 forman un recubrimiento
canónico. Generando el esquema a partir del algoritmo de la Figura 7.14, se obtiene

R’ = {(A, B, C), (C, D, E), (B, D), (E, A)}.

El esquema (A, B, C) contiene una clave candidata. Por lo tanto, R’ está en tercera forma normal desde una
descomposición de reunión sin pérdida que preserva las dependencias.

Nótese que el esquema original R = (A, B, C, D, E) ya está en 3FN. Así, no era necesario aplicar el
algoritmo, tal y como se hizo anteriormente. El esquema original simple es trivialmente una reunión sin
pérdida, descomposición que preserva las dependencias.

7.25 Sea un atributo primo que aparece como mínimo en una clave candidata. Sean α y β conjuntos de
atributos tales que a g β,pero no se cumple que β g a. Sea A un atributo que no está en α ni en βy que
cumple β g a. Se dice que A es dependiente de manera transitiva de α. Se puede reformular la definición de
3FN de la manera siguiente:
un esquema de relación R está en la 3FN, respecto a un conjunto F de dependencias funcionales, si no hay
atributos no primos A en R, para los cuales A sea dependiente de manera transitiva de una clave de R.
Demuéstrese que esta nueva definición es equivalente a la original.

Respuesta: Supóngase que R está en 3FN de acuerdo a la definición del libro de texto. Se ve que está en 3FN
de acuerdo a la definición en el ejercicio. Sea A un atributo no primo en R, que es transitivamente dependiente
sobre una clave a para R. Entonces ahí existe b Í R, de tal manera que β g A, a g β, A Ï a, A Ï β y no se
cumple que β g a.
Pero entonces β g A viola la definición del libro de texto de 3FN, dado que
• A Ï β implica β g A no es trivial
• Dado que β g a no se cumple, β no es una superclave.
• Como A no es primo, no es ninguna clave candidata

Ahora se muestra que, si R está en 3FN de acuerdo a la definición del ejercicio, está en 3FN de acuerdo a la
definición del libro de texto. Supóngase que R no está en 3FN de acuerdo a la definición del libro de texto.
Entonces hay un FD, a g β que incumple las tres condiciones.
Así
• a g β no es trivial.
• a no es una superclave para R.
• Algún A en β ¾ a no está en ninguna clave candidata.

Esto implica que A no es primo y a g A. Sea g una clave candidata para R. Entonces g g a, a g g no se
cumple (dado que a no es una superclave), A Ï a y A Ï g (dado A no es primo). Así, A es transitivamente
dependiente de g, violando la definición del ejercicio.

7.26 Una dependencia funcional a g β se denomina una dependencia parcial, si hay un subconjunto
adecuado g de a, tal que g g β. Se dice que β es parcialmente dependiente de a. Un esquema de relación R
está en la segunda forma normal (2FN), si cada atributo A en R cumple uno de los siguientes criterios:
• Aparece en una clave candidata.
• No es parcialmente dependiente de una clave candidata.

Demuéstrese que cada esquema en 3FN está en 2FN. (Sugerencia: demuéstrese que cada dependencia parcial
es una dependencia transitiva).

Respuesta: En referencia a las definiciones del Ejercicio 7.25, se dice que un esquema de relación R está en
3FN si no hay ningún atributo primo A en R, para el que A sea transitivamente dependiente sobre una clave
para R.
También se puede rescribir la definición de 2FN dada aquí como :
“Un esquema de relación R está en 2FN, si ningún atributo no primo A es parcialmente dependiente
sobre cualquier clave candidata para R”.
Para probar que todo esquema en 3FN está en 2FN, es suficiente mostrar que si un atributo no primo
A es parcialmente dependiente sobre una clave candidata a, entonces A es también transitivamente
dependiente sobre la clave a.
Sea A un atributo no primo en R. Sea a una clave candidata para R. Supóngase que A es parcialmente
dependiente sobre a.
• Desde la definición de una dependencia parcial, se sabe que para algunos subconjuntos propios b de a, b g
A.
• Dado que b Ì a, a g b. Además, b g a no se cumple, dado que a es una clave candidata.
• Finalmente, dado que A no es primo, no puede estar ni en b ni en a.

De esto se concluye que a g A es una dependencia transitiva. Por lo tanto, se ha probado que cada esquema
en 3FN, lo está también en 2FN.

7.27 Dados los tres objetivos del diseño de bases de datos relacionales, indíquese si hay alguna razón para
diseñar un esquema de base de datos que se halle en 2FN, pero que no se halle en una forma normal de orden
superior. (Véase el Ejercicio 7.26 para obtener la definición de 2FN).

Respuesta: Los tres objetivos del diseño de bases de datos relacionales están para evitar
• Repetición de información
• Incapacidad para representar información
• Pérdida de información

2NF no prohíbe tanta repetición de información debido a que el esquema (A, B, C) con dependencias A g B y
B g C está permitido bajo 2FN, aunque el mismo par (B, C) pudiera estar asociado con muchos valores de A,
duplicando innecesariamente valores de C. Apara evitar esto se debe ir a la 3FN. La repetición de información
se permite en 3FN en algunos, pero no todos, casos donde lo esté en 2FN. Así, en general, 3FN reduce la
repetición de información. Dado que siempre se puede realizar una descomposición en 3FN de reunión sin
pérdida, no hay pérdida de información al pasar de 2FN a 3FN.
Nótese que la descomposición {(A, B), (B, C)} es una descomposición en 3FN de reunión sin pérdida
y que preserva dependencias, del esquema (A, B, C). Sin embargo, en el caso de que se elija esta
descomposición, la recuperación de la información sobre la relación entre A, B y C requiere una reunión de
las dos relaciones que, en la correspondiente descomposición en 2FN, se evita.
De este modo, la decisión sobre la forma normal a elegir depende del resultado de comparar el coste
de la verificación de la dependencia con el de las reuniones. Generalmente se prefiere la 3FN. La verificación
de las dependencias necesita hacerse con cada inserción o actualización de las instancias de un esquema en
2FN, mientras que sólo algunas consultas requerirán la reunión de instancias de un esquema en 3FN.

7.28 Se da un ejemplo de un esquema de relación R y un conjunto de dependencias tales que R esté en


FNBC, pero no en 4FN.

Respuesta: El esquema de relación R = (A, B, C, D, E) y el conjunto de dependencias

A gg BC
B gg CD
E gg AD

constituyen una descomposición FNBC, sin embargo es claro que no está en 4FN. (Es BCNF porque todos los
FDs son triviales).

7.29 Explíquese el motivo de que 4FN sea una forma normal más deseable que FNBC.

Respuesta: 4FN es más conveniente que FNBC porque reduce la repetición de información. Si se considera
un esquema FNBC que no está en 4FN (véase el Ejercicio 7.28), se observa que la descomposición en 4FN no
pierde información con tal que se use una descomposición de reunión sin pérdida, todavía se reduce la
redundancia.

7.30 Explíquese como pueden surgir las tuplas colgantes. Explíquense los problemas que pueden causar.

Respuesta: Las tuplas colgantes pueden aparecer cuando se inserta una tupla en una relación descompensada,
pero ninguna tupla se inserta en las otras relaciones de la composición. Pueden originar que las consultas que
formen la reunión de una relación descompuesta devuelvan valores incorrectos, dado que podrían no estar
incluidas las tuplas colgantes. Como se ve en el Capítulo 5, las tuplas colgantes se pueden evitar, mediante la
especificación de ligaduras de integridad referencial.
CAPITULO 8

BASES DE DATOS ORIENTADAS A OBJETOS

Este capítulo aporta una introducción a las bases de datos orientadas a objetos. Este capítulo y el siguiente
forman una unidad lógica y deberían enseñarse consecutivamente. Es posible enseñar estos capítulos antes de
cubrir las normalizaciones (Capítulo 7).
Los apartados del capítulo anteriores al apartado sobre C++ y ODMG persistentes (Apartado 8.5), no
presuponen familiaridad alguna con un lenguaje de programación orientada a objetos. Sin embargo, es
bastante posible que los estudiantes ya estén familiarizados con los conceptos básicos y los lenguajes de la
programación orientada a objetos. Para tales estudiantes el Apartado 8.2 se puede cubrir con relativa rapidez.
Sin embargo, es importante señalar la motivación de las características de la orientación a objetos en el
contexto de una base de datos y como los requerimientos varían en función del lenguaje de programación.
Hay una tendencia a confundir lenguajes orientados a objetos “persistentes” con bases de datos
orientadas a objetos. Un lenguaje orientado a objetos persistentes debería ser simplemente un interface para
una base de datos. Es importante recordar a los estudiantes todas las características que un sistema de bases de
datos debe tener, de tal modo que puedan distinguir, con toas las de la ley, sistemas de bases de datos
orientados a objetos de sistemas que aportan interfaces orientados a objetos, pero aportan poco en el sentido
de las posibilidades de las bases de datos, tales como las facilidades en las consultas, catálogos en línea,
control de concurrencias y recuperaciones.
Hay varios sistemas comerciales de bases de datos orientadas a objetos en el mercado, así como unos
pocos sistemas de uso público. Algunos de los sistemas comerciales también ofrecen precios reducidos o
copias gratuitas para usos académicos. Los sistemas comerciales de bases de datos orientadas a objetos
incluyen Objectivity (www.objectivity.com), ObjectStore (www.odi.com) y Versant (www.versant.com).

Cambios a la tercera edición:

Se han actualizado algunos ejemplos para hacerlos más intuitivos. El tratamiento de ODMG se ha actualizado
hasta ODMG-2, incluyendo la nueva sintaxis (con un prefijo d_ para las palabras clave) y la nueva
característica d_rel_ref para declarar relaciones.
Ejercicios

8.1 Para cada una de las siguientes áreas de aplicación, explíquese por qué un sistema de bases de datos
relacional resultaría inadecuado. Indíquense todos los componentes específicos del sistema que habría que
modificar.
a. Diseño asistido por computadora.
b. Bases de datos multimedia.

Respuesta: Cada una de las grandes aplicaciones contiene elementos de datos especializados (por ejemplo, un
módulo de programa, una imagen gráfica, voces digitalizadas, un documento). Estos elementos de datos
tienen operaciones específicas para ellos (por ejemplo, compilar, rotar, escuchar, formatear) que no se pueden
expresar mediante lenguajes de consultas relacionales. Son elementos de datos de longitud variable que hace
impracticable almacenarlos en los campos cortos que están permitidos en los registros, para tales sistemas de
bases de datos. Por consiguiente es necesario cambiar tanto el modelo, como los lenguajes de manipulación y
definición de los datos.
Además, las transacciones anidadas y las de larga duración son típicas de estas aplicaciones. Es
probable que sean necesarios cambios en los sistemas de concurrencia y recuperación.

8.2 ¿En qué se diferencia el concepto de objeto en el modelo orientado a objetos, del concepto de
entidad en el modelo entidad - relación?

Respuesta: Una entidad es simplemente una colección de variables o elementos de datos. Un objeto es una
encapsulación de datos así como los métodos (código) para operar sobre los datos. Los datos miembros de un
objeto son visibles directamente sólo para sus métodos. El mundo exterior puede acceder a los datos de los
objetos, sólo pasando mensajes predefinidos para ello y estos mensajes se implementan por medio de los
métodos.

8.3 Una compañía de alquiler de coches tiene una base de datos de los vehículos de su flota actual. Para
todos los vehículos incluye el número de identificación del vehículo, el número de matrícula, fabricante,
modelo, fecha de adquisición y el color. Se incluyen datos específicos para algunos tipos de vehículos:
• Camiones: capacidad de carga.
• Coches deportivos: potencia, edad mínima del conductor.
• Mono volúmenes: número de plazas.
• Vehículos todo terreno: altura de los bajos, eje motor (tracción a dos o cuatro ruedas).

Constrúyase, para esta base de datos, la definición del esquema de una base de datos orientada a objetos.
Utilícese la herencia donde sea conveniente.

Respuesta:
class vehículo {
int id-vehículo;
string número-matrícula;
string fabricante;
string modelo;
date fecha-compra;
color-type color;
};

class camión isa vehículo {


int capacidad-carga;
};

class coches-deportivos isa vehículo {


int potencia;
int edad-mínima-conductor;
};

class monovolumen isa vehículo {


int número-plazas;
};

class vehículos-todo-terreno isa vehículo {


real altura-bajos;
drivetrain-type ejemotor;
};
Se supone que color-type y drivetrain-type son tipos definidos previamente.

8.4 Explíquese el motivo de que pueda haber ambigüedad en caso de herencia múltiple. Ilústrese la
explicación con un ejemplo.

Respuesta: Una clase hereda las variables y métodos de todas sus superclases inmediatas. Así, podría heredar
una variable o método del mismo nombre desde más de una superclase. Cuando se referencia esa variable
particular o método de un objeto de la subclase, hay una ambigüedad con respecto a cuál de las superclases
proporciona la herencia.
Por ejemplo, sean las clase profesor y estudiante, ambas con una variable departamento. Si una clase
profesor asistente hereda desde ambas clases, cualquier referencia a la variable departamento de un objeto
profesor asistente es ambiguo.

8.5 Explíquese la diferencia entre el concepto de identidad de los objetos del modelo orientado a objetos
y el concepto de igualdad de las tuplas del modelo relacional.

Respuesta: La tupla igualdad está determinada por los valores de los datos. La identidad de los objetos es
independiente de los valores de los datos, dado que los sistemas orientados a objetos emplean identidad
incorporada.

8.6 Explíquese la diferencia de significado entre los arcos de un grafo dirigido acíclico, que represente la
herencia y uno que represente los continentes de objetos.

Respuesta: Un arco desde una clase A hasta otra B, en un GAD representando herencias, significa que un
objeto de la clase B lo es también de la clase A. Tiene todas las propiedades de los objetos de la clase A, más
las de los objetos propios. En particular, hereda todas las variables y métodos de la clase A. Puede, por
supuesto, aportar sus propias implementaciones para los métodos heredados.
Un arco desde una clase A hasta otra B, en un GAD de continentes de objetos, significa que un objeto
de la clase A contiene a uno de clase B. No tiene por qué haber ningún parecido en las propiedades de A y B.
Ni A ni B heredan nada el uno del otro. Funcionan como tipos independientes, en la medida en que un objeto
de clase A puede acceder a la variables del objeto B contenido en él, sólo por medio de los métodos del objeto
B.

8.7 ¿Por qué permiten los lenguajes de programación persistentes los objetos transitorios? ¿Sería más
sencillo utilizar sólo objetos persistentes y borrar los objetos innecesarios al terminar la ejecución? Explíquese
la respuesta.

Respuesta: La creación, la eliminación y los accesos, serán generalmente más lentos y caros para objetos
persistentes almacenados en la base de datos, que para objetos transitorios en la memoria local de la
transacción. Esto se debe a los gastos generales de conservar la semántica de las transacciones, seguridad e
integridad. Dado que un objeto transitorio es puramente local a la transacción que lo crea y no se incorpora a
la base de datos, todos estos gastos generales se pueden evitar. Así, con el objeto de aportar accesos eficientes
a los datos puramente locales y temporales, los lenguajes de programación persistentes soportan objetos
transitorios.

8.8 Empleando C++ de ODMG


a. Dense definiciones de esquemas correspondientes al esquema relacional de la Figura 3.39,
empleando referencias para expresar las relaciones de clave externa.
b. Escríbanse programas para resolver cada una de las cuestiones del Ejercicio 3.10.

Respuesta:
a La definiciones del esquema se pueden escribir de dos maneras distintas, una es una traducción
directa del esquema relacional, mientras que la otra emplea, más directamente, las características de la
orientación a objetos.

• El primer esquema es el siguiente:


class empleado : public d Object {
public:
d String nombre-persona;
d String calle;
d String ciudad;
};

class compañía : public d Object {


public:
d String nombre-compañía;
d String ciudad;
};

class trabaja : public d Object {


public:
d Ref<empleado> persona;
d Ref<compañía> comp;
d Long sueldo;
};
class jefe : public d Object {
public:
d Ref<empleado> persona;
d Ref<empleado> jefe;
};

• El segundo esquema es el siguiente:


class empleado : public d Object {
public:
d String nombre-persona;
d String calle;
d String ciudad;
d Rel Ref<compañía, empleados> comp;
d Ref<empleado> jefe;
d Long sueldo;
};

class compañía : public d Object {


public:
d String nombre-compañía;
d String ciudad;
d Rel Set<empleado, comp> empleados;
};

const char empleados[] = ”empleados”;


const char comp[] = ”comp”;

b. Se presentan consultas para el segundo esquema.


• Averiguar la compañía con mayor número de empleados.
d Ref<compañía> mayoríaempleados(){ d Database emp db obj;
d Database * emp db = ”” emp db obj;
emp db- >open(”Emp-DB”);
d Transaction Trans;
Trans.begin();
d Extent<compañía> all comps(emp db);
d Iterator<d Ref<compañía>> iter=all comps.create iterator();
d Iterator<d Ref<empleado>> iter2;
d Ref<compañía> c, maxc;
d Ref<empleado> e;
int count;
int maxcount=0;
while(iter.next(c)) {
iter2=(c- >empleados).create iterator();
count=0;
while(iter2.next(e)) {
count++;
}
if(maxcount < count) {
maxcount=count;
maxc=c;
}
}
Trans.commit();
return maxc;
}
• Averiguar la compañía con la nómina más reducida.
d Ref<compañía> menorpago(){ d Database emp db obj;
d Database * emp db = ”” emp db obj;
emp db- >open(”Emp-DB”);
d Transaction Trans;
Trans.begin();
d Extent<compañía> all comps(emp db);
d Iterator<d Ref<compañía>> iter=all comps.create iterator();
d Iterator<d Ref<empleado>> iter2;
d Ref<compañía> c, minc;
d Ref<empleado> e;
d Long sal;
d Long minsal=0;
while(iter.next(c)) {
iter2=(c- >empleados).create iterator();
sal=0;
while(iter2.next(e)) {
sal+=e- >sueldo;
}
if(minsal > sal) {
minsal=sal;
minc=c;
}
}
Trans.commit();
return minc;
}

• Encontrar las compañías cuyos empleados ganan un salario mayor, en promedio, que el salario medio del
Banco Importante.
d Ref<compañía> mayorsueldo(){ d Database emp db obj;
d Database * emp db = ”” emp db obj;
emp db- >open(”Emp-DB”);
d Transaction Trans;
Trans.begin();
d Extent<compañía> all comps(emp db);
d Iterator<d Ref<compañía>> iter=all comps.create iterator();
d Iterator<d Ref<empleado>> iter2;
d Ref<compañía> c, FBC=all comps.select(nombre-compañía=”Banco Importante”);
d Set<d Ref<compañía>> result;
d Ref<empleado> e;
int count;
d Long avsal=0, avFBCsal=0, sal=0;
iter2=(FBC- >empleados).create iterator();
while(iter2.next(e)) {
count++;
sal+=e- >sueldo;
}
avFBCsal=sal/count;
while(iter.next(c)) {
iter2=(c- >empleados).create iterator();
sal=0; count=0;
while(iter2.next(e)) {
sal+=e- >sueldo;
count++;
}
avsal=sal/count;
if(avsal > avFBCsal) {
result.insert element(c);
}
}
Trans.commit();
return result;
}

8.9 Utilizando C++ de ODMG, dense definiciones de esquema correspondientes al diagrama E-R de la
Figura 2.29. Utilícense referencias para implementar relaciones.

Respuesta:

class persona : public d Object {


public:
d String nombre;
d String dirección;
d String teléfono;
};

class autor : public person {


public:
d String URL;
d Rel Set<libro, autores> libros;
};

class editor : public person {


public:
d String URL;
d Rel Set<libro, libro.editor> libros;
};

class cliente : public person {


public:
d String email;
d Rel Set<cestacompra, propietario> cestas;
};

class libro : public d Object {


public:
int año;
d String título;
float precio;
d String ISBN;
d Rel Set<autor, libros> autores;
d Rel Ref<editor, libros> libro.editor;
};
class cestacompra : public d Object {
public:
d String ID-cesta;
d Rel Ref<cliente, cestas> propietario;
d Set<d Ref<libro qty>> contiene;
};

class almacén : public d Object {


public:
d String dirección;
d String teléfono;
d String código;
d Set<d Ref<libro qty>> stocks;
};

class libro qty : public d Object {


public:
d Ref<libro> libro;
int número;
};

const char libros[] = ”libros”;


const char autores[] = ”autores”;
const char libro editor[] = ”libro editor”;
const char cestas[] = ”cestas”;
const char propietario[] = ”propietario”;

8.10 Explíquese, por medio de un ejemplo, cómo representar una relación ternaria en un modelo de datos
orientado a objeto, como C++ de ODMG.

Respuesta: Para representar relaciones ternarias, crear una clase correspondiente a la relación y referirse a las
entidades en esta clase. Por ejemplo, para representar la relación ternaria de la Figura 2.13 se hace lo
siguiente:

class trabajaen : public d Object {


public:
d Ref<empleado> emp;
d Ref<sucursal> sucursal;
d Ref<trabajo> trabajo;
};

8.11 Explíquese la manera en que se implementa un puntero persistente. Compárese esta implementación
con la de los punteros de los lenguajes de propósito general, tales como C o Pascal.

Respuesta: Los punteros persistentes se pueden implantar como Tipos de Datos Abstractos (TDAs). Estos
TDAs deben aportar las operaciones de punteros típicas, como incrementando y desreferenciando, así su
empleo y el de los punteros regulares es uniforme. Por otro lado, los punteros regulares generalmente
incorporan tipos, implementados como parte del lenguaje.
8.12 Si se crea un objeto sin que haya referencias al mismo, ¿cómo se puede borrar?

Respuesta: Si se crea un objeto sin ninguna referencia sobre él, no puede ser accedido ni borrado por medio
de un programa. La única manera para el sistema de la base de datos es, por sí mismo, localizar y borrar tales
objetos. Esto se denomina recogida de basura. Una forma de hacer la recogida de basura es por el método de
marcar y barrer. Primero se marcan los objetos referidos directamente por programas. Después se siguen las
referencias desde estos objetos a otros que, asu vez, se marcan. El procedimiento continua repetidas veces,
hasta que no hay más objetos sin marcar que puedan alcanzarse, mediante cadenas de referencia desde objetos
marcados. En este punto, se borran todos los objetos restantes sin marcar. Este método es correcto; se puede
probar que si no se marca ningún nuevo objeto después de una ronda de marcar y barres, los restantes objetos
sin marcar están de hecho sin referenciar.

8.13 Considérese un sistema que proporcione objetos persistentes. ¿Se trata necesariamente de un sistema
de bases de datos?. Explíquese la respuesta.

Respuesta: Un sistema de base de datos debe proporcionar prestaciones como transacciones, consultas
(recuperación asociativa de objetos), seguridad e integridad. Un sistema de objetos persistentes puede no
ofrecer tales prestaciones.
CAPITULO 9

BASES DE DATOS RELACIONALES ORIENTADAS A OBJETOS

Este capítulo describe extensiones a los sistemas de bases de datos relacionales, para soportar tipos de datos
complejos y características orientadas a objetos. Tales sistemas extendidos se denominan sistemas
relacionales orientados a objetos. Desde que el capítulo se incorporó a la tercera edición, la mayoría de los
sistemas de bases de datos comerciales han incorporado algunos complementos a las características de las
relaciones orientadas a objetos y estas características se han estandarizado como parte del SQL:1999.
Sería instructivo asignar ejercicios a los estudiantes con el objeto de encontrar aplicaciones en las
que el modelo relacional objeto, en particular los objetos complejos, fuera más idóneo que el modelo
relacional tradicional.

Cambios a la tercera edición:

Las características del lenguaje de consultas se basan ahora en el estándar SQL:1999, el cual no estaba listo
cuando se publicó la tercera edición; esa edición estaba basada en las características de diferentes propuestas
de ampliación del SQL.
Ejercicios

9.1 Considérese el esquema de la base de datos

Emp = (enombre, setof(Hijos), setof(Conocimientos))


Hijos = (nombre, Cunpleaños)
Cumpleaños = (día, mes, año)
Conocimientos = (escribir-a-máquina,setof(Exámenes))
Exámenes = (año, ciudad)

Supóngase que los atributos de tipo setof (Hijos), setof(Conocimientos), y setof(Exámenes), tienen nombres
de atributos ConjuntoHijos, ConjuntoConocimientos y ConjuntoExámenes, respectivamente. Supóngase que
la base de datos contiene una relación emp (Emp). Escríbanse las siguientes consultas en SQL:1999 (con las
extensiones descritas en este capítulo).
a. Encuéntrense los nombres de todos los empleados que tengan un hijo nacido en Marzo.
b. Encuéntrense los empleados que hicieron un examen del tipo de conocimiento “escribir-a-máquina”
en la ciudad de “San Rafael”.
c. Indicar todos los tipos de conocimiento de la relación emp.

Respuesta:
a. Encuéntrense los nombres de todos los empleados que tengan un hijo nacido en Marzo.
select nombree
from emp as e, e.ConjuntoHijos as c
where ’Marzo’ in
(select cumpleaños.mes
from c
)

b Encuéntrense los empleados que hicieron un examen del tipo de conocimiento “escribir-a-máquina”
en la ciudad de “San Rafael”.
select e.nombree
from emp as e, e.ConjuntoConocimientos as s, s.ConjuntoExámenes as x
where s.tipo = ’escribir a máquina’ and x.ciudad = ’San Rafael’

c. Indicar todos los tipos de conocimiento de la relación emp.


select distinct s.tipo
from emp as e, e.ConjuntoExámenes as s

9.2 Rediséñese la base de datos del Ejercicio 9.1 en la primera y cuarta forma normal. Indíquense las
dependencias funcionales o multivaloradas que se den por supuestas. Indíquense también todas las
restricciones de integridad referencial que deban incluirse en los esquemas de la primera y cuarta formas
normales.

Respuesta: Para poner el esquema en primera forma normal se aplanan todos los atributos en un esquema de
relación sencilla.

Empleado-detalles = ( nombree, nombrec, díab, mesb, añob, tipos, añox, ciudadx)

Se renombran los atributos por motivos de claridad; nombrec es Hijos.nombre y díab, mesb, añob son los
atributos de Cumpleaños; tipos es Conocimientos.tipo y añox y ciudadx son los atributos de Exámenes. Los
FDs y las dependencias multivaloradas supuestas son:

nombree, nombrec g díab, mesb, añob


nombree gg nombrec, díab, mebs, añob
nombree, tipos gg añox, ciudadx

El FD captura el hecho de que un hijo tenga un único cumpleaños, bajo la suposición de que un empleado no
puede tener dos hijos del mismo nombre. Los MVDs capturan el hecho de que no hay relación entre los hijos
de un empleado y su formación.
El esquema rediseñado en cuarta forma normal es:

Empleado = ( nombree)
Hijo = ( nombree, nombrec, díab, mesb, añob)
Conocimientos = (nombree, tipos, añox, ciudadx)

nombree será la clave primaria de Empleado y ( nombree, nombrec) será la clave primaria de Hijo. El atributo
nombree es una clave externa en Hijo y en Conocimientos, refiriéndose a la relación Empleado.

9.3 Considérense los esquemas de la tabla personas y las tablas estudiantes y profesores, que se crearon
bajo persona en el Apartado 9.3. Se da un esquema relacional en tercera forma normal que represente la
misma información. Recupérense las restricciones sobre subtablas y dense todas las restricciones que deban
imponerse en el esquema relacional para que cada ejemplar de la base de datos del esquema relacional pueda
representarse también mediante un ejemplar del esquema con herencia.

Respuesta: Un esquema relacional correspondiente, en tercera forma normal, es el siguiente:

Personas = (nombre, dirección)


Estudiantes = (nombre, titulación, departamento-estudiante)
Profesores = (nombre, sueldo, departamento-profesor)

nombre es la clave primaria de las tres relaciones y es también una clave externa referida a Personas, para
Estudiantes y Profesores.
En lugar de situar sólo el atributo nombre de Personas, en Estudiantes y Profesores, se pueden
incluir sus dos atributos. En ese caso, habrá un leve cambio, a saber – (nombre, dirección) se convertirá en la
clave externa de Estudiantes y Profesores. La claves primarias permanecerán igual en todas las tablas.

9.4 Una compañía de alquiler de coches tiene una base de datos de los vehículos de su flota actual. Para
todos los vehículos incluye su número de bastidor, el número de matrícula, fabricante, modelo, la fecha de
compra y su color. Se incluyen datos específicos para algunos tipos de vehículos:
• Camiones: capacidad de carga.
• Coches deportivos: potencia, edad mínima del arrendatario.
• Mono volúmenes: número de plazas.
• Vehículos todo terreno: altura de los bajos, eje motor (tracción a dos o cuatro ruedas).

Constrúyase una definición de esquema para esta base de datos en SQL:1999. Utilícese la herencia donde sea
conveniente.

Respuesta: Para este problema se emplea la herencia de tablas. Se supone que MiFecha, Color y Tipo Eje
Motor son tipos definidos previamente.
create type Vehículo
(id-vehículo integer,
número matrícula char(15),
fabricante char(30),
modelo char(30),
fecha-compra MiFecha,
color Color)

create table vehículo of type Vehículo

create table camión


(capacidad-carga integer)
under vehículo

create table cochedeportivo


(potencia integer
edad-mínima-conductor integer)
under vehículo

create table monovolumen


(número-plazas integer)
under vehículo

create table vehículotodoterreno


(altura-bajos real
ejemotor Tipo Eje Motor)
under vehículo

9.5 Explicar la diferencia entre un tipo x y un tipo de referencia ref(x). ¿En qué circunstancias se
escogería un tipo de referencia?

Respuesta: Si el tipo de un atributo es x, entonces en cada tupla de la tabla , correspondiente a ese atributo,
hay un objeto actual de tipo x . Si su tipo es ref(x), entonces en cada tupla, correspondiente a ese atributo, hay
una referencia a algún objeto de tipo x. Se elige un tipo de referencia para un atributo, si la finalidad prevista
de ese atributo es referirse a un objeto independiente.
9.6 Considérese el diagrama E-R de la Figura 2.11, que contiene atributos compuestos, multi valorados y
derivados.
a. Se da una definición de esquema en SQL:1999 correspondiente al diagrama E-R. Utilícese un array
para representar el atributo multivalorado y constructoras apropiadas de SQL:1999 para representar los otros
tipos de atributos.
b. Dense constructores para cada uno de los tipos estructurados definidos.

Respuesta:
a. A continuación se presenta la correspondiente definición del esquema en SQL extendido: Nótese
que el atributo edad ha sido convertido en un método.

create type Nombre


(primer-nombre varchar(15),
inicial-segundo-nombre char,
apellido varchar(15))
create type Calle
(nombre-calle varchar(15),
número-calle varchar(4),
número-apartamento varchar(7))

create type Dirección


(calle Calle,
ciudad varchar(15),
provincia varchar(15),
código-postal char(6))

create table cliente


(nombre Nombre,
id-cliente varchar(10),
dirección Dirección,
teléfonos char(7) array[10],
dob fecha)
method integer edad()

b create function Nombre (f varchar(15), m char, l varchar(15))


returns Nombre
begin
set primer-nombre = f;
set inicial-segundo-nombre = m;
set apellido = l;
end
create function Calle (snombre varchar(15), sno varchar(4), ano varchar(7))
returns Calle
begin
set nombre-calle = snombre;
set número-calle = sno;
set número-apartamento =ano;
end
create function Dirección (s Calle, c varchar(15), sta varchar(15), postal varchar(6))
returns Dirección
begin
set calle = s;
set ciudad = c;
set provincia =sta;
set código-postal = postal;
end

9.7 Se da una definición del esquema en SQL:1999 del diagrama E-R de la Figura 2.17, que contiene
especializaciones.

Respuesta:

create type Persona


(nombre varchar(30),
calle varchar(15),
ciudad varchar(15))

create type Empleado


under Persona
(sueldo integer)

create type Cliente


under Persona
(valoración-crédito integer)

create type Responsable


under Empleado
(número-oficina integer)

create type Cajero


under Empleado
(número-estación integer,
horas-trabajadas integer)

create type Secretaria


under Empleado
(horas-trabajadas integer)

create table persona of Persona

create table empleado of Empleado


under persona

create table cliente of Cliente


under persona

create table responsable of Responsable


under empleado

create table cajero of Cajero


under empleado

create table secretaria of Secretaria


under empleado

9.8 Considérese el esquema relacional de la Figura 3.39.


a. Se da una definición de esquema en SQL:1999 correspondiente al esquema relacional, pero usando
referencias para expresar las relaciones de claves externas.
b. Escríbanse cada una de las consultas del Ejercicio 3.10 del esquema anterior, usando SQL:1999.

Respuesta:
a. La definición del esquema se presenta a continuación. Nótese que se pueden añadir referencias
atrasadas, pero no son tan importantes como en OODBS, porque las consultas se pueden escribir en SQL y las
reuniones pueden cuidar las restricciones de integridad.

create type Empleado


(nombre-persona varchar(30),
calle varchar(15),
ciudad varchar(15))

create type Compañía


(nombre-compañía varchar(15),
(ciudad varchar(15))
create table empleado of Empleado

create table compañía of Compañía

create type Trabaja


(persona ref(Empleado) scope empleado,
comp ref(Compañía) scope compañía,
sueldo int)

create table trabaja of Trabaja

create type Jefe


(persona ref(Empleado) scope empleado,
(jefe ref(Empleado) scope empleado)

create table jefe of Jefe

b i. select comp g nombre


from trabaja
group by comp having count(persona) ³ all(select count(persona)
from trabaja
group by comp)

ii. select comp g nombre


from trabaja
group by comp having count(sueldo) £ all(select count(sueldo)
from trabaja
group by comp)

iii select comp g nombre


from trabaja
group by comp having avg(sueldo) > (select avg(sueldo)
from trabaja
where comp g nombre-compañía=”Banco Importante”)

9.9 Considérese una base de datos de empleados con las relaciones

empleado (nombre-empleado, calle, ciudad)


trabaja (nombre-empleado, nombre-compañía, sueldo)

donde las claves primarias están subrayadas. Escríbase una consulta para encontrar las compañías cuyos
empleados ganan un salario superior, en media, que el sueldo medio del Banco Importante.
a. Empleando las funciones SQL:1999 donde sea apropiado.
b. Sin emplear funciones SQL:1999.
Respuesta:
a. create function sueldo-medio(cnombre varchar(15))
returns integer
declare resultado integer;
select avg(sueldo) into resultado
from trabaja
where trabaja.compañía-nombre = cnombre
return resultado;
end
select nombre-compañía
from trabaja
where sueldo-medio(nombre-compañía) > sueldo-medio (”Banco Importante”)

b select nombre-compañía
from trabaja
group by nombre-compañía
having avg (sueldo) > (select avg (sueldo)
from trabaja
where nombre-compañía = ”Banco Importante”)

9.10 Rescríbase la consulta del Apartado 9.6.1 que devuelve los títulos de todos los libros que tienen más
de un autor, empleando la cláusula with en lugar de la función.

Respuesta:

with autoresmúltiples(título, contar) as


select título, count(autor)
from autores
group by título
select libros4.título
from libros4, autoresmúltiples
where libros4.título = autoresmúltiples.título
and autoresmúltiples.contar > 1

9.11 Compárese el uso de SQL incorporado con el empleo en SQL de las funciones definidas utilizando
un lenguaje de programación de propósito general. ¿En qué circunstancias se debe utilizar cada una de estas
características?

Respuesta: Las funciones SQL son principalmente un mecanismo para extender la potencia del SQL, para
gestionar atributos de tipos de datos complejos (como imágenes) o para realizar operaciones complejas y no
estándar. El SQL incorporado es útil cuando son necesarias acciones imperativas, como la visualización de
resultados y la interacción con el usuario. Esto no se puede hacer convenientemente en un entorno de sólo
SQL. El SQL incorporado se puede emplear, en lugar de funciones SQL, para la recuperación de datos y,
entonces, realizar operaciones de las funciones sobre el resultado del SQL. Sin embargo, un inconveniente es
que muchas evaluaciones de las consultas funcionalmente pueden terminar por buclear en el código del
lenguaje anfitrión.

9.12 Supóngase que ha sido contratado como consultor para seleccionar un sistema de base de datos para
la aplicación de su cliente. Para cada una de las aplicaciones siguientes, indíquese el tipo de sistema de base
de datos (relacional, base de datos orientada a objetos basada en un lenguaje de programación persistente,
relacional orientada a objetos; no se debe especificar ningún producto comercial) que recomendaría.
Justifíquese la recomendación.
a. Sistema de diseño asistido por computadora para un fabricante de aviones.
b. Sistema para realizar el seguimiento de los donativos hechos a los candidatos a un cargo público.
c. Sistema de información de ayuda para la realización de películas.

Respuesta:
a. Un sistema de diseño asistido por computadora para un fabricante de aviones:
Una base de datos orientada a objetos sería adecuada para esto. La razón es que CAD requiere tipos de datos
complejos y, al estar orientadas al cálculo, las herramientas CAD son generalmente usadas en un entorno de
lenguajes de programación que necesita acceder a la base de datos.
b Un sistema para realizar el seguimiento de los donativos hechos a los candidatos a un cargo público:
Un sistema relacional sería adecuado para esto, al ser de esperar que los tipos de datos resulten sencillos y un
mecanismo potente de consultas sea esencial.
c. Un sistema de información de ayuda a la realización de películas:
Aquí habrá un uso intensivo de tipos de datos multimedia y otros tipos de datos complejos. Pero las consultas
son probablemente sencillas, por lo que es adecuado un sistema relacional objeto.
CAPITULO 10

XML

En los cuatro años y medio desde que se publicó la edición anterior, XML ha pasado de ser una propuesta
poco conocida para el Consorcio World Wide Web, a un extenso conjunto de estándares que están siendo
empleados ampliamente y cuyo uso crece rápidamente. En este período los objetivos del XML han pasado de
ser una mejora al SGML o HTML, hasta convertirse en el modelo de datos básico para el intercambio de
datos.
Nuestra visión de XML está decididamente centrada en las bases de datos: es importante ser
consciente que muchos de los usos de XML son centros de documentos, pero creemos que la gran mayoría de
las aplicaciones XML serán la representación y el intercambio de datos, entre aplicaciones de bases de datos.
En este sentido, XML es un modelo de datos que aporta un número de prestaciones más allá de las del modelo
relacional, en particular la capacidad para representar información afín en una unidad sencilla, mediante el
empleo de estructuras anidadas. Los dominios de aplicaciones específicas, para la representación e
intercambio de datos, necesitan sus propios estándares que definan el esquema de datos.
Dada la amplia naturaleza del XML y los estándares relacionados, este capítulo sólo intenta aportar
una introducción y no una descripción completa. Para un curso que pretenda explorar XML en detalle se
puede necesitar material suplementario. Podría incluir tanto información en línea como libros sobre XML.
Ejercicios

10.1 Se da una representación alternativa de la información bancaria que contenga los mismos datos que
en la Figura 10.1,pero empleando atributos en vez de sub elementos. Se da también el DTD para esta
representación.

Respuesta:
a. Representación XML de datos, empleando atributos.
<banco>
<cuenta número-cuenta=“A-101” nombre-sucursal=“Centro”
saldo=“500”>
</cuenta>
<cuenta número-cuenta=“A-102” nombre-sucursal=“Navacerrada”
saldo=“400”>
</cuenta>
<cuenta número-cuenta=“A-201” nombre-sucursal=“Galapagar”
saldo=“900”>
</cuenta>
<cliente nombre-cliente=“González” calle-cliente=“Alma”
ciudad-cliente=“Palo Alto”>
</cliente>
<cliente nombre-cliente=“Hayes” calle-cliente=“Main”
ciudad-cliente=“Harrison”>
</cliente>
<impositor número-cuenta=“A-101” nombre-cliente=“González”>
</impositor>
<impositor número-cuenta=“A-201” nombre-cliente=“González”>
</impositor>
<impositor número-cuenta=“A-102” nombre-cliente=“Hayes”>
</impositor>
</banco>

b DTD para el banco:


<!DOCTYPE banco [
<!ELEMENT cuenta >
<!ATTLIST cuenta
número-cuenta ID #REQUIRED
nombre-sucursal CDATA #REQUIRED
saldo CDATA #REQUIRED >
<!ELEMENT cliente >
<!ATTLIST cliente
nombre-cliente ID #REQUIRED
calle-cliente CDATA #REQUIRED
calle-cliente CDATA #REQUIRED >
<!ELEMENT impositor >
<!ATTLIST impositor
número-cuenta IDREF #REQUIRED
nombre-cliente IDREF #REQUIRED >
]>
10.2 Demuéstrese, mediante un DTD, cómo representar la relación anidada libros del Apartado 9.1,
empleando XML.

Respuesta:
<!DOCTYPE bib [
<!ELEMENT libro (título, autor+, editor, palabra clave+)>
<!ELEMENT editor (nombre-pub, sucursal-pub) >
<!ELEMENT título (#PCDATA )>
<!ELEMENT título ( #PCDATA )>
<!ELEMENT palabra-clave (#PCDATA )>
<!ELEMENT nombre-pub (#PCDATA )>
<!ELEMENT sucursal-pub (#PCDATA )>
]>

10.3 Se da la DTD, para una representación XML, del siguiente esquema relacional anidado

Emp = (nombree,ConjuntoHijos setof(Hijos), ConjuntoMaterias setof(Materias))


Hijos = (nombre, Cunpleaños)
Cumpleaños = (día, mes, año)
Materias = (tipo, ConjuntoExámenes setof(Exámenes))
Exámenes = (año, ciudad)

Respuesta:
<!DOCTYPE db [
<!ELEMENT emp ( nombree, hijos*, materias*)>
<!ELEMENT hijos (nombre, cumpleaños)>
<!ELEMENT cumpleaños (día, mes, año)>
<!ELEMENT materias (tipo, exámenes+)>
<!ELEMENT exámenes (año, ciudad)>
<!ELEMENT nombree (#PCDATA )>
<!ELEMENT nombre (#PCDATA )>
<!ELEMENT día (#PCDATA )>
<!ELEMENT mes (#PCDATA )>
<!ELEMENT año (#PCDATA )>
<!ELEMENT tipo (#PCDATA )>
<!ELEMENT ciudad (#PCDATA )>
]>

10.4 Escríbanse las siguientes consultas en XQuery, asumiendo la DTD del Ejercicio 10.3.
a. Encuéntrense los nombres de todos los empleados que tengan un hijo nacido en Marzo.
b. Encuéntrense los empleados que hicieron un examen del tipo de materia “mecanografía” en la ciudad
de “Madrid”.
c. Lístense todos los tipos de materias en Emp.

Respuesta:
a. Encuéntrense los nombres de todos los empleados que tengan un hijo nacido en Marzo.

for $e in /db/emp,
$m in distinct($e/hijos/cumpleaños/mes)
where $m = ’Marzo’
return $e/ nombree

b. Encuéntrense los empleados que hicieron un examen del tipo de materia “mecanografía” en la
ciudad de “Madrid”.

For $e in /db/emp
$s in $e/materias[tipo=’mecanografía’]
$examen in $s/exámenes
where $examen/ciudad= ’ Madrid’
return $e/ nombree

c. Encuéntrense los empleados que hicieron un examen del tipo de materia “mecanografía” en la
ciudad de “Madrid”.

for $t in distinct (/db/emp/materias/tipo)


return $e/enombre

10.5 Escríbanse las consultas en XSLT y XPath sobre la DTD del Ejercicio 10.3, para listar todos los
tipos de materia en Emp.

Respuesta:
a. XPath: /db/emp/materias/tipo
b. XSLT:
<xsl:template match=“/db/emp”>
<tiposmateria>
<xsl:apply-templates/>
<tiposmateria>
</xsl:template>
<xsl:template match=“/materias”>
<tiposmateria>
<xsl:value-of select=“tipo”/>
<tiposmateria>
</xsl:template>
<xsl:template match=“.”/>

10.6 Escríbase una consulta en XQuery en la representación XML de la Figura 10.1, para encontrar el
saldo total entre todas las cuentas en cada sucursal. (Sugerencia: Empléese una consulta anidada para obtener
el efecto de un SQL group by.)

Respuesta:

for $b in distinct (/banco/cuenta/nombre-sucursal)


return
<nombre-sucursal>
$b/text()
let $s := sum (/banco/cuenta[nombre-sucursal=$b]/saldo
return $s
</nombre-sucursal>

10.7 Escríbase una consulta en XQuery en la representación XML de la Figura 10.1, para calcular la
reunión externa por la izquierda de los elementos cliente con elementos cuenta. (Sugerencia: se puede usar
la cuantificación universal.)
Respuesta:
<lojoin>
for $b in /banco/cuenta,
$c in /banco/cliente,
$d in /banco/impositor
where $a/número-cuenta = $d/número-cuenta
and $c/nombre-cliente = $d/nombre-cliente
return <cuenta-cliente> $c $a </cuenta-cliente>
|
for $c in /banco/cliente,
where every $d in /banco/impositor satisfies
(not ($c/nombre-cliente=$d/nombre-cliente))
return <cuenta-cliente> $c </cuenta-cliente>
</lojoin>

10.8 Se da una consulta en XQuery para invertir el anidamiento de los datos del Ejercicio 10.2. Esto es, el
nivel más externo del anidamiento la salida debe tener los elementos correspondientes a los autores y cada
uno de estos elementos debe tener anidados con los correspondientes a todos los libros escritos por el autor.

Respuesta:
For $a in distinct (/bib/libro/autor)
return
<autor>
$a/text()
for $b in (/bib/libro/[autor=$a])
return
<libro>
$b/título
$b/editor
$b/palabra-clave
< \libro>
< \autor>

10.9 Se da la DTD para una representación XML de la información de la Figura 2.29. Crear un tipo de
elemento separado para representar cada relación, pero utilícense ID e IDREF para implantar claves primarias
y externas.

Respuesta: La respuesta se presenta en la Figura 10.1.

10.10 Escríbanse consultas en XSLT y XQuery que devuelvan los elementos cliente con los elementos
cuentas asociadas, anidados en los elementos cliente, dada la representación de la información bancaria
empleando ID e IDREFS en la Figura 10.8.
<!DOCTYPE librería [
<!ELEMENT cesta (contiene+, cesta-de)>
<!ATTLIST cesta
id-cesta ID #REQUIRED >
<!ELEMENT cliente (nombre, dirección, teléfono)>
<!ATTLIST cliente
email ID #REQUIRED >
<!ELEMENT libro (año, título, precio, escrito-por, publicado-por)>
<!ATTLIST libro
ISBN ID #REQUIRED >
<!ELEMENT almacén (dirección, teléfono, existencias)>
<!ATTLIST almacén
código ID #REQUIRED >
<!ELEMENT autor (nombre, dirección, URL)>
<!ATTLIST autor
idautor ID #REQUIRED >
<!ELEMENT editor (dirección, teléfono)>
<!ATTLIST editor
nombre ID #REQUIRED >
<!ELEMENT cesta-de >
<!ATTLIST cesta-de
propietario IDREF #REQUIRED >
<!ELEMENT contiene >
<!ATTLIST contiene
libro IDREF #REQUIRED >
número CDATA #REQUIRED >
<!ELEMENT existencias >
<!ATTLIST existencias
libro IDREF #REQUIRED >
número CDATA #REQUIRED >
<!ELEMENT escrito-por >
<!ATTLIST escrito-por
autores IDREFS #REQUIRED >
<!ELEMENT publicado-por >
<!ATTLIST publicado-por
editor IDREF #REQUIRED >
<!ELEMENT nombre (#PCDATA )>
<!ELEMENT dirección (#PCDATA )>
<!ELEMENT teléfono (#PCDATA )>
<!ELEMENT año (#PCDATA )>
<!ELEMENT título (#PCDATA )>
<!ELEMENT precio (#PCDATA )>
<!ELEMENT número (#PCDATA )>
<!ELEMENT URL (#PCDATA )>
]>
Figura 10.1 DTD del XML para Librería

Respuesta:
<banco-2>
for $c in /banco/cliente
return
<cliente>
$c/*
for $a in $c/id(@cuentas)
return $a
</cliente>
</banco-2>

10.11 Se da un esquema relacional para representar la información bibliográfica como se detalla en el


fragmento DTD de la Figura 10.13. El esquema relacional debe registrar el orden de los elementos autor. Se
puede asumir que sólo los libros y artículos aparecen como elementos de nivel superior en los documentos
XML.
Respuesta:
libro (id-libro, título, año, editor, lugar)
artículo (id-artículo, título, diario, año, número, volumen, páginas)
libro-autor (id-libro, nombre, apellido, orden)
artículo-autor (id-artículo, nombre, apellido, orden)

10.12 Considérese el Ejercicio 10.11 y supóngase que los autores también pueden aparecer como
elementos de nivel superior. ¿Qué cambio habría que realizar al esquema relacional?

Respuesta:
libro (id-libro, título, año, editor, lugar)
artículo (id-artículo, título, diario, año, número, volumen, páginas)
autor (nombre, apellido)
libro-autor (id-libro, nombre, apellido, orden)
artículo-autor (id-artículo, nombre, apellido, orden)

10.13 Escríbanse las consultas en XQuery del fragmento DTD de bibliografía de la Figura 10.13, para
realizar lo siguiente.
a. Encontrar todos los autores que hayan escrito un libro y un artículo en el mismo año.
b. Visualizar libros y artículos ordenados por año.
c. Visualizar libros con más de un autor.

Respuesta:
a. Encontrar todos los autores que hayan escrito un libro y un artículo en el mismo año.

for $a in distinct (/bib/libro/autor)


$y in /bib/libro[autor=$a]/año
$art in /bib/artículo[autor=$a and año=$y]
return $a

<!DOCTYPE bibliografía [
<!ELEMENT libro (título, autor+, año, editor, lugar?)>
<!ELEMENT artículo (título, autor+, diario, año, número, volumen, páginas?)>
<!ELEMENT autor ( apellido, nombre) >
<!ELEMENT título (#PCDATA )>
· · · similares declaraciones PCDATA por año, editor, lugar, diario, año,
número, volumen, páginas, apellido y nombre
]>
Figura 10.13 DTD para datos bibliográficos.

b. Visualizar libros y artículos ordenados por año.

for $a in ((/bib/libro) | (/bib/artículo))


return $a sortby(año)

c. Visualizar libros con más de un autor.

for $a in ((/bib/libro[autor/count()>1])
return $a
10.14 Muéstrese la representación en árbol de los datos XML de la Figura 10.1 y la representación del
árbol empleando relaciones nodos e hijo descritas en el Apartado 10.6.1.

Respuesta: La respuesta se presenta en la Figura 10.2.

10.15 Considérese la siguiente DTD recursiva.

<!DOCTYPE partes [
<!ELEMENT parte (nombre, informaciónsubpartes*)>
<!ELEMENT informaciónsubpartes (parte, cantidad)>
<!ELEMENT nombre (#PCDATA )>
<!ELEMENT cantidad (#PCDATA )>
] >

a. Se da un pequeño ejemplo de datos correspondientes a la DTD anterior.


b. Muéstrese como asociar este DTD a un esquema relacional. Se puede asumir que los nombres de
producto son únicos, es decir, cada vez que aparezca un producto, su estructura de componente será la misma.

Respuesta:
a. Se da un pequeño ejemplo de datos correspondientes a la DTD anterior.
La respuesta se presenta en la Figura 10.3.
b. Muéstrese como asociar este DTD a un esquema relacional.

parte(id-parte,nombre)
informaciónsubpartes(id-parte, id-subparte, cantidad)

Los atributos id-parte e id-subparte de informaciónsubpartes, son claves externas para parte.

nodos(1,elemento,banco,–)
nodos(2,elemento,cuenta,–)
nodos(3,elemento,cuenta,–)
nodos(4,elemento,cuenta,–)
nodos(5,elemento,cliente,–)
nodos(6,elemento,cliente,–)
nodos(7,elemento,impositor,–)
nodos(8,elemento,impositor,–)
nodos(9,elemento,impositor,–)
hijo(2,1) hijo(3,1) hijo(4,1)
hijo(5,1) hijo(6,1)
hijo(7,1) hijo(8,1) hijo(9,1)
nodos(10,elemento,número-cuenta,A-101)
nodos(11,elemento,nombre-sucursal,Centro)
nodos(12,elemento,saldo,500)
hijo(10,2) hijo(11,2) hijo(12,2)
nodos(13,elemento,número-cuenta,A-102)
nodos(14,elemento,nombre-sucursal,Navacerrada)
nodos(15,elemento,saldo,400)
hijo(13,3) hijo(14,3) hijo(15,3)
nodos(16,elemento,número-cuenta,A-201)
nodos(17,elemento,nombre-sucursal,Brighton)
nodos(18,elemento,saldo,900)
hijo(16,4) hijo(17,4) hijo(18,4)
nodos(19,elemento,nombre-cliente,González)
nodos(20,elemento,calle-cliente,Alma)
nodos(21,elemento,ciudad-cliente,Palo Alto)
hijo(19,5) hijo(20,5) hijo(21,5)
nodos(22,elemento,nombre-cliente,Hayes)
nodos(23,elemento,calle-cliente,Main)
nodos(24,elemento,ciudad-cliente,Harrison)
hijo(22,6) hijo(23,6) hijo(24,6)
nodos(25,elemento,número-cuenta,A-101)
nodos(26,elemento,nombre-cliente,González)
hijo(25,7) hijo(26,7)
nodos(27,elemento,número-cuenta,A-201)
nodos(28,elemento,nombre-cliente,González)
hijo(27,8) hijo(28,8)
nodos(29,elemento,número-cuenta,A-102)
nodos(30,elemento,nombre-cliente,Hayes)
hijo(29,9) hijo(30,9)

Figura 10.2 Representación relacional de datos XML como árboles


<partes>
<parte>
<nombre> bicicleta </nombre>
<informaciónsubpartes>
<parte>
<nombre> rueda </nombre>
<informaciónsubpartes>
<parte>
<nombre> rim </nombre>
</parte>
<cantidad> 1 </cantidad>
</informaciónsubpartes>
<informaciónsubpartes>
<parte>
<nombre> radios </nombre>
</parte>
<cantidad> 40 </cantidad>
</informaciónsubpartes>
<informaciónsubpartes>
<parte>
<nombre> neumático </nombre>
</parte>
<cantidad> 1 </cantidad>
</informaciónsubpartes>
</parte>
<cantidad> 2 </cantidad>
</informaciónsubpartes>
<informaciónsubpartes>
<parte>
<nombre> freno </nombre>
</parte>
<cantidad> 2 </cantidad>
</informaciónsubpartes>
<informaciónsubpartes>
<parte>
<nombre> marcha </nombre>
</parte>
<cantidad> 3 </cantidad>
</informaciónsubpartes>
<informaciónsubpartes>
<parte>
<nombre> bastidor </nombre>
</parte>
<cantidad> 1 </cantidad>
</informaciónsubpartes>
</parte>
</partes>

Figura 10.3 Ejemplo de datos de partes en XML


CAPITULO 11

ALMACENAMIENTO Y ESTRUCTURA DE ARCHIVOS

Este capítulo presenta los conceptos básicos de las estructuras de ficheros. El capítulo consta realmente de dos
partes –la primera se ocupa de las bases de datos relacionales y la segunda de las bases de datos orientadas a
objetos. La segunda parte se puede omitir, sin pérdida de continuidad para los capítulos siguientes.
Muchos diplomados en ciencias de la computación han cubierto algunas de las materias de este
capítulo en cursos anteriores, sobre estructuras de datos o de ficheros. Incluso si los conocimientos de los
estudiantes son principalmente sobre estructuras de datos, este capítulo es aún de importancia, dado que trata
cuestiones de las estructuras de datos como las referidas al almacenamiento en disco. Las cuestiones sobre la
gestión de la memoria intermedia, tratadas en el Apartado11.5.1, deberían resultar familiares a los estudiantes
que han realizado cursos de sistemas operativos. Sin embargo, hay aspectos de la gestión de la memoria
intermedia de determinadas bases de datos que hacen que esta sección valga la pena, incluso para los
estudiantes con conocimientos de sistemas operativos.

Cambios a la tercera edición:

La discusión de los medios de almacenamiento, en particular los discos magnéticos (Apartado 11.2), se ha
actualizado para reflejar la tecnología actual. La sección de las estructuras RAID (Apartado 11.3) se ha
mejorado con ejemplos; la comparación de los niveles RAID se ha modificado, dado que las mejoras en la
capacidad de las unidades de discos han disminuido las ventajas del RAID 5; Se ha ampliado la cobertura de
los diccionarios de datos.
Ejercicios

11.1 Indíquense los medios de almacenamiento físico disponibles en las computadoras que se utilizan
habitualmente.
Se da la velocidad con la que se puede tener acceso a los datos en cada medio.

Respuesta: La respuesta estará basada en las computadoras y medios de almacenamiento empleados.


Ejemplos típicos serían las unidades de disco duro, disquetes y cd-rom.

11.2 ¿Cómo afecta la reasignación de los sectores dañados por los controladores de disco, a la velocidad
de recuperación de los datos?

Respuesta: La reasignación de los sectores dañados por los controladores de disco reduce la velocidad de
recuperación de los datos, debido a la la pérdida de secuencialidad entre los sectores. Pero eso es mejor que la
pérdida de datos, en el caso de no reasignar.

11.3 Considérese la siguiente disposición de los bloques de datos y de paridad de cuatro discos:

Disco 1 Disco 2 Disco 3 Disco 4


B1 B2 B3 B4
P1 B5 B6 B7
B8 P2 B9 B 10
. . . .
. . . .
. . . .

Bi representa los bloques de datos; Pi los bloques de paridad. El bloque de paridad Pi, es el bloque de paridad
para los bloques de datos B4i-3 a B4i. ¿Qué, de haber alguno, problemas podría presentar esta disposición?

Respuesta: Esta disposición tiene el problema de que Pi y B4i-3 están en el mismo disco. Por lo que, si el
disco falla, la reconstrucción de B4i-3 es imposible, dado que se pierden tanto datos como paridad.

11.4 Un fallo en el suministro eléctrico que se produzca mientras se escribe un bloque del disco, puede
dar lugar a que el bloque sólo se escriba parcialmente. Supóngase que se pueden detectar los bloques escritos
parcialmente. Un proceso atómico de escritura de bloque es aquél en el que se escribe el bloque entero o no se
escribe nada (es decir, no hay procesos de escrituras parciales). Propónganse esquemas para conseguir el
efecto de los procesos atómicos de escritura con los siguientes esquemas RAID.
Los esquemas deben implicar procesos de recuperación de fallos.
a. RAID de nivel 1 (creación de imágenes)
b. RAID de nivel 5 (entrelazado de bloques, paridad distribuida)

Respuesta:
a. Para asegurar la atomicidad, una operación de escritura de bloques se lleva a cabo como sigue:
i. Escríbase la información sobre el primer bloque físico.
ii. Cuando se complete con éxito la primera escritura, escríbase la misma información sobre el segundo
bloque físico.
iii El resultado se da por finalizado sólo después que la segunda escritura se complete con éxito.
Durante la recuperación se examina cada par de bloques físicos. Si ambos son idénticos y no se
detectan escrituras parciales, no son necesarias acciones posteriores. Si uno de los bloque ha sido reescrito
parcialmente, se reemplaza su contenido con el del otro bloque. Si no hay escrituras parciales, pero difieren en
el contenido, se reemplaza el contenido del primer bloque con el del segundo, o viceversa. Este procedimiento
de recuperación asegura que un almacenamiento estable tiene un éxito completo (esto es, actualiza ambas
copias), o no cambia nada.
El requerimiento de comparar cada correspondiente par de bloques durante la recuperación es
costoso. Se puede reducir enormemente el coste siguiendo la pista de las escrituras de bloques que están en
curso, empleando una pequeña cantidad de RAM no volátil. En la recuperación, sólo es necesario comparar
los bloques para los que está teniendo lugar la escritura.

b. La idea es similar aquí. Para cualquier escritura de bloques, el bloque de información se escribe
primero, seguido del correspondiente bloque de paridad. En el momento de la recuperación, se considera cada
conjunto formado por el enésimo bloque de cada uno de los discos. Si ninguno de los bloques del conjunto ha
sido escrito parcialmente y el contenido del bloque de paridad es consistente con el de los bloques de
información, entonces no es necesario tomar más acciones. Si cualquier bloque ha sido escrito parcialmente,
se reconstruyen sus contenidos empleando los otros bloques. Si ningún bloque ha sido escrito parcialmente,
pero el contenido del bloque de paridad no está de acuerdo con el del bloque de información, se reconstruye el
contenido del bloque de paridad.

11.5 Los sistemas RAID suelen permitir la sustitución de los discos averiados sin que se impida el acceso
al sistema. Así, los datos del disco averiado deben reconstruirse y escribirse en el disco de repuesto, mientras
el sistema se halla en funcionamiento. ¿Con cuál de los niveles RAID es menor la interferencia entre los
accesos al disco reconstruido y los accesos al resto de los discos? Justifíquese la respuesta.

Respuesta: El RAID de nivel 1 (creación de imágenes) es el que facilita la reconstrucción de un disco


averiado con un mínimo de interferencias sobre los accesos al disco. Esto es así porque la reconstrucción
implica la copia de datos desde la imagen del disco averiado. En los otros niveles RAID, la reconstrucción
implica lecturas de todo el contenido de los otros discos.

11.6 Se da un ejemplo de una expresión de álgebra relacional y de una estrategia de procesamiento de


consultas en cada una de las situaciones siguientes:
a. MRU es preferible a LRU.
b. LRU es preferible a MRU.

Respuesta:
a. MRU es preferible a LRU, donde R1 R2 se calcula empleando una estrategia de procesamiento de
1

bucles anidados, donde cada tupla en R2 debe compararse con cada bloque en R1. Después que se procesa la
primera tupla de R2, el siguiente bloque necesario es el primero en R1. Sin embargo, dado que es el último
recientemente empleado, la estrategia de gestión de la memoria intermedia LRU reemplazaría ese bloque si el
sistema necesitara uno nuevo.

b. LRU es preferible a MRU donde R1 R2 se calcula ordenando las relaciones por valores de reunión y
1

comparando, entonces, los valores mediante procedimientos a través de las relaciones. Debido a los valores de
reuniones duplicadas, puede ser necesario hacer copia de seguridad en una de las relaciones. Esta copia de
seguridad podría atravesar un límite de bloque, hacia el bloque más recientemente empleado, el cual se habría
sido reemplazado por un sistema empleando gestión de memoria intermedia MRU, si fuera necesario un
nuevo bloque.
Bajo MRU algunos bloque no usados pueden permanecer en memoria para siempre. En la práctica
sólo se puede emplear MRU en situaciones especiales, como la de la estrategia de bucle anidado discutida en
el ejemplo 0.a.
11.7 Considérese el borrado del registro 5 del archivo de la Figura 11.8. Compárense las ventajas relativas
de las siguientes técnicas para implementar el borrado:
a. Trasladar el registro 6 al espacio ocupado por el registro 5 y desplazar el registro 7 al espacio
ocupado por el registro 6.
b. Trasladar el registro 7 al espacio ocupado por el registro 5.
c. Marcar el registro 5 como borrado y no desplazar ningún registro.

Respuesta:
a. Aunque trasladar el registro 6 al espacio del 5 y el registro 7 al espacio del 6 es el enfoque mas
sencillo, requiere trasladar casi todos los registros e implica casi todos los accesos.

b. Trasladar el registro 7 al espacio del 5 mueve menos registros, pero destruye cualquier orden en el
fichero.

c. Marcando el espacio del registro 5 como borrado se conserva el orden y no se traslada ningún
registro, pero se requieren costes adicionales para seguir la pista de todos los espacios libres del fichero. Este
método puede originar demasiados “agujeros” en el fichero el cual, si no se compacta periódicamente, puede
afectar al rendimiento debido a que se reduce la disponibilidad de registros libres contiguos.

11.8 Muéstrese la estructura del archivo de la Figura 11,9 después de cada uno de los pasos siguientes:
a. Insertar (Galapagar, C-323, 1600).
b. Borrar el registro 2.
c. Insertar (Galapagar, C-626, 2000).

Respuesta: (Se emplea “h i” para denotar un puntero al registro “i”.)


El fichero original de la Figura 11.9:

cabecera h1
registro 0 Navacerrada C-102 400
registro 1 h4
registro 2 Becerril C-215 700
registro 3 Centro C-101 500
registro 4 h6
registro 5 Navacerrada C-201 900
registro 6
registro 7 Centro C-110 600
registro 8 Navacerrada C-218 700

a. El fichero después de insertar (Galapagar, C-323, 1600).

cabecera h4
registro 0 Navacerrada C-102 400
registro 1 Galapagar C-323 1600
registro 2 Becerril C-215 700
registro 3 Centro C-101 500
registro 4 h6
registro 5 Navacerrada C-201 900
registro 6
registro 7 Centro C-110 600
registro 8 Navacerrada C-218 700

b El fichero después de borrar el registro 2.


cabecera h2
registro 0 Navacerrada C-102 400
registro 1 Galapagar C-323 1600
registro 2 h4
registro 3 Centro C-101 500
registro 4 h6
registro 5 Navacerrada C-201 900
registro 6
registro 7 Centro C-110 600
registro 8 Navacerrada C-218 700

La cadena de registro libre podría haber sido alternativamente desde la cabecera a 4, desde 4 a 2 y,
finalmente, desde 2 a 6.
c. El fichero después de insertar (Galapagar, C-626, 2000).

Cabecera h4
registro 0 Navacerrada C-102 400
registro 1 Galapagar C-323 1600
registro 2 Galapagar C-626 2000
registro 3 Centro C-101 500
registro 4 h6
registro 5 Navacerrada C-201 900
registro 6
registro 7 Centro C-110 600
registro 8 Navacerrada C-218 700

11.9 Dándose un ejemplo de una aplicación de bases de datos en que sea preferible el método del espacio
reservado para la representación de los registros de longitud variable, frente al método de los punteros.
Justifíquese la respuesta.

Respuesta: En el método del espacio reservado una consulta, comparando el último campo existente en un
registro con algún valor, requiere sólo una lectura desde el disco. Esta simple lectura es preferible a las,
potencialmente, numerosas lecturas que son necesarias para perseguir los punteros al último campo, si se
emplea el método del puntero.

11.10 Se da un ejemplo de una aplicación de bases de datos en que sea preferible el método de los punteros
para representar los registros de longitud variable, al método del espacio reservado.
Justifíquese la respuesta.

Respuesta: Empleando el método de los punteros, una operación de reunión sobre atributos que están
solamente en el bloque ancla, puede realizarse sólo sobre esta pequeña cantidad de datos, en vez de la relación
entera, como sería el caso de emplear el método de reserva de espacio. Por eso, en este ejemplo, es preferible
el método del puntero.

11.11 Muéstrese la estructura del archivo de la Figura 11,12 después de cada uno de los pasos siguientes:
a. Insertar (Becerril, C-101, 2800).
b. Insertar (Galapagar, C-323, 1600).
c. Borrar (Navacerrada, C-102, 400).
Respuesta:
a. insertar (Becerril, C-101, 2800) cambia el registro 2 a:
Becerril C-215 700 C-101 2800 ^ ^

b insertar (Galapagar, C-323, 1600) cambia el registro 5 a:


Galapagar C-216 750 C-323 1600 ^ ^

c. borrar (Navacerrada, C-102, 400) cambia ek registro 0 a:

Navacerrada C-102 900 C-218 700 ^ ^

11.12 ¿Qué ocurre si se intenta insertar el registro

(Navacerrada, C-323, 3000)

en el fichero de la Figura 11.12?

Respuesta: Inserta (Navacerrada, C-323, 3000) en el fichero de la Figura 11.12 causa un error porque el
registro Navacerrada ha superado la longitud máxima reservada.

11.13 Muéstrese la estructura del archivo de la Figura 11.13 después de cada uno de los pasos siguientes:
a. Insertar (Becerril, C-101, 560.000).
b. Insertar (Galapagar, C-323, 320.000).
c. Borrar (Navacerrada, C-102, 80.000).

Respuesta:
a. La figura después de insertar (Becerril, C-101, 2800).

0 h5 Navacerrada C-102 400


1 Collado Mediano C-305 350
2 h9 Becerril C-215 700
3 h7 Centro C-101 500
4 Moralzarzal C-222 700
5 h8 C-201 900
6 Galapagar C-216 750
7 C-110 600
8 C-218 700
9 C-101 2800

b La figura después de insertar (Galapagar, C-323, 1600).

0 h5 Navacerrada C-102 400


1 Collado Mediano C-305 350
2 h9 Becerril C-215 700
3 h7 Centro C-101 500
4 Moralzarzal C-222 700
5 h8 C-201 900
6 h 10 Galapagar C-216 750
7 C-110 600
8 C-218 700
9 C-101 2800
10 C-323 1600
c. La figura después de borrar (Navacerrada, C-102, 400).

1 Collado Mediano C-305 350


2 h9 Becerril C-215 700
3 h7 Centro C-101 500
4 Moralzarzal C-222 700
5 h8 Navacerrada C-201 900
6 h 10 Galapagar C-216 750
7 C-110 600
8 C-218 700
9 C-101 2800
10 C-323 1600

11.14 Explíquese por qué la asignación de los registros a los bloques afecta de manera significativa al
rendimiento de los sistemas de bases de datos.

Respuesta: Si se asignan registros relacionados a los bloques, a menudo se puede recuperar la mayoría, o
todos, de los registros solicitados por una consulta con un acceso a disco. Los accesos a disco tienden a ser los
cuellos de botella en las bases de datos; dado que esta estrategia de asignación reduce el número de accesos a
disco para una operación dada, mejora significativamente el rendimiento.

11.15 Si es posible, determínese la estrategia de gestión de la memoria intermedia de su sistema operativo


ejecutándose en su computadora y los mecanismos que proporciona para controlar la sustitución de páginas.
Discútase cómo el control sobre la sustitución que proporciona podría ser útil para la implementación de
sistemas de bases de datos.

Respuesta: El sistema operativo típico emplea LRU para la sustitución de la memoria intermedia. A menudo
esta es una mala estrategia para las bases de datos. Como se ha explicado en el Apartado 11.5.2 del texto,
MRU es la mejor estrategia para reuniones en bucle anidado. En general ninguna estrategia sencilla gestiona
bien todos los escenarios e, idealmente, el sistema de base de datos debería tener su propia caché de memoria
intermedia, para la que la política de sustitución tiene en cuenta todas las cuestiones relacionadas con el
rendimiento.

11.16 En la organización secuencial de los archivos, ¿por qué se utiliza un bloque de desbordamiento
aunque sólo haya en ese momento un registro de desbordamiento?

Respuesta: Un bloque de desbordamiento se utiliza en la organización secuencial de los archivos porque un


bloque es el espacio más pequeño que se puede leer desde un disco. Por lo tanto, emplear cualquier región
más pequeña no sería útil desde un punto de vista del rendimiento. El espacio ahorrado al asignar el
almacenamiento en disco en unidades de registros, sería ensombrecido por el coste de rendimiento de permitir
bloques que contengan registros de múltiples ficheros.

11.17 Indíquense dos ventajas y dos inconvenientes de cada una de las estrategias siguientes para el
almacenamiento de una base de datos relacional.
a. Almacenar cada relación en un archivo.
b. Almacenar varias relaciones (quizá incluso toda la base de datos) en un archivo.

Respuesta:
a. Las ventajas de almacenar cada relación como un archivo incluyen emplear el sistema de ficheros
que soporta el sistema operativo, simplificando el sistema gestor de la base de datos, pero incurre en la
desventaja de restringir la capacidad del sistema gestor de base de datos para incrementar el rendimiento, por
usar estructuras de almacenamiento más sofisticadas.
b. Utilizando un fichero para toda la base de datos se pueden implementar estas estructuras complejas
a través del sistema gestor de las base de datos, pero se incrementa el tamaño y la complejidad de la base de
datos.

11.18 Considérese una base de datos relacional con dos relaciones:

curso (nombre-curso, aula, profesor)


matrícula (nombre-curso, nombre-estudiante, calificación)

Defínanse ejemplos de estas relaciones para tres cursos, en cada uno de los cuales se matriculan cinco
estudiantes. Se da una estructura de archivos de estas relaciones que utilice la agrupación.

Respuesta:

relación curso
nombre-curso aula profesor
Pascal CS-101 Calvin, B c1
C CS-102 Calvin, B c2
LISP CS-102 Kess, J c3

relación matrícula
nombre-curso nombre-estudiante calificación
Pascal Carper, D A e1
Pascal Merrick, L A e2
Pascal Mitchell, N B e3
Pascal Bliss, A C e4
Pascal Hames, G C e5
C Nile, M A e6
C Mitchell, N B e7
C Carper, D A e8
C Hurly, I B e9
C Hames, G A e10
Lisp Bliss, A C e11
Lisp Hurly, I B e12
Lisp Nile, M D e13
Lisp Stars, R A e14
Lisp Carper, D A e15

el bloque 0 contiene: c1, e1, e2, e3, e4, y e5


el bloque 1 contiene: c2, e6, e7, e8, e9 y e10
el bloque 2 contiene: c3, e11, e12, e13, e14, y e15

11.19 Considérese la siguiente técnica de mapa de bits para realizar el seguimiento del espacio libre en un
fichero. Por cada bloque del fichero se mantienen dos bits en el mapa. Si el bloque está lleno entre el 0 y el
30%, los bits son 00, entre 30% y 60% , 01, entre 60% y 90%, 10 y por encima del 90%, 11. Tales mapas de
bits pueden mantenerse en memoria, incluso para ficheros muy grandes.
a. Descríbase como mantener actualizado el mapa de bits al insertar y eliminar registros.
b. Descríbanse el beneficio de la técnica de los mapas de bits sobre las listas libres, al buscar espacio
libre y al actualizar su información.

Respuesta:
a. Cada vez que se inserta o borra un registro, comprueba si el empleo el bloque ha cambiado los
niveles. En tal caso, se actualizan los bits correspondientes.

b. Si se requiere espacio libre para n registros entonces, en la técnica de las listas libres, son necesarios
n accesos de la lista de registros libres. Sin embargo, en la técnica del mapa de bits, un bloque con espacio
libre para n registros ( o más de un bloque si hace falta) se puede averiguar directamente. El espacio libre así
obtenido está también mas contiguo que el obtenido mediante la técnica de listas libres.

11.20 Se da una versión normalizada de la relación Metadatos-índices y explíquese por qué al usar la
versión normalizada se incurriría en pérdida de rendimiento.

Respuesta: La relación metadatos-índices se puede normalizar como sigue

metadatos-índices (nombre-índice, nombre-relación, tipo-índice, conjunto-atributos)


metadatos-conjunto-atributos (nombre-relación, conjunto-atributos, nombre-atributo)

Aunque la versión normalizada tendrá menos requerimientos de espacio, serán necesarios accesos extras al
disco para leer metadatos-conjunto de atributos, cada vez que tenga que accederse a un índice. Así, esto
ocasionará una pérdida de rendimiento.

11.21 Explíquese el motivo de que un IDO físico deba contener más información que un puntero que
apunte a una ubicación física de almacenamiento.

Respuesta: Un IDO físico necesita tener un identificador único, además de un puntero, para una ubicación
física de almacenamiento. Esto se requiere para prevenir desreferencias de los punteros colgantes.

11.22 Si se utilizan IDOs físicos, se puede reubicar un objeto guardando un puntero a su nueva ubicación.
En el caso de que se guarden varios punteros para un objeto, ¿Cuál sería el efecto sobre la velocidad de
recuperación? Respuesta: En caso de guardar varios punteros para un objeto, la velocidad de recuperación
decrecerá porque el acceso requerirá acceder a las series de ubicaciones desde las que el objeto ha sido
sucesivamente enviado a la ubicación actual.
Se pueden evitar accesos múltiples manteniendo siempre, en la ubicación más antigua, la última
dirección del objeto. Esto se puede hacer comprobando, al enviar, si este objeto ya ha sido enviado y ,en ese
caso ,actualizando la dirección de envío a la ubicación más antigua. Así, a lo sumo se requerirán dos accesos.

11.23 Defínase el término puntero colgante. Descríbase la manera en que el esquema de identificador
único ayuda a detectar los punteros colgantes en las bases de datos orientadas a objetos.

Respuesta: Un puntero colgante es un puntero a un área que ya no contiene datos válidos.


En el esquema de identificador único para detectar punteros colgantes, los IDOs físicos pueden
contener un identificador único, que es un entero que distingue el IDO de los identificadores de otros objetos
que resultaron ser al almacenados en la misma ubicación anterior y fueron borrados o movidos a otra parte. El
identificador único se almacena también con el objeto, debiendo concordar los identificadores en un IDO con
los correspondientes objetos. Si el identificador único en un IDO físico no concuerda con el identificador
único en el objeto al cual apunta el IDO, el sistema detecta que el puntero es un puntero colgante y señala un
error.

11.24 Considérese el ejemplo de la página 435, que muestra que no hace falta el rescate si se emplea el
rescate hardware. Explíquese el motivo de que, en ese ejemplo, resulte seguro cambiar el identificador corto
de la página 679.34278 desde 2395 a 5001. ¿Puede tener ya alguna otra página el identificador corto 5001?. Si
fuera así, ¿cómo se resolvería esa situación?
Respuesta: Al rescatar, si el identificador corto de la página 679.34278 cambia de 2395 a 5001, es porque
a. el sistema descubre que 679.34278 ya ha sido asignado a la página de memoria virtual 5001 en
algún paso anterior, o si no
b. 679.34278 no ha sido asignado en ninguna página de memoria virtual hasta ahora y la página de
memoria virtual 5001 se asigna ahora a ella.

Así, en cualquier caso, no puede ser cierto que la página actual ya utilice el mismo identificador corto 5001,
para referirse a alguna otra página de la base de datos diferente de 679.34278. Alguna otra página puede usar
5001 para referirse a una página de base de datos diferente, pero entonces cada página tiene sus propias
correspondencias independiente, desde identificadores de página cortos a completos, para que esto sea
correcto.
Nótese que si se rescata como se describe en el texto y diferentes procesos necesitan acceder
simultáneamente a la página de la base de datos, habrán de asociar copias separadas de la página para sus
espacios individuales de dirección virtual. Esto puede evitarse mediante extensiones al esquema.
CAPITULO 12

INDEXACION Y ASOCIACION

Este capítulo cubre las técnicas de indexación, desde la más básica a las altamente especializadas. Debido al
empleo extensivo de índices en los sistemas de bases de datos, este capítulo constituye una parte importante
del curso de bases de datos.
Una clase que ya haya tenido un curso sobre estructuras de datos estará familiarizada con asociaciones y,
posiblemente, incluso con árboles B+. Sin embargo, este capítulo es de necesaria lectura, incluso para estos
estudiantes, dado que los cursos de estructuras de datos generalmente cubren las indexaciones en memoria
principal. Aunque los conceptos afectan a los métodos de acceso a las bases de datos, los detalles (por
ejemplo, nodos de tamaño bloque), les resultarán nuevos a tales estudiantes.
Los apartados sobre los árboles B (Apartados 12.4), ficheros en retícula (Apartado 12.9.3) e indexaciones de
mapas de bit (Apartado 12.9.4) se pueden omitir si así se desea.

Cambios a la tercera edición:

La descripción de consultas sobre árboles B+ se ha ampliado con seudocódigo. Se ha simplificado el


seudocódigo para la inserción en árboles B+. La sección sobre la definición de índices en SQL (Apartado
12.8) es nueva en esta edición, así como el tratamiento de índices de mapas de bits (Apartado 12.9.4).
Ejercicios

12.1 ¿Cuándo es preferible utilizar un índice denso en vez de uno disperso? Razónese la respuesta.

Respuesta: Es preferible utilizar un índice denso en lugar de uno disperso cuando el fichero no está ordenado
sobre el campo índice (como cuando el índice es un índice secundario), o cuando el fichero de índices es
pequeño, comparado con el tamaño de la memoria.

12.2 Dado que los índices agilizan el procesamiento de consultas, ¿por qué no deberían de mantenerse en
varias claves de búsqueda? Enumérense tantas razones como sea posible.

Respuesta: Razones para no mantener varios índices de búsqueda:


a. Durante las inserciones y los borrados, cada índice requiere tiempo adicional de CPU y sobrecarga
de E/S a disco.
b. Los índices sobre claves que no son primarias podrían tener que ser cambiados o actualizados,
aunque no así en los índices sobre la clave primaria (esto es porque las actualizaciones, generalmente, no
modifican los atributos de la clave primaria).
c. Cada índice extra requiere espacio de almacenamiento adicional.
d. Para las consultas que implican condiciones sobre varias claves de búsqueda la eficiencia podría no
ser mala, incluso si sólo algunas de las claves tienen índices sobre ellas.
Por tanto, cuando ya existen muchos índices, el rendimiento de la base de datos mejora menos por la adición
de índices.

12.3 ¿Cuál es la diferencia entre un índice primario y un índice secundario?

Respuesta: El índice primario está sobre el campo que especifica el orden secuencial del fichero. Sólo puede
haber un índice primario, mientras que puede haber muchos secundarios.

12.4 ¿Es posible, en general, tener dos índices primarios en la misma relación para dos claves de
búsqueda diferentes? Razónese la respuesta.

Respuesta: En general, no es posible tener dos índices primarios en la misma relación para diferentes claves,
porque las tuplas en una relación habrían de estar almacenadas en diferente orden, para tener los mismos
valores almacenados juntos. Se podría cumplir esto almacenando la relación dos veces y duplicando todos los
valores pero, para un sistema centralizado, no es eficiente.

12.5 Constrúyase un árbol B+ con el siguiente conjunto de valores de la clave:

(2, 3, 5, 7, 11, 17, 19, 23, 29, 31)

Supóngase que el árbol está inicialmente vacío y que se añaden los valores en orden ascendente. Constrúyanse
árboles B+ para los casos en que el número de punteros que caben en un nodo son:
a. Cuatro
b. Seis
c. Ocho
Respuesta: Lo siguiente ha sido generado al insertar valores en el árbol B+ en orden ascendente. Un nodo
(diferente del raíz) nunca fue permitido tener menos de én/2ù valores/punteros.
a.

2 3 5 7 29 31 17
29
11 19 23
19
5 11

b.

19 31 29 23 17 11 7 5 3 2
19 7

c.

11 3 2
11

Para cada árbol B+ del Ejercicio 12.5, muéstrense los pasos involucrados en las siguientes consultas:
5 7 17 19 23 29 31

12.6
a. Encontrar los registros con un valor de la clave de búsqueda de 11.
b. Encontrar registros con un valor de la clave de búsqueda entre 7 y 17, ambos inclusive.

Respuesta:

Con estructura 0.a:


a. Encontrar registros con un valor de 11
i. Buscar el índice de primer nivel; seguir el primer puntero.
ii. Buscar el siguiente nivel; seguir el tercer puntero.
iii Buscar el nodo hoja; seguir el primer puntero para registros con valor de clave 11.

b. Encontrar registros con valor entre 7 y 17 (inclusive)


i. Buscar el índice superior; seguir el primer puntero.
ii. Buscar el siguiente nivel; seguir el segundo puntero.
iii Buscar el tercer nivel; seguir el segundo puntero para registros con valor de clave 7 y, después de
acceder a ellos, volver al nodo hoja.
iv Seguir el cuarto puntero para el siguiente bloque de hojas en la cadena.
v Seguir el primer puntero para registros con valor de clave 11, después volver.
vi Seguir el segundo puntero para registros con valor de clave 17.

Con estructura 0.b:


a. Encontrar registros con un valor de 11
i. Buscar el nivel superior; seguir el segundo puntero.
ii. Buscar el siguiente nivel; seguir el segundo puntero para registros con valor de clave 11.

b. Encontrar registros con valor entre 7 y 17 (inclusive)


i. Buscar el nivel superior; seguir el segundo puntero.
ii. Buscar el siguiente nivel; seguir el primer puntero para registros con valor de clave 7, después
volver.
iii Seguir el segundo puntero para registros con valor de clave 11, después volver.
iv Seguir el tercer puntero para registros con valor de clave 17.
Con estructura 0.c:
a. Encontrar registros con un valor de 11
i. Buscar el nivel superior; seguir el segundo puntero.
ii. Buscar el siguiente nivel; seguir el primer puntero para registros con valor de clave 11.

b. Encontrar registros con valor entre 7 y 17 (inclusive)


i. Buscar el nivel superior; seguir el primer puntero.
ii. Buscar el siguiente nivel; seguir el cuarto puntero para registros con valor de clave 7, después
volver.
iii Seguir el octavo puntero para el siguiente bloque de hojas en la cadena.
iv Seguir el primer puntero para registros con valor de clave 11, después volver.
v Seguir el segundo puntero para registros con valor de clave 17.

12.7 Para cada árbol B+ del Ejercicio 12.5, muéstrese el aspecto del árbol después de cada una de las
siguientes operaciones:
a. Insertar 9.
b. Insertar 10.
c. Insertar 8.
d. Borrar 23.
e. Borrar 19.

Respuesta:
• Con estructura 0.a:
Insertar 9:

2 3 5 7 29 31 17
29
11 19 23
19
5 11
9

9
9
Insertar 10:
10 2 3
29
19
5 11
5 7 17 11 19 23 29 31

89
9
Insertar 8:
10 2 3
29
19
5 11
5 7 17 11 19 23 29 31

9 19 10 8
9
Borrar 23:
11
2 3 5 7 29 31 17 11
19 5
Borrar 19:

29
29
9 10 8
9
11
2 3 5 7 31 17 11
5

• Con estructura 0.b:


9 19 31 29 23 17 11 7 5 3 2
19 7
Insertar 9:

10 9 19 31 29 23 17 11 7 5 3 2
19 7
Insertar 10:

8 5 3 2 9 7 10 17 11 19 31 29 23
19 7 10
Insertar 8:

8 5 3 2 9 7 10 17 11 19 31 29
19 7 10
Borrar 23:

Borrar 19:

7 10
8 5 3 2 9 7 10 17 11 31 29

• Con estructura 0.c:


9 17 3 2 11
11
Insertar 9:
5 7 19 23 29 31

10 9 17 3 2 11
11
Insertar 10:
5 7 19 23 29 31

8 10 9 17 3 2 11
11
Insertar 8:
5 7 19 23 29 31

Borrar 23:
8 10 9 17 3 2 11
11
5 7 19 29 31
Borrar 19:

8 10 9 17 3 2 11
11
5 7 29 31

12.8 Considérese el esquema modificado de redistribución para árboles B+ descrito en la página 463.
¿Cuál es la altura esperada del árbol en función de n?.

Respuesta: Si hay K valores de claves de búsqueda y m - 1 hermanos están implicados en la redistribución, la


altura esperada del árbol es: log?(m-1)n/m?(K)

12.9 Repítase el Ejercicio 12.5 para un árbol B.

Respuesta: El algoritmo para la inserción en un árbol B es:


Localizar el nodo hoja en el que el nuevo par clave-puntero se debería insertar.
Si hay espacio sobrante en el nodo hoja, realizar la inserción en la ubicación correcta y la tarea se completa.
De lo contrario, insertar el par clave-puntero conceptualmente en la ubicación correcta del nodo hoja y,
entonces, partirlo por la mitad.
El par intermedio clave-puntero no va dentro de los nodos resultantes de la operación dividir. En su lugar, se
inserta en el nodo padre junto al puntero del árbol para el nuevo hijo. Si no hay espacio en el padre, se repite
un procedimiento similar.
El algoritmo de borrado es:
Localizar el valor el valor de la clave a borrar, en el árbol B.

a. Si se encuentra un nodo hoja, borrar el par clave-puntero y el registro del fichero. Si el nodo hoja
contiene menos de én/2ù -1 entradas como resultado de este borrado, o se fusiona con sus hermanos o algunas
entradas se redistribuyen para ello. La fusión implicaría un borrado, mientras que la redistribución implicaría
cambios en las entradas del nodo del padre. Los borrados pueden rizarse hasta la raíz del árbol B.

b. Si el valor de la clave se encuentra en un nodo interno del árbol B reemplazar, a él y a su puntero de


registro, por el menor valor de la clave en el sub árbol inmediatamente a su derecha y el correspondiente
puntero del registro. Borrar el registro actual en el fichero de la base de datos. Borrar después el menor valor
del par clave-puntero del sub árbol. Este borrado pueden originar aún más borrados de rizamiento hasta la raíz
del árbol B.

Seguidamente se presentan los árboles B después de las inserciones de los valores clave dados. Se supone que
los nodos hoja y no hoja mantienen el mismo número de valores de clave de búsqueda.
a.
????
??
???
?
_ _ _ _ _ _ _9
_

Z
ZXXXz
5

17
11 19
29
b.
_
_
_
_
__
XXXXXXXXXXz
?
?
?
7 23

17
?
19
?
31
?
29
?
11
?
5
?
3
?
2
?

c.

12.10 Explíquense las diferencias entre las asociaciones abiertas y cerradas. Coméntense los beneficios de
cada técnica en aplicaciones de bases de datos.

Respuesta: Las asociaciones abiertas pueden colocar claves con el mismo valor de la función asociativa en
diferentes cajones. Las asociaciones cerradas siempre colocan tales claves juntas, en el mismo cajón. Así, en
este caso, diferentes cajones pueden ser de diferentes tamaños, aunque la implementación pueda ser
enlazando los cajones de tamaño fijo, empleando cadenas de desbordamiento. El borrado es difícil con
asociaciones abiertas dado que todos los cajones pueden tener que ser inspeccionados antes de poder constatar
que un valor clave ha sido borrado, mientras que en las asociaciones cerradas sólo los cajones cuya dirección
se obtiene por asociación, el valor clave necesita ser inspeccionado. Los borrados son más comunes en las
bases de datos y por lo tanto una asociación cerrada es más apropiada para ellas. Para un pequeño, estático
conjunto de datos, las búsquedas pueden ser más eficientes empleando asociaciones abiertas. La tabla de
símbolos de un compilador sería un buen ejemplo.

12.11 ¿Cuáles son las causas del desbordamiento de cajones en un fichero con una organización
asociativa? ¿Qué se puede hacer para reducir la aparición del desbordamiento de cajones?

Respuesta: Las causas del desbordamiento de cajones son:


a. Nuestra estimación del número de registros que la relación iba a tener fue demasiado bajo y, por la
tanto, el número de cajones asignados no fue suficiente.

b. Desviación en la distribución de registros a los cajones. Esto puede suceder porque haya muhos
registros con el mismo valor de clave de búsqueda, o porque la función de asociación elegida no tuviera las
propiedades deseables de uniformidad y aleatoriedad.

Para reducir la ocurrencia de los desbordamientos se puede:

a. Seleccionar la función de asociación más cuidadosamente y hacer mejores estimaciones sobre el


tamaño de la relación.
b. Si el tamaño estimado de la relación es nr y el número de registros por bloque es fr, asignar (nr/fr) *
(1 + d) cajones, en lugar de (nr/fr). Aquí d es un factor de escape, típicamente en torno a 0’2. Algún espacio se
malgasta: En torno al 20% del espacio de los cajones estará vacío. Pero la ventaja es que algunas de las
desviaciones se gestionan y la probabilidad de desbordamiento se reduce.

12.12 Supóngase que se está empleando la asociación extensible en un archivo que contiene registros con
los siguientes valores de la clave de búsqueda:

2, 3, 5, 7, 11, 17, 19, 23, 29, 31

Muéstrese la estructura asociativa extensible para este archivo si la función de asociación es h(x) = x mod 8 y
los cajones pueden contener hasta tres registros.

Respuesta:
3
3
29
5
19
11
3
2
111
110
100
011
010
001

000
3
2
2
31
23
7
17
2

12.13 Muéstrese como cambia la estructura asociativa extensible del Ejercicio 12.12, como resultado de
realizar los siguientes pasos:
a. Borrar 11.
b. Borrar 31.
c. Insertar 1.
d. Insertar 15.
Respuesta:
a.
3
3
Borrar 11: A partir de la respuesta del Ejercicio 12.12, cambiar el tercer cajón a:
19

En este momento es posible agrupar el segundo y tercer cajón. Entonces es suficiente si la tabla direcciones de
los cajones tiene sólo cuatro entradas en lugar de ocho. Para el objetivo de esta respuesta no se hace la
agrupación.

b. Borrar 31: A partir de la respuesta del Ejercicio 12.12, cambiar el último cajón a:

2
23
7

c. Insertar 1: A partir de la respuesta del Ejercicio 12.12, cambiar el primer cajón a:

1
17
2

d. Insertar 15: A partir de la respuesta del Ejercicio 12.12, cambiar el último cajón a:

15
2
23
7

12.14 Se da un seudocódigo para el borrado de entradas desde una estructura asociativa extensible,
incluyendo los detalles de cuándo y cómo agrupar cajones. No preocuparse sobre la reducción del tamaño de
la tabla de direcciones de los cajones.

Respuesta: Sea i el número de bits del valor de asociación empleado en la tabla asociativa. Sea BSIZE la
capacidad máxima de cada cajón.
delete(valor Kl)
begin
j = primeros i bits de orden superior de h(Kl);
borrar el valor Kl del cajón j;
agrupar(cajón j);
end

coalesce(cajón j)
begin
ij = bits utilizados en el cajón j;
k = cualquier cajón con los primeros (ij - 1) bits iguales
a los del cajón j, mientras el bit ij está reservado;
ik = bits utilizados en el cajón k;
if(ij _= ik)
return; /* los cajones no se pueden fusionar */
if(entradas en j + entradas en k > BSIZE)
return; /* los cajones no se pueden fusionar */
mover las entradas del cajón k al cajón j;

reducir en 1 el valor de ij;


hacer que todas las entradas de la tabla de direcciones de los cajones,
que apuntan al cajón k, lo hagan al j;

agrupar(cajón j);
end

Nótese que sólo se pueden fusionar dos cajones a la vez. El prefijo asociativo común del cajón
resultante tendrá una longitud menor que los dos cajones fusionados. Por lo tanto, nos fijamos en que el cajón
compañero del cajón j se diferencia de él sólo en el último bit. Si el prefijo asociativo común de este cajón no
es ij , implica que el cajón compañero ha sido a su vez dividido, con lo que no es posible la fusión.
Cuando la fusión tiene éxito fusiones posteriores pueden ser posibles, lo cuál se gestiona mediante
una llamada recursiva para agrupar al final de la función.

12.15 Sugiérase una manera eficiente para comprobar si la tabla de direcciones de los cajones en una
asociación extensible se puede reducir de tamaño, mediante el almacenamiento de un recuento extra con la
tabla de direcciones de los cajones. Dense detalles de como se debería mantener el recuento cuando los
cajones se dividan, agrupen o borren.
(Nota: la reducción del tamaño de la tabla de direcciones de cajones es una operación costosa y las
inserciones posteriores pueden originar que la tabla crezca de nuevo. Por lo tanto, es mejor no reducir el
tamaño tan pronto como se pueda, sino hacerlo sólo si el número de entradas de índice se reduce en
comparación con el tamaño de la tabla de direcciones de cajones.)

Respuesta: Si la tabla asociativa está utilizando actualmente i bits del valor de asociación, manténgase un
contador de cajones para los que la longitud del prefijo asociativo común sea exactamente i.
Considérese un cajón j con longitud del prefijo asociativo común ij. Si el cajón esta siendo dividido e
ij es igual a i, entonces se reinicia el contador a 1. Si el cajón esta siendo dividido e ij es uno menos que i,
entonces se incrementa el contador en 1. Si el cajón esta siendo agrupado e ij es igual a i, entonces se reduce
el contador en 1. Si el contador llega a ser 0, entonces la tabla de direcciones de los cajones se puede reducir
de tamaño en ese momento.
Sin embargo, nótese que si la tabla de direcciones de los cajones no se reduce en ese momento,
entonces el contador no tiene significado después. Si se desea posponer la reducción, se ha de conservar un
array de contadores, es decir un contador por cada valor del prefijo asociativo común. El array ha de
actualizarse de una misma manera. La tabla de direcciones de los cajones se puede reducir si la ith entrada del
array es 0, donde i es el número de bits que la tabla está empleando. Dado que la reducción de la tabla de
cajones es una operación costosa, no siempre es aconsejable reducir la tabla. Sólo debería reducirse cuando un
número suficiente de entradas, al final del array de contadores, lleguen a ser 0.

12.16 ¿Por qué una estructura asociativa no es la mejor elección para una clave de búsqueda en la que son
frecuentes las consultas de rangos?

Respuesta: Una consulta de rangos no puede ser contestada eficientemente empleando un índice asociativo,
porque habrá que leer todos los cajones. Esto se debe a que los valores de las claves en el rango no ocupan
espacios consecutivos en los cajones, sino que están distribuidos uniformemente y aleatoriamente a través de
todos los cajones.

12.17 Considérese un archivo en retícula en el cual se desea evitar el desbordamiento de cajones por
razones de rendimiento. En los casos en los que sea necesario un cajón de desbordamiento, en su lugar se
reorganiza el archivo. Preséntese un algoritmo para esta reorganización.
Respuesta: Considérese un array de retículas de dos dimensiones. Cuando se desborda un cajón se pueden
dividir en dos los rangos correspondientes a esas fila y columna, en dos escalas lineales. De este modo las
escalas lineales tomarán, cada una, una entrada adicional y el cajón se divide en cuatro cajones. Los rangos
deberían dividirse de tal modo que aseguren que los cuatro cajones resultantes tienen casi el mismo número
de valores.
Puede haber otros cuantas heurísticas para decidir cómo reorganizar los rangos y, por tanto, las escalas
lineales y arrays de retículas.

12.18 Considérese la relación cuenta de la Figura 12.25.


a. Constrúyase un índice de mapa de bits sobre los atributos nombre-sucursal y saldo, separando los
valores de saldo en 4 rangos: menores que 250,entre 250 y menor que 500 entre 500 y menor que 750 y 750 o
mayor.
b. Considérese una consulta que solicite todas las cuentas en Centro con un saldo de 500 o más.
Muéstrense los pasos implicados en la consulta así como los mapas de bits intermedios y finales construidos
para responder la consulta.

Respuesta: A continuación se reproduce la relación cuenta de la Figura 12.25.

C-217 Galapagar 750


C-101 Centro 500
C-110 Centro 600
C-215 Becerril 700
C-102 Navacerrada 400
C-201 Navacerrada 900
C-218 Navacerrada 700
C-222 Moralzarlal 700
C-305 Collado Mediano 350

Mapa de bits para nombre-sucursal


Galapagar 100000000
Centro 011000000
Becerril 000100000
Navacerrada 000011100
Moralzarzal 000000010
Collado Mediano 000000001

Mapa de bits para saldo

L1 000000000
L2 000010001
L3 011100110
L4 100001000

donde, nivel L1 está por debajo de 250, nivel L2 desde 250 hasta debajo de 500, L3 desde 500 hasta debajo de
750 y nivel L4 por encima de 750.
Para encontrar todas las cuentas de Centro con saldo de 500 o más, se encuentra la unión de mapas
de bits para los niveles L3 y L4 y, después, se inserta con el mapa de bits para Centro.

Centro 011000000
L3 011100110
L4 100001000
L3 È L4 111101110
Centro 011000000
Centro Ç (L3 È L4) 011000000

De este modo, las tuplas requeridas son C-101 y C-110.

12.19 Muéstrese cómo calcular la existencia de mapas de bits, desde otros mapas de bits. Asegúrese que la
técnica funciona incluso con valores nulos, mediante el empleo de un mapa de bits para el valor nulo.

Respuesta: La existencia de mapas de bits para una relación se puede calcular tomando la unión (or lógico)
de todos los mapas de bits del atributo, incluyendo el mapa de bits para el valor nulo.

12.20 ¿Cómo afecta el cifrado de los datos a los esquemas de índices? En particular, ¿cómo afectaría a los
esquemas que intentan almacenar datos ordenados?

Respuesta: Nótese que los índices deben operar sobre datos cifrados, o alguien podría acceder a los índices
para interpretar los datos. De lo contrario, los índices habrían de restringirse para que sólo pudieran acceder a
ellos determinados usuarios. Para mantener los datos en forma ordenada, el esquema de índices tendría que
descifrar los datos en cada nivel del árbol. Nótese que los sistemas asociativos no se verían afectados.
CAPITULO 13

PROCESAMIENTO DE CONSULTAS

Este capítulo describe los procesos por medio de los cuales las consultas son ejecutadas eficientemente por un
sistema de bases de datos. El capítulo comienza con medidas de costes, para continuar con algoritmos de
evaluación de expresiones y operadores de álgebra relacional. Este capítulo aplica conceptos de los Capítulos
3, 11 y 12.

Cambios a la tercera edición:

El único capítulo sobre procesamiento de consultas de la edición anterior, se ha reemplazado por dos
capítulos, el primero sobre procesamiento y el segundo sobre optimización de las consultas.
Otro cambio significativo es la separación de la estimación del tamaño desde la presentación de los
algoritmos de procesamiento de las consultas.
Como resultado de estos cambios, los algoritmos de procesamiento de consultas se pueden cubrir sin los
tediosos y molestos detalles de la estimación del tamaño. Aunque la estimación del tamaño se cubre más
tarde, en el Capítulo 14, se ha simplificado la presentación mediante la omisión de algunos detalles.
Los profesores pueden elegir cubrir el procesamiento, pero omitir la optimización de las consultas, sin pérdida
de continuidad con los capítulos posteriores.
Ejercicios

13.1 ¿Por qué no hay que obligar a los usuarios a que elijan explícitamente una estrategia de
procesamiento de la consulta? ¿Hay casos en los que es deseable que los usuarios sepan el coste de las
distintas estrategias posibles? Razónese la respuesta.

Respuesta: En general, no es conveniente forzar a los usuarios a elegir una estrategia de procesamiento de
consultas, porque los usuarios inexpertos podrían seleccionar una estrategia ineficiente. La razón de que los
usuarios serían malas alternativas acerca de cómo procesar las consultas, es que ellos no tendrían
conocimientos sobre cono se almacena una relación ni sobre sus índices. No es razonable forzar a los usuarios
a ser conscientes de estos detalles, dado que la facilidad de uso es el objeto principal de los lenguajes de
consultas de bases de datos. Si los usuarios se dieran cuenta del coste de las diferentes estrategias, podrían
escribir consultas eficientemente, ayudando al rendimiento. Esto podría suceder si el sistema fuera utilizado
por expertos.

13.2 Considérese la siguiente consulta SQL para la base de datos bancaria:

select T.nombre-sucursal
from sucursal T, sucursal S
where T.activo > S.activo and S.ciudad-sucursal = “Arganzuela”

Escríbase una expresión del álgebra relacional equivalente a la dada que sea más eficiente.
Justifíquese la elección.

Respuesta:
PT.nombre-sucursal ((Pnombre-sucursal, activo (rT (sucursal))) |x| T.activo>S.activo
1

(Pactivo (s(ciudad-sucursal =“Arganzuela”)(rS(sucursal)))))

Esta expresión realiza la reunión zeta sobre la menor cantidad de datos posible. Hace esto restringiendo el
operando del lado derecho de la reunión, a sólo aquellas sucursales de Arganzuela y, también, eliminando los
atributos innecesarios de ambos operandos.

13.3 ¿Cuáles son las ventajas e inconvenientes de los índices asociativos en relación con índices de árbol
B+-? ¿Cómo podría influir el tipo de índice en la elección de una estrategia de procesamiento de una consulta?

Respuesta: Los índices asociativos permiten realizar muy rápidamente operaciones de búsqueda de puntos
(por ejemplo sA=r(relación)), pero en búsquedas de rangos el índice de árbol B+ sería mucho más eficiente. Si
hay que evaluar una consulta de rangos, y sólo está disponible un índice asociativo, la mejor estrategia podría
ser realizar unan exploración de ficheros, en vez de emplear ese índice.

13.4 Supóngase (para simplificar este ejercicio) que sólo cabe una tupla en un bloque y que la memoria
puede contener, como máximo, tres marcos de página. Muéstrense las secuencias creadas en cada ciclo del
algoritmo de ordenación-mezcla, cuando se aplica para ordenar las siguientes tuplas sobre el primer atributo:
(canguro, 17), (ualabi, 21), (emú, 1), (wombat, 13), (ornitorrinco, 3), (león, 8), (jabalí, 4), (cebra, 11), (koala,
6), (hiena, 9), (cálao, 2), (babuino, 12).
Respuesta: Las referencias a las tuplas (canguro, 17) hasta (babuino, 12) se harán empleando los números de
tupla t1 hasta t12. Nos referimos a la j enésima secuencia utilizada por el i enésimo ciclo, como rij . Las secuencias
de ordenación inicial tienen tres bloques cada una. Son:
r11 = {t3, t1, t2}
r12 = {t6, t5, t4}
r13 = {t9, t7, t8}
r14 = {t12, t11, t10}

Cada ciclo mezcla tres secuencias. Por lo tanto, las secuencias después del final del primer ciclo son:

r21 = {t3, t1, t6, t9, t5, t2, t7, t4, t8}
r22 = {t12, t11, t10}

Al final del segundo ciclo, las tuplas están completamente ordenadas en una secuencia:

r21 = {t3, t1, t6, t9, t5, t2, t7, t4, t8}

13.5 Dadas las relaciones r1(A ,B, C) y r2(C, D, E) con las siguientes propiedades: r1 tiene 20.000 tuplas,
r2 tiene 45.000 tuplas, 25 tuplas de r1 caben en un bloque y 30 tuplas de r2 caben en un bloque. Estímese el
número de accesos a bloques requeridos, utilizando cada una de las siguientes estrategias para la reunión r1 |x| 1

r2:

a. Reunión en bucle anidado


b. Reunión en bucle anidado por bloques
c. Reunión por mezcla
d. Reunión por asociación

Respuesta: r1 necesita 800 bloques y r2 1.500. Supónganse M páginas de memoria. Si M >800, la reunión
puede hacerse fácilmente en 1.500 + 800 accesos a disco, empleando incluso reunión en bucle anidado
sencilla. Así, consideraremos sólo el caso en que M £ 800 páginas.
a. Reunión en bucle anidado:
Empleando r1 como la relación externa se necesitan 20.000 * 1.500+800 = 30.000.800 accesos a disco, si r2 es
la relación externa son necesarios 45.000 * 800 + 1.500 = 36.001.500 accesos a disco.

b Reunión en bucle anidado por bloques:


Si r1 es la relación externa se necesitan é800 ¸ (M-1)ù * 1.500 + 800 accesos a disco, si r2 es la relación
externa son necesarios é1.500 ¸ (M-1)ù * 800 + 1.500 accesos a disco.

c. Reunión por mezcla


Suponiendo que r1 y r2 no están inicialmente ordenadas sobre la clave de reunión, el coste de la ordenación
total, inclusive el de la salida es Bs = 1.500(2 élogM-1(1.500/M)ù + 2) + 800(2 élogM-1(800/M)ù + 2) accesos a
disco. Suponiendo que todas las tuplas con el mismo valor de los atributos de la reunión caben en memoria, el
coste total es Bs + 1.500 + 800 accesos a disco.

d. Reunión por asociación:


Se supone que no tiene lugar desbordamiento. Dado que r1 es menor, se emplea como la relación para
construir y r2 como la relación para probar. Si M > 800/M, es decir no hay necesidad de una división
recursiva, entonces el coste es 3(1.500 + 800) = 6.900 accesos a disco, si no el coste es 2(1.500 + 800) élogM-
1(800) - 1ù + 1.500 + 800 accesos a disco.

13.6 Diséñese una variante del algoritmo híbrido de reunión por mezcla, para el caso en que las dos
relaciones no están ordenadas según el orden físico de almacenamiento, pero ambas tienen un índice
secundario ordenado en los atributos de la reunión.

Respuesta: Se mezclan la entradas de las hojas del primer índice secundario ordenado, con las entradas de las
hojas del segundo índice secundario ordenado. El fichero resultante contiene pares de direcciones, la primera
dirección en cada par apunta a una tupla de la primera relación y la segunda dirección apunta a una tupla de la
segunda relación.
El fichero resultante está primero ordenado sobre la primera dirección de la relación. La relación
entonces se rastrea en orden de almacenamiento físico y las direcciones del fichero resultante se reemplazan
por los valores de la tupla actual. Después se ordena el fichero resultante sobre la segunda dirección de la
relación, permitiendo un rastreo de la segunda relación en orden de almacenamiento físico para completar la
reunión.

13.7 El algoritmo de reunión en bucle anidado indexado, descrito en el Apartado 13.5.3, podría ser
ineficiente si el índice fuera secundario y hubiese varias tuplas con el mismo valor en los atributos de la
reunión. ¿Por qué es ineficiente? Describir una forma, empleando ordenación, para reducir el coste de
recuperación de las tuplas de la relación interna. ¿Bajo qué condiciones sería este algoritmo más eficiente que
la reunión por mezcla híbrida?

Respuesta: Si hay varias tuplas en la relación interna con el mismo valor para los atributos de la reunión, se
puede tener que acceder a numerosos bloques de la relación interna, para cada tupla de la relación externa.
Esto es por lo que es ineficiente. Para reducir este coste se puede realizar una reunión de las tuplas de la
relación externa, con sólo las entradas de las hojas del índice secundario, posponiendo la recuperación de las
tuplas de la relación interna. El fichero resultante obtenido se ordena sobre la dirección de la relación interna,
permitiendo un eficiente rastreo del orden físico, para completar la reunión.
La reunión por mezcla híbrida requiere que la relación externa esté ordenada. El algoritmo anterior
no cumple este requerimiento, pero para cada tupla de la relación externa necesita realizar una búsqueda del
índice sobre la relación interna. Si la relación externa es mucho más grande que la relación interna, el coste de
la búsqueda del índice será menor que el de la ordenación, con lo que el algoritmo será mas eficiente.

13.8 Estímese el número de accesos a bloques requeridos por la solución del Ejercicio 13.6 para r1 |x| r2, 1

donde r1 y r2 son como las definidas en el Ejercicio 13.5.

Respuesta: r1 ocupa 800 bloques y r2 1.500. Supóngase que hay n punteros por bloque hoja del índice (se
asume que ambos índices tienen bloques hojas y punteros de igual tamaño). Supónganse M páginas de
memoria, M < 800.
El índice de r1 necesitará B1 = é20.000 ¸ nù bloques hoja y el de r2 necesitará, B2 = é45.000 ¸ nù. Por lo
tanto, la reunión por mezcla necesitará B3 = B1 + B2 accesos, sin la salida. El número de tuplas de salida se
estima según no = é20.000*45.000 ¸ (max(V (C,r1),V (C,r2)))ù . Cada tupla de salida necesitará dos punteros, por lo
que el número de bloques de salida de la reunión será Bo1 = éno ¸ n/2ù.Por lo tanto, la reunión necesita Bj =
B3+Bo1 accesos a disco.
Ahora se han de reemplazar los punteros por las tuplas actuales. Para la primera ordenación se
necesitan, Bs1 = Bo1(2élogM-1(Bo1/M)ù + 2) accesos a disco, incluyendo la grabación de la salida a disco. El
número de bloques de r1 que han de ser accedidos para reemplazar los punteros por tuplas es min(800, no).
Supóngase que n1 pares de la forma (r1 tupla, puntero a r2) caben en un bloque del disco. Por lo tanto el
resultado intermedio, después de reemplazar los punteros de r1, ocupará Bo2 = é(no/n1)ù bloques. Así el primer
ciclo, para la sustitución de los punteros de r1, costará Bf = Bs1 + Bo1 + min(800, no) + Bo2 accesos a disco.
El segundo ciclo, para la sustitución de los punteros de r2, tiene un análisis similar. Supóngase que n2
tuplas de la reunión final caben en un bloque. Entonces el segundo ciclo, para la sustitución de los punteros de
r2, costará Bs = Bs2 + Bo2 + min(1500, no) accesos a disco, donde Bs2 = Bo2(2élogM-1(Bo2/M)ù + 2).
Por lo tanto, el número total de accesos a disco para la reunión es Bj +Bf +Bs y el número de páginas
de salida es éno/n2ù.
13.9 Sean r y s dos relaciones sin índices y supóngase que no están ordenadas. Suponiendo una memoria
infinita, ¿cuál es la manera más económica (en términos de operaciones de E/S) para calcular r|x| s? ¿Cuánta
1

memoria se necesita en este algoritmo?

Respuesta: Se puede almacenar en memoria la relación más pequeña entera, leer la relación mayor bloque a
bloque y realizar una reunión en bucle anidado empleando la mayor como relación externa. El número de
operaciones de E/S es igual a br + bs y el requerimiento de memoria es min(br, bs) + 2 páginas.

13.10 Supóngase que hay un índice de árbol B+- disponible en ciudad-sucursal de la relación sucursal y
que no hay más índices. ¿Cuál sería el mejor modo de manejar las siguientes selecciones con negaciones?
a. σ¬(ciudad-sucursal <“Arganzuela”)(sucursal)
b. σ¬(ciudad-sucursal =“Arganzuela”)(sucursal)
c. σ¬(ciudad-sucursal <“Arganzuela” v activo <5000)(sucursal)

Respuesta:
a. Emplear el índice para localizar la primera tupla cuyo campo ciudad-sucursal tenga valor
“Arganzuela”. Desde esta tupla, seguir las cadenas de punteros hasta el final, recuperando todas las tuplas.

b. Para esta consulta el índice no cumple ningún objetivo. Se puede rastrear secuencialmente el fichero
y seleccionar todas las tuplas cuyo campo ciudad-sucursal sea diferente de “Arganzuela”.

c. Esta consulta es equivalente a

s(ciudad-sucursal ³ “Arganzuela” Ù activo < 5.000)(sucursal)

Empleando el índice ciudad-sucursal se pueden recuperar todas las tuplas con valor ciudad-sucursal mayor o
igual que “Arganzuela”, siguiendo las cadenas de los punteros desde la primera tupla “Arganzuela”. También
se aplica el criterio adicional, sobre cada tupla, de activo < 5.000.

13.11 El algoritmo de reunión por asociación descrito en el Apartado 13.5.5 calcula la reunión natural de
dos relaciones. Descríbase cómo extender el algoritmo de reunión por asociación para calcular la reunión
externa por la izquierda, la reunión externa por la derecha y la reunión externa completa. (Sugerencia: se
puede mantener información adicional con cada tupla en el índice asociativo para detectar si alguna tupla de
la relación para probar concuerda con la tupla del índice asociativo.)
Compruébese el algoritmo con las relaciones cliente e impositor.

nombre-cliente calle-cliente ciudad-cliente


Adams Spring Pittsfield
Brooks Senator Arganzuela
Hayes Main Harrison
González Alma Palo Alto
Santos Main Harrison
Lindsay Park Pittsfield
Curry North Rye
Santos North Rye
Turner Putnam Stamford
Glenn Sand Hill Woodside
Green Walnut Stamford
Santos Nassau Princeton

Figura 13.17 Ejemplo de relación cliente


Respuesta: Para la tupla en consideración tr de la relación probar, si no se encuentra ninguna tupla que se
corresponda, en la división por asociación de la relación construir, se rellena con nulos y se incluye en el
resultado. Esto dará la reunión externa por la izquierda natural tr ]x| ts. Para obtener la reunión externa por la
1

derecha natural tr |x[ ts, se puede mantener un indicador booleano con cada tupla en la división de la relación
1

para construir actual, Hsi residente en memoria, y activarlo siempre que cualquier tupla de la relación para
probar se corresponda con ella. Cuando se haya terminado con Hsi, todas las tuplas en ella que no tengan su
indicador activado se rellenarán con nulos y se incluirán en el resultado. Para obtener la reunión externa
completa natural, se hacen juntas las dos operaciones anteriores.
Para probar nuestro algoritmo se emplean las relaciones de muestra cliente e impositor, de las
Figuras 13.17 y 13.18. Supóngase que hay suficiente memoria para mantener tres tuplas de la relación para
construir, más un índice asociativo para estas tres tuplas.
Como relación para construir se emplea impositor. Se utiliza la función de asociación simple que devuelve la
primera letra de nombre-cliente. Tomando las primeras particiones se obtiene Hr1 = {(“Adams”, “Spring”,
“Pittsfield”)} y Hs1 = f. La tupla en la división de la relación para probar no tendrá ninguna tupla equivalente,
por lo que se obtiene (“Adams”, “Spring”, “Pittsfield”, nulo). En la división para “D”, la tupla de la relación
para construir está sin equivalencias, por lo que proporciona una tupla de salida (“David”, nulo, nulo, A-306).
En la división para “H”, se encuentra una correspondencia por primera vez, produciendo la tupla de salida
(”Hayes”, ”Main”, ”Harrison”, A-102). Procediendo de forma similar, se procesan todas las divisiones y se
completa la reunión.

13.12 Escríbase el seudocódigo para un iterador que implemente la reunión en bucle anidado indexada,
donde la relación externa esté encauzada. Emplear las funciones de iterador estándares en el seudocódigo.
Muéstrese el estado del iterador entre las llamadas.

Respuesta: Sea externo el iterador que devuelve sucesivas tuplas desde la relación externa encauzada. Sea
interno el iterador que devuelve sucesivas tuplas de la relación interna que tiene un valor dado en los atributos
de la reunión. El iterador interno devuelve estas tuplas realizando una búsqueda de índices. Las funciones
IndexedNLJoin::open, IndexedNLJoin::close e IndexedNLJoin::next para implementar los iteradores de
la reunión en bucle anidado indexada, se dan a continuación.

nombre-cliente número-cuenta
González A-101
González A-201
Santos A-217
Santos A-215
Hayes A-102
Turner A-305
David A-306
Lindsay A-222

Figura 13.18 Ejemplo de relación impositor

Los dos iteradores externo e interno, los valores de las últimas tuplas leídas de la relación externa tr y un
indicador hechor mostrando si el final del rastreo de la relación externa se ha alcanzado, constituyen la
información de estado que es necesario recordar por IndexedNLJoin entre llamadas.
IndexedNLJoin::open()
begin
externo.open();
interno.open();
hechor := falso;
if(externo.next() ¹ falso)
mover la tupla desde la memoria intermedia de salida de externo hasta tr;
else
hechor := cierto;
end

IndexedNLJoin::close()
begin
externo.close();
interno.close();
end

boolean IndexedNLJoin::next()
begin
while(¬hechor)
begin
if(interno.next(tr[atributos-reunión]) ¹ falso)
begin
mover la tupla desde la memoria intermedia de salida de interno hasta ts;
calcular tr|x| ts y colocarlo en la memoria intermedia de salida;
1

devolver cierto;
end
else
if(externo.next() ¹ falso)
begin
mover la tupla desde la memoria intermedia de salida de externo
hasta tr;
rebobinar interno a la primera tupla de s;
end
else
hechor := cierto;
end
return falso;
end

13.13 Diséñense algoritmos basado en ordenación y asociación para el cálculo de la operación división.

Respuesta: Supóngase que r(T È S) y s(S) son dos relaciones y que se ha de calcular r ÷ s.
Mediante algoritmos basados en la ordenación se ordena la relación s sobre S. Ordenar la relación r
sobre (T,S). Ahora, iniciar el rastreo de r y mirar los valores del atributo T de la primera tupla. Rastrear r hasta
que las tuplas tengan el mismo valor que T. Rastrear también simultáneamente s y verificar si cada tupla de s
aparece como el atributo S de r, de igual manera a la reunión por mezcla. De ser así, obtener el valor de T y
proceder con el siguiente valor de T. Puede que sea necesario rastrear varias veces la relación s, pero r sólo se
rastreará una vez. El total de accesos a disco será, después de ordenar ambas relaciones, |r + N * |s|, donde N
es el número de valores distintos de T en r.
Se asume que, para cualquier valor de T, todas las tuplas en r con ese valor de T caben en memoria y
se considerará el caso general al final. Divídase la relación r en atributos de T, de tal manera que cada
partición quepa en memoria (es siempre posible por la suposición anterior). Considérense las divisiones una a
una. Constrúyase una tabla asociativa sobre las tuplas, al mismo tiempo que se agrupan todos los valores
diferentes de T en una tabla asociativa independiente. Por cada valor de T, Ahora, por cada valor VT de T,
cada valor s de S, analizar la tabla asociativa sobre (VT , s). Si cualquiera de los valores está ausente rechazar
el valor VT, de lo contrario obtener el valor VT.
En el caso de que ninguna de las tuplas de r con un valor para T quepa en memoria, divídanse r y s
sobre los atributos de S, de tal manera que se cumpla la condición y ejecútese el algoritmo sobre cada uno de
los correspondientes pares de divisiones ri y si. Obtener la intersección de los valores de T generados en cada
división.
CAPITULO 14

OPTIMIZACIÓN DE CONSULTAS

Este capítulo describe cómo se optimizan las consultas. Comienza con las estadísticas empleadas para la
optimización de las consultas y describe en líneas generales como emplear estas estadísticas para estimar
selecciones y tamaños del resultado de las consultas, para realizar una estimación de costes. Las reglas de
equivalencia se tratan a continuación, seguidas por una descripción de un modelo de algoritmo de
optimización de consultas, después del clásico algoritmo de optimización del Sistema R y alcanza la
optimización de las sub consultas anidadas. El capítulo termina con una descripción de vistas materializadas,
su papel en la optimización y una descripción de algoritmos de mantenimiento de vistas incremental.
Debería enfatizarse que las estimaciones del tamaño y las selecciones de las consultas son
aproximadas, incluso si las suposiciones hechas como es el caso de la uniformidad, se cumplen. Además, las
estimaciones de costes por diversos algoritmos presentados en el Capítulo 13, consideran sólo una mínima
cantidad de memoria y son, así, estimaciones en el peor de los casos con respecto a la disponibilidad del
espacio de memoria intermedia. Como resultado, las estimaciones de costes nunca son muy precisas. Como
quiera que experiencias prácticas han demostrado que tales estimaciones tienden a ser razonablemente
exactas, los planes de optimización con respecto al coste estimado raramente son mucho peores que los planes
de optimización verdaderos.
No se espera que los estudiantes memoricen las estimaciones de tamaño y se acentúan sólo los
procesos por los que se alcanzan las estimaciones, no los valores exactos. La precisión en términos de coste
estimado no es un objetivo importante, por lo que estimaciones que parten de unas pocas operaciones de E/S
pueden ser consideradas aceptables.
Si está disponible para el uso de los estudiantes un sistema de bases de datos comercial, se puede
diseñar un trabajo de laboratorio en el que los estudiantes midan la aceleración del rendimiento que aportan
los índices. Numerosos productos de bases de datos comerciales tienen una prestación de “plan de
explicación”, que permite al usuario encontrar el plan de evaluación empleado en una consulta. Merece la
pena pedir a los estudiantes que analicen los planes generados por diferentes consultas, con y sin índices. Una
tarea más desafiante es diseñar pruebas para ver cómo de inteligente es el optimizador de consultas y adivinar,
a partir de estos experimentos, cuáles de las técnicas de optimización cubiertas en el capítulo se emplean en el
sistema.

Cambios a la tercera edición:

El principal cambio a la edición anterior es que el capítulo sobre procesamiento de consultas se ha dividido en
dos.
La cobertura de la estimación del tamaño para diferentes operaciones, que anteriormente estaba tratada con
algoritmos para las operaciones, se ha separado ahora en un apartado independiente (Apartado 14.2). Algunas
de las formulas para la estimación de estadísticas se han simplificado y se han añadido una pocas nuevas.
Se ha aportado seudocódigo para los algoritmos de programación dinámica para la optimización del orden de
las reuniones. Hay un nuevo apartado sobre la optimización de sub consultas anidadas, que forman una parte
importante de la optimización del SQL. El apartado sobre vistas materializadas es también nuevo en esta
edición.
Ejercicios

14.1 El agrupamiento de los índices puede permitir un acceso más rápido a los datos de lo que permiten
los índices no agrupados. Indíquese el momento en que se deben crear índices no agrupados pese a las
ventajas de los índices agrupados. Explíquese la respuesta.

Respuesta: Sólo puede haber un índice agrupado para un fichero, basado en la clave de ordenación.
Cualquier consulta que necesite buscar sobre las otras claves no ordenadas necesitará un índice no agrupado.
Si la consulta accede a la mayoría de las tuplas en el fichero, puede ser más eficiente ordenar el fichero sobre
la clave deseada, en vez de emplear el índice no agrupado.

14.2 Considérense las relaciones r1(A, B, C), r2(C, D, E) y r3(E, F), con claves primarias A, C y E,
respectivamente. Supóngase que r1 tiene 1.000 tuplas, r2 tiene 1.500 tuplas y r3 tiene 750 tuplas. Estímese el
tamaño de r1 |x| r2 |x| r3y diséñese una estrategia eficiente para el cálculo de la reunión.
1 1

Respuesta:
• La relación resultante de la reunión de r1, r2, y r3 será la misma, no importa el camino con el que se reúnan,
debido a las propiedades asociativa y conmutativa de las reuniones. Así, se considerará el tamaño basado en la
estrategia de ((r1 |x| r2) |x| r3). Reuniendo r1 con r2 se conseguirá una relación de, a lo sumo, 1.000 tuplas,
1 1

dado que C es una clave para r2. Igualmente, reuniendo ese resultado con r3 se conseguirá una relación de, a
lo sumo, 1.000 tuplas, porque E es una clave para r3. Por lo tanto la relación final tendrá, como máximo,
1.000 tuplas.

• Una estrategia eficiente para el cálculo de esta reunión sería crear un índice sobre el atributo C para la
relación r2 y sobre E para r3. Entonces, por cada tupla en r1 se tiene lo siguiente:
a. Emplear el índice para r2 para buscar, a lo sumo, una tupla que se corresponda con el valor de C, en
r1.
b. Emplear el índice creado sobre E para buscar en r3, a lo sumo, una tupla que se corresponda con el
valor único de E en r2

14.3 Considérense las relaciones r1(A, B, C), r2(C, D, E) y r3(E, F) del Ejercicio 14.2. Supóngase que no
hay claves primarias, excepto el esquema completo. Sean V (C, r1) 900, V (C, r2) 1.100, V (E, r2) 50 y V (E,
r3) 100.
Supóngase que r1 tiene 1.000 tuplas, r2 tiene 1.500 tuplas y r3 tiene 750 tuplas. Estímese el tamaño de r1 |x| r2
|x| r3 y diséñese una estrategia eficiente para calcular la reunión.

Respuesta: El tamaño estimado de la relación se puede determinar calculando el número medio de tuplas que
se reunirían con cada tupla de la segunda relación. En este caso, por cada tupla de r1, 1.500/V (C, r2) = 15/11
tuplas (por término medio) de r2 se reunirían con ella. La relación intermedia tendría 15.000/11 tuplas. Esta
relación se reúne con r3 para conseguir un resultado de aproximadamente 10.227 tuplas (15.000/11 × 750/100
= 10.227). Una buena estrategia reuniría primero r1 y r2, dado que la relación intermedia es de tamaño
parecido a r1 ó r2. Después se reúne r3 a este resultado.

14.4 Supóngase que se dispone de un árbol B+ para ciudad-sucursal para la relación sucursal y que no se
dispone de ningún otro índice. Indíquese la mejor manera de tratar las siguientes selecciones que implican a la
negación.
a. σ¬(ciudad-sucursal <“Arganzuela”)(sucursal)
b. σ¬(ciudad-sucursal =“Arganzuela”)(sucursal)
c. σ¬(ciudad-sucursal <“Arganzuela” v activo <5000)(sucursal)
Respuesta:
a. Emplear el índice para localizar la primera tupla cuyo campo ciudad-sucursal tenga valor
“Arganzuela”. Desde esta tupla, seguir las cadenas de punteros hasta el final, recuperando todas las tuplas.
b. Para esta consulta el índice no cumple ningún objetivo. Se puede rastrear secuencialmente el fichero
y seleccionar todas las tuplas cuyo campo ciudad-sucursal sea diferente de “Arganzuela”.
c. Esta consulta es equivalente a la consulta

s(ciudad-sucursal ³ “Arganzuela” Ù activo<5000)(sucursal)

Empleando el índice ciudad-sucursal se pueden recuperar todas las tuplas con valor ciudad-sucursal mayor o
igual que “Arganzuela”, siguiendo las cadenas de los punteros desde la primera tupla “Arganzuela”. También
se aplica el criterio adicional, sobre cada tupla, de activo < 5.000.

14.5 Supóngase que se dispone de un árbol B+ para (nombre-sucursal, ciudad-sucursal) para la relación
sucursal. Indíquese la mejor manera de tratar la selección siguiente.

σ(ciudad-sucursal <“Arganzuela” ) Ù (activo <5000) Ù (nombre-sucursal <“Centro”


)(sucursal)

Respuesta: Empleando el índice se localiza la primera tupla con nombre-sucursal “Centro”.


Entonces los punteros seguirán recuperando sucesivas tuplas, mientras que ciudad-sucursal sea menor que
“Arganzuela”. De entre las tuplas recuperadas se rechazarán las que no cumplan la condición (activo <
5.000).

14.6 Demuéstrese que se cumplen las equivalencias siguientes. Explíquese el modo en que se pueden
aplicar para mejorar la eficiencia de determinadas consultas:

a E1 |x|? (E2 – E3) = (E1 |x|? E2 – E1 |x|? E3).


b. σ? ( A G F (E)) = A G F (σ? (E)), donde θ sólo utiliza atributos de A.
c. σ? (E1 ]x| E2) = σ? (E1) ]x| E2, donde θ sólo utiliza atributos de E1.

Respuesta:
a E1 |x|q (E2 – E3) = (E1 |x|q E2 – E1 |x|q E3).
e renombra (E1 |x|q (E2 – E3)) como R1, (E1 |x|q E2) como R2 y (E1 |x|q E3) como R3. Es claro que si una
tupla t pertenece a R1, también pertenece a R2. Si una tupla t pertenece a R3, t[atributos de E3] will pertenecerá
a E3, por lo que t no puede pertenecer a R1. Desde lo anterior se puede decir que

"t, t Î R1 Þ t Î (R2 - R3)

Obviamente, si una tupla t pertenece a R2 - R3, entonces t[atributos de R2] Î E2 y t[atributos de R2] Ï E3. Por
lo tanto:

"t, t Î (R2 - R3) Þ t Î R1

Las dos ecuaciones anteriores implican la equivalencia dada. Esta equivalencia es útil porque la evaluación de
la reunión por el lado derecho producirá numerosas tuplas que, finalmente, se eliminarán del resultado. La
expresión del lado izquierdo se puede evaluar más eficientemente.
b sq( AGF (E)) = AGF (sq(E)), donde q utiliza sólo atributos de A.
q utiliza sólo atributos de A. Por lo tanto, si cualquier tupla t en la salida de AGF (E) se filtra mediante
la selección del lado izquierdo, todas las tuplas en E cuyos valores en A sean iguales a t[A] se filtran por la
selección del lado derecho. Por lo tanto:

"t, t Ï sq( AGF (E)) Þ t Ï AGF (sq(E))

Empleando un razonamiento similar, se puede concluir que

"t, t Ï AGF (sq(E)) Þ t Ï sq(AGF (E))

Las dos ecuaciones anteriores implican la equivalencia dada. Esta equivalencia es útil porque la evaluación
del lado derecho evita realizar la agregación en grupos que, de todas formas, se eliminarán del resultado. Así,
la expresión del lado derecho se puede evaluar más eficientemente que la del lado izquierdo.

c. sq(E1 ]x| E2) = sq(E1) ]x| E2 donde θ sólo utiliza atributos de E1.
1 1

q utiliza sólo atributos de E1. Por lo tanto, si cualquier tupla t en la salida de (E1 ]x| E2) se filtra
1

mediante la selección del lado izquierdo, todas las tuplas en E1 cuyos valores sean iguales a t[E1] se filtran por
la selección del lado derecho. Por lo tanto:

"t, t Ï sq(E1 ]x| E2) Þ t Ï sq(E1) ]x| E2


1 1

Empleando un razonamiento similar, se puede concluir que

"t, t Ï sq(E1) ]x| E2 Þ t Ï sq(E1 ]x| E2)


1 1

Las dos ecuaciones anteriores implican la equivalencia dada. Esta equivalencia es útil porque la evaluación
del lado derecho evita que se produzcan muchas tuplas de salida que, de todas formas, se eliminarán del
resultado. Así, la expresión del lado derecho se puede evaluar más eficientemente que la del lado izquierdo.

14.7 Muéstrese el modo de obtener las equivalencias siguientes mediante una secuencia de
transformaciones utilizando las reglas de equivalencia del Apartado 14.3.1.
a. sq1Ùq2Ù q3(E) = sq1(sq2(sq3(E)))
b. sq1Ùq2(E1 |x|q3 E2) = sq1(E1 |x|q3 (sq2 (E2))), donde θ2 sólo implica atributos de E2
Respuesta:
a. Empleando la regla 1, sq1Ùq2Ù q3(E) se convierte en sq1(sq2Ùq3(E)). Aplicando de nuevo la regla 1 se
tiene sq1(sq2(sq3(E))).
b sq1Ùq2(E1 |x|q3 E2), aplicando la regla 1 se convierte en sq1(sq2(E1 |x|q3 E2)) Aplicando la regla 7.a
esto se convierte en sq1(E1 |x|q3 (sq2 (E2))).

14.8 Para cada uno de los siguientes pares de expresiones, dense ejemplos de relaciones que muestren que
las expresiones no son equivalentes.
a. Π A (R - S) y Π A (R) – Π A (S)
b. σ B < 4 ( A G max (B) (R)) y A G max (B) (σ B < 4 (R))
c. En las expresiones anteriores, si las dos apariciones de max se sustituyeran por min, indicar si las
expresiones serían equivalentes.
d. (R ]x| S) ]x| T y R ]x| (S ]x| T)
En otras palabras, la reunión externa por la izquierda no es asociativa. (Sugerencia: Supóngase que los
esquemas de las tres relaciones son R(a, b1), S(a, b2) y T (a, b3), respectivamente.)
e. σ θ (E 1 ]x| E2) y E 1 ]x| σ θ (E 2), donde θ utiliza sólo atributos de E 2
Respuesta:
a. R = {(1, 2)}, S = {(1, 3)} El resultado de la expresión del lado izquierdo es {(1)}, mientras que el
resultado de la expresión del lado derecho está vacío.

b R = {(1, 2), (1, 5)} La expresión del lado izquierdo tiene un resultado vacío, mientras que la del lado
derecho tiene el resultado {(1, 2)}.

c. Sí, al reemplazar los max por los min, las expresiones serán equivalentes. Cualquier tupla que la
selección en los lados de la derecha elimine, no pasaría la selección sobre los lados de la izquierda, si fuera el
mínimo valor y, de cualquier manera, sería eliminada si no fuera el valor mínimo.

d. R = {(1, 2)}, S = {(2, 3)}, T = {(1, 4)}. La expresión de la izquierda da {(1, 2, nulo, 4)}, mientras que
la de la derecha da {(1, 2, 3, nulo)}.

e. Sea R del esquema (A,B) y S del (A,C). Sean R = {(1, 2)}, S = {(2, 3)} y θ la expresión C = 1. El
resultado de la expresión del lado izquierdo está vacío, mientras que el resultado de la expresión del lado
derecho es {(1, 2, nulo)}.

14.9 SQL permite las relaciones con duplicados (Capítulo 4).


a. Defínanse las versiones de las operaciones básicas del álgebra relacional σ, Π, ×, |x|, -, È y Ç que
trabajan en relaciones con duplicados, de manera consistente con SQL.

b. Compruébense cuáles de las reglas de equivalencia, de la 1 a la 7.b, se cumplen para la versión


multiconjunto del álgebra relacional definida en el apartado a.

Respuesta:
a. Aquí se definen las versiones para multi conjuntos de los operadores del álgebra relacional.
Dadas las relaciones de multi conjuntos r1 y r2,
i. s
Sea c1 la copia de la tupla t1 en r1. Si t1 cumple la selección sq, entonces hay c1 copias de t1 en sq(r1), de lo
contrario no hay ninguna.
ii. Õ
Por cada copia de la tupla t1 en r1, hay una copia de la tupla ÕA(t1) en ÕA(r1), donde ÕA(t1) denota la
proyección de la tupla concreta t1.
iii ×
Si hay c1 copias de la tupla t1 en r1 y c2 copias de la tupla t2 en r2, entonces hay c1 * c2 copias de la tupla t1.t2
en r1 × r2.
iv |x|
El resultado será lo mismo que un producto cruzado seguido de una selección.
v -
Si hay c1 copias de la tupla t en r1 y c2 copias de la tupla t en r2, entonces habrá c1 - c2 copias de t en r1 - r2,
con tal que c1 - c2 sea positivo.
vi È
Si hay c1 copias de la tupla t en r1 y c2 copias de la tupla t en r2, entonces habrá c1 + c2 copias de t en r1 È r2.
vii Ç
Si hay c1 copias de la tupla t en r1 y c2 copias de la tupla t en r2, entonces habrá min(c1, c2) copias de t en r1 Ç
r2.
b Todas las reglas de equivalencia, de la 1 a la 7.b del Apartado 14.3.1, se mantienen para la versión
multiconjunto del álgebra relacional definida en la primera parte.
Existen reglas de equivalencia que se cumplen para el álgebra relacional ordinaria, pero no para la
versión de multi conjuntos. Por ejemplo, considérese la regla:

A Ç B = A È B - (A - B) - (B - A)

Esto es obviamente válido en el álgebra relacional sencillo. Considérese un ejemplar de multiconjunto en el


que una tupla t aparece 4 veces en A y 3 veces en B; t aparecerá 3 veces en el resultado de la expresión del
lado izquierdo, pero 6 veces en el del lado derecho. La razón por la que esta regla no se mantiene en la
versión multiconjunto, está en la asimetría de la semántica de la unión e intersección de multi conjuntos.

14.10 ** Demuéstrese que, con n relaciones, hay (2(n-1))!/(n-1)! ordenes de reunión diferentes.
Sugerencia: Un árbol binario completo es aquél en el que cada nodo interno tiene exactamente dos hijos.

Utilícese el hecho de que el número de árboles binarios completos diferentes con n nodos hojas es
Si se desea, se puede obtener la fórmula para el número de árboles binarios completos con n nodos, a partir
de la fórmula para el número de árboles binarios con n nodos. El número de árboles binarios con n nodos es

; este número se conoce como número de Catalan y su obtención puede hallarse en cualquier libro
de texto estándar sobre estructuras de datos o algoritmos.

Respuesta: Cada orden de reunión es un árbol binario completo (cada nodo sin hojas tiene exactamente dos
hijos) con las relaciones como hojas. El número de árboles binarios completos diferentes con n nodos hojas es

(consúltese cualquier libro de texto sobre Estructuras Discretas, por ejemplo ”Fundamentals of Data
Structures” por Horowitz y Sahni, para una prueba). Multiplicando esto por n!, por el número de
permutaciones de las n hojas, se obtiene el resultado deseado.

14.11 ** Demuéstrese que el orden de reunión de menor coste puede calcularse en un tiempo de O(3n).
Supóngase que se puede almacenar y examinar la información sobre un conjunto de relaciones (como el orden
óptimo de reunión para el conjunto y el coste de ese orden de reunión) en tiempo constante. (Si se encuentra
difícil este ejercicio, demuéstrese al menos la cota de tiempo menos estricta de O(22n).)

Respuesta: Considérese el algoritmo de programación dinámica dado en la Figura 14.5 del libro de texto. Por
cada subconjunto con k + 1 relaciones, el orden de reunión óptimo se puede calcular con el tiempo 2k+1. Esto
es así porque, para un par concreto de subconjuntos A y B, se necesita tiempo constante y hay a lo sumo 2k+1-
2 subconjuntos diferentes que A puede denotar. Así, sobre todos los subconjuntos de tamaño k + 1, este

coste es . Sumando sobre todos los k desde 1 hasta n-1, se obtiene la expansión binomial de ((1 +
x)n - x) con x = 2. Así, el coste total es menor que 3n.

14.12 Demuéstrese que, si sólo se toman en consideración los árboles de reunión en profundidad por la
izquierda, como en el optimizador System R, el tiempo empleado en buscar el orden de reunión más eficiente
es del orden de n2n. Supóngase que sólo hay un orden interesante.

Respuesta: La deducción del tiempo empleado es similar al caso general, excepto que en vez de considerar
2k+1 - 2 subconjuntos de tamaño menor o igual que k para A, sólo es necesario considerar k + 1 subconjuntos
de tamaño exactamente igual a k. Esto es así porque el operando de la derecha de la reunión más alta ha de ser
una relación simple. Por lo tanto, el coste total de encontrar el mejor orden de reunión para todos los
subconjuntos de tamaño k + 1 es , el cual es igual a n . Sumando sobre todos los k desde
1 hasta n-1, empleando la expansión binomial de ((1 + x)n - 1) con x = 1, se obtiene un coste total menor que
n2n-1.

14.13 Se dice que un conjunto de reglas de equivalencia está completo si, siempre que dos expresiones son
equivalentes, se puede obtener una de la otra mediante una secuencia de utilizaciones de las reglas de
equivalencia. Indíquese si el conjunto de reglas de equivalencia que se consideró en el Apartado 14.3.1 es
completo. Sugerencia: Considerar la equivalencia σ 3 = 5 (r) = { }.

Respuesta: Dos expresiones relacionales se definen equivalentes, cuando sobre todas las relaciones de
entrada, generan la misma salida. El conjunto de reglas de equivalencia considerado en el Apartado 14.3.1 no
es completo. Las expresiones ó3=5(r) y { } son equivalentes, pero no se puede demostrar empleando sólo estas
reglas.

14.14 Decorrelación:
a. Escríbase una consulta anidada sobre la relación cuenta para buscar, para cada sucursal cuyo nombre
comience por “B,” todas las cuentas con el saldo máximo de cada sucursal.
b. Rescríbase la consulta anterior sin emplear consultas anidadas; en otras palabras, decorrelaciónese la
consulta.
c. Diséñese un procedimiento (parecido al descrito en el Apartado 14.4.5) para decorrelacionar estas
consultas.

Respuesta:
a. La consulta anidada es la siguiente:

select S.número-cuenta
from cuenta.S
where S.nombre-sucursal like ’B%’ and
S.saldo =
(select max(T.saldo)
from cuenta T
where T.nombre-sucursal = S.nombre-sucursal)

b La consulta descorrelacionada es la siguiente:

create table t1 as
select nombre-sucursal, max (saldo)
from cuenta
group by nombre-sucursal
select número-cuenta
from cuenta, t1
where cuenta.nombre-sucursal like ’B%’ and
cuenta.nombre-sucursal = t1.nombre-sucursal and
cuenta.saldo = t1.saldo

c. En general, considérense consultas de la forma:

select · · ·
from L1
where P1 and
A1 op
(select f(A2)
from L2
where P2)
donde f es alguna función agregada sobre los atributos A2 y op es algún operador binario booleano. La
consulta se puede rescribir como

create table t1(V,Ag2) as


select V, f(A2)
from L2
where P12
group by V
select · · ·
from L1, t1
where P1 and P22 and
A1 op t1.Ag2

donde

i. V contiene todos los atributos que se emplean en la selecciones que implican variables de
correlación en la consulta anidada
ii. el predicado P12 contiene los predicados de P2 sin las selecciones que implican las variables de
correlación
iii P22 introduce las selecciones que implican las variables de correlación. (Si los predicados en P2 2
hacen referencia a los nombres de relación en L2, deben rescribirse para referirse a la relación t1.)

14.15 Descríbase el modo de conservar de manera incremental el resultado de las operaciones siguientes,
tanto para inserciones como para eliminaciones.
a. Unión y diferencia de conjuntos
b. Reunión externa por la izquierda

Respuesta:
a. Dada la vista materializada v = r È s, cuando se inserta una tupla en r, se verifica si está presente en
v y si no es así, se añade a v . Cuando una tupla se elimina de r, se comprueba si está en s y, si no está, se
elimina de v. La inserciones y las eliminaciones en s se tratan de manera simétrica.
Para la diferencia de conjuntos, dada una vista v = r - s, cuando se inserta una tupla en r, se verifica
si está presente en s y, si no es así, se añade a v. Cuando una tupla se elimina de r, se elimina de v si está
presente. Cuando una tupla se inserta en s, se borra de v si está presente. Cuando una tupla se elimina de s, se
comprueba si está en r y, si lo está, se añade a v.

b. Dada una vista materializada v = r ]x| s, cuando se inserta un conjunto de tuplas ir en r, se añaden las
1

tuplas ir ]x| s a la vista. Cuando ir se elimina de r, se elimina ir ]x| s de la vista. Cuando un conjunto de tuplas
1 1

is se inserta en s, se calcula r |x| is. Se encuentran todas las tuplas de r que previamente no se correspondieron
1

con ninguna tupla de s(es decir, aquellas que se rellenaron con nulos en in r ]x| s), pero que se corresponden
1

con is.
Se eliminan de la vista todas las entradas rellenadas con nulos y se añaden las tuplas r |x| s a la vista.
1

Cuando is se elimina de s, se eliminan las tuplas r |x| is de la vista. Se buscan también todas las tuplas en r que
se corresponden con is, pero que no se corresponden con ninguna otra tupla en s. Se añaden todas estas a la
vista, después de rellenarlas con valores nulos.

14.16 Se da un ejemplo de expresión que defina una vista materializada y dos situaciones (conjuntos de
estadísticas para las relaciones de entrada y sus diferenciales), tales que la conservación incremental de la
vista sea mejor que su recálculo en una de las situaciones y el recálculo sea mejor en la otra.

Respuesta: Sean tres relaciones r, s y t. Considérese una vista materializada sobre estas, definida por (r |x| s |x|
1

t). Supóngase que la relación r no tiene ningún atributo en común con s o t, mientras que s y t tienen relación
1

de clave externa Cada una de ellas tiene 1.000 tuplas, y se añaden a r 100 tuplas. El recálculo es mejor,
porque (s |x| t) se puede calcular primero, el cual tendrá 1.000 tuplas. Entonces puede reunirse con t. En la
1
conservación incremental de la vista, el incremento en t primero se reunirá con s o con t, lo cual tendrá
100.000 tuplas (producto cartesiano). Esta enorme relación se reunirá entonces con t, lo cual será muy
costoso.
Sin embargo, si se añaden 100 tuplas a s en vez de a r, en la situación anterior, el mantenimiento
incremental de la vista será claramente mejor, pues un incremento en s se puede reunir con t para obtener una
relación de tamaño 100, la cual se puede reunir con r.
CAPITULO 15

TRANSACCIONES

Este capítulo aporta una visión general del procesamiento de transacciones. Primero motiva los problemas de
atomicidad, consistencia, aislamiento y durabilidad, e introduce la noción de transacciones ACID.
Posteriormente presenta algunos esquemas simples y sus inconvenientes, por lo que incentiva las técnicas
descritas en los Capítulos 16 y 17. El resto del capítulo describe la noción de planificación y los conceptos de
secuencialidad.
Se recomienda enormemente cubrir este capítulo en un primer curso de bases de datos, dado que
introduce conceptos que todo estudiante de bases de datos debería conocer. En los Capítulos 16 y 17 se
cubren los detalles sobre como implantar las propiedades de las transacciones.
En la presentación inicial sobre los requerimientos ACID, el requerimiento de aislamiento sobre
transacciones concurrentes no insiste en la secuencialidad. Según Haerder y Reuter [1983], el aislamiento sólo
requiere que los sucesos de una transacción permanezcan ocultos de otras transacciones que se estén
ejecutando en modo concurrente, con el objeto de permitir una vuelta atrás. Sin embargo al final del capítulo,
y en la mayor parte del libro (salvo en el Capítulo 24), se emplea la poderosa condición de secuencialidad
como un requerimiento de las transacciones concurrentes.

Cambios a la tercera edición:

Se ha eliminado de este capítulo (y del libro) la comprobación de la secuencialidad de las vistas, dado que no
tiene aplicación práctica.
Ejercicios

15.1 Lístense las propiedades ACID. Explíquese la utilidad de cada una de ellas.

Respuesta: Las propiedades ACID y las necesidades para cada una de ellas, son:
• Consistencia:
La ejecución de una transacción en aislamiento (es decir, son ninguna otra transacción ejecutándose
concurrentemente), preserva la consistencia de la base de datos. Generalmente, esto es responsabilidad del
programador de la aplicación que codifica las transacciones.

• Atomicidad:
O todas las operaciones de la transacción se reflejan correctamente en la base de datos, o ninguna.
Claramente, la falta de atomicidad conducirá a la inconsistencia de la base de datos.

• Aislamiento:
Cuando varias transacciones se ejecutan concurrentemente, debería ser el caso en que, para cada par
de transacciones Ti y Tj, se cumple que para los efectos de Ti, o bien Tj ha terminado su ejecución antes de
que comience Ti , o bien que Tj ha comenzado su ejecución después de que Ti termine. De este modo, cada
transacción ignora al resto de las transacciones que se ejecuten concurrentemente en el sistema. El punto de
vista del usuario de un sistema transaccional requiere la propiedad de aislamiento y la propiedad de que las
planificaciones concurrentes llevan al sistema de un estado consistente a otro. Estos requerimientos se
cumplen asegurando que sólo se permiten las planificaciones secuenciales, de transacciones que preservan la
consistencia individualmente.

• Durabilidad:
Tras la finalización con éxito de una transacción, los cambios realizados en la base de datos
permanecen, incluso si hay fallos en el sistema.

15.2 Supóngase que existe un sistema de base de datos que nunca falla. ¿Se necesita un gestor de
recuperaciones para este sistema?

Respuesta: Incluso en este caso, se necesita un gestor de recuperaciones para realizar el retroceso de las
transacciones abortadas.

15.3 Considérese un sistema de archivos como el de su sistema operativo preferido.


a. ¿Cuáles son los pasos implicados en la creación y borrado de archivos y en la escritura de datos
sobre un archivo?
b. Explíquese por qué son relevantes los aspectos de atomicidad y durabilidad en la creación y borrado
de archivos y en la escritura de datos sobre archivos. Razónese la respuesta.

Respuesta: Intervienen varios pasos en la creación de un archivo. Se asigna un área de almacenamiento al


archivo en el sistema de archivos, se le da un único número-i y se inserta una entrada del nodo-i en la lista-i.
El borrado de archivos implica exactamente los pasos opuestos.
Para el usuario del sistema de ficheros en UNIX, la durabilidad es importante por razones evidentes,
pero la atomicidad no es relevante en general, dado que el sistema de ficheros no soporta transacciones. Para
el implantador del sistema de ficheros, no obstante, muchas de las acciones internas del sistema de ficheros
necesitan disponer de semánticas transaccionales. Todos los pasos implicados en la creación / borrado de
archivos deben ser atómicos, de lo contrario habrá archivos no referenciables o áreas sin usar en el sistema de
archivos.

15.4 Los implantadores de sistemas de bases de datos prestan mucha más atención a las propiedades
ACID que los implantadores de sistemas de archivos. ¿Por qué tiene sentido esto?

Respuesta: Las bases de datos generalmente realizan tareas cruciales, cuyos efectos necesitan ser atómicos y
duraderos y cuyos resultados afectan al mundo real de forma permanente. Ejemplos de tales tareas son las
transacciones monetarias, reservas de plazas, etc. Por lo tanto, han de asegurarse las propiedades ACID. En
contraste, la mayoría de los usuarios de los sistemas de ficheros no estarían dispuestos a pagar el precio
(dinero, espacio en disco, tiempo) de soportar las propiedades ACID.

15.5 Durante su ejecución, una transacción pasa a través de varios estados hasta que se compromete o
aborta. Lístense todas las secuencias posibles de estados por los que pueda pasar una transacción. Explíquese
por qué puede ocurrir cada una de la transiciones de estados.

Respuesta: Las secuencias de estados posibles son:


a. activagparcialmente comprometidagcomprometida. Esta es la secuencia normal que seguirá una
transacción con éxito. Después de ejecutar todas sus instrucciones, accede al estado parcialmente
comprometida. Después de que se ha grabado en disco suficiente información de recuperación, la transacción
finalmente accede al estado comprometida.

b. activagparcialmente comprometidagabortada. Después de ejecutar la última instrucción de la


transacción, accede al estado parcialmente comprometida. Pero antes de grabar en disco suficiente
información de recuperación, puede tener lugar un fallo en el hardware destruyendo el contenido de la
memoria. En este caso, los cambios realizados en la base de datos se deshacen y la transacción accede al
estado abortada.

c. activagfallidagabortada. Después de iniciarse la transacción, si se descubre en algún momento


que no puede continuar la ejecución normal (debido a errores de programación o a errores externos ), entra en
el estado fallido. Entonces la transacción es retrocedida, después de lo cual entra en el estado abortada.

15.6 Justifíquese lo siguiente: La ejecución concurrente de transacciones es más importante cuando los
datos se deben extraer de disco (lento) o cuando las transacciones duran mucho y es menos importante cuando
hay pocos datos en memoria y las transacciones son muy cortas.

Respuesta: Si una transacción dura mucho o extrae datos desde un disco lento, lleva mucho tiempo
completarla. En ausencia de concurrencia, otras transacciones tendrán que esperar por un largo período de
tiempo. El tiempo de respuesta medió se incrementará. También, cuando la transacción está leyendo datos del
disco, la CPU pierde el tiempo. Así, los recursos no se emplean correctamente. Por lo tanto, la ejecución
concurrente se hace importante en este caso. Sin embargo, cuando las transacciones son cortas o los datos
están disponibles en memoria, estos problemas no suceden.

15.7 Explíquese la diferencia entre los términos planificación secuencial y planificación secuenciable.

Respuesta: Una planificación en la que todas las instrucciones que pertenecen a una única transacción
aparecen juntas, se denomina planificación secuencial. Una planificación secuenciable tiene una restricción
más débil que la que debería ser equivalente para alguna planificación secuencial. Hay dos definiciones de
equivalencia de planificaciones: equivalentes en cuanto a conflictos y equivalentes en cuanto a vistas. Ambas
se describen en el capítulo.
15.8 Considérense las dos transacciones siguientes:

T1: leer(A);
leer(B);
si A = 0 entonces B := B + 1;
escribir(B).

T2: leer(B);
leer(A);
si B = 0 entonces A := A + 1;
escribir(A).

Sea el requerimiento de consistencia A = 0 Ú B = 0, siendo los valores iniciales A = B = 0.


a. Demuéstrese que toda ejecución secuencial en la que aparezcan estas transacciones conserva la
consistencia de la base de datos.
b. Muéstrese una ejecución concurrente de T1 y T2 que produzca una planificación no secuenciable.
c. ¿Existe una ejecución concurrente de T1 y T2 que produzca una planificación secuenciable?

Respuesta:
a. Hay dos ejecuciones posibles: T1 T2 y T2 T1.
Caso 1:
A B
inicialmente 0 0
después de T1 0 1
después de T2 0 1

Consistencia encontrada: A = 0 Ú B = 0 º T Ú F = T
Caso 2:
A B
inicialmente 0 0
después de T1 1 0
después de T2 1 0

Consistencia encontrada: A = 0 Ú B = 0 º F Ú T = T

b Cualquier intercalado de T1 y T2 resulta en una planificación no secuenciable.

Figura 15.18. Grafo de precedencia.


T1 T2
leer(A)
leer(B)
leer(A)
leer(B)
si A = 0 entonces B = B
+1
si B = 0 entonces A = A
+1
escribir(A)
escribir(B)

c. No hay ninguna ejecución paralela resultante en una planificación secuenciable. Del apartado a se
sabe que una planificación secuenciable resulta en A = 0 Ú B = 0 . Supóngase que se empieza con T1 leer(A) .
Entonces, cuando la planificación termine, no importa cuando se ejecutan los pasos de T2, B = 1 . Supóngase
ahora que se empieza ejecutando T2 antes de completar T1 . Entonces T2 leer(B) dará a B un valor de 0 . Así,
cuando se complete T2, A = 1 . Así, B = 1 Ù A = 1 g ¬ (A = 0 Ú B = 0).
Análogamente empezando con T2 leer(B).

15.9 Puesto que toda planificación secuenciable en cuanto a conflictos es secuenciable en cuanto a vistas,
¿por qué se hace hincapié en la secuencialidad en cuanto a conflictos, en vez de en la secuencialidad en
cuanto a vistas?

Respuesta: La mayoría de los protocolos de control de concurrencia (protocolos para asegurar que sólo se
generan planificaciones secuenciables), empleados en la práctica, están basados en la secuencialidad en
cuanto a conflictos — realmente permiten sólo un subconjunto de planificaciones secuenciales en cuanto a
conflictos. La forma general de secuencialidad en cuanto a vistas es muy costosa de comprobar y sólo una
forma muy restringida de ella se emplea para el control de concurrencia.

15.10 Considérese el grafo de precedencia de la Figura 15.18. ¿Es secuenciable en cuanto a conflictos la
planificación correspondiente? Razónese la respuesta.

Respuesta: Hay una planificación secuenciable correspondiente al grafo de precedencia siguiente, dado que
el grafo es acíclico. Una posible planificación se obtiene haciendo una ordenación topológica, es decir, T1, T2,
T3, T4, T5.

15.11 ¿Qué es una planificación recuperable? ¿Por qué es conveniente la recuperabilidad de las
planificaciones?
¿Hay circunstancias bajo las cuales puede ser conveniente permitir planificaciones no recuperables? Razónese
la respuesta.
Respuesta: Una planificación recuperable es aquélla en la que para todo par de transacciones Ti y Tj , tales
que Tj lee elementos de datos que ha escrito previamente Ti, la operación comprometer de Ti aparece antes que
la de Tj. Las planificaciones recuperables son convenientes porque el fallo de una transacción podría, de lo
contrario, llevar al sistema a un estado de inconsistencia irreversible. Las planificaciones no recuperables
pueden necesitarse, algunas veces, cuando las actualizaciones se deben hacer visibles pronto debido a
ligaduras temporales, incluso si no han sido comprometidas aún, lo cual puede ser requerido para
transacciones muy largas.

15.12 ¿Qué es una planificación sin cascada? ¿Por qué es conveniente la planificación sin cascada?
¿Hay circunstancias bajo las cuales puede ser conveniente permitir planificaciones que no sean sin cascada?
Razónese la respuesta.

Respuesta: Una planificación sin cascada es aquélla para la que todo par de transacciones Ti y Tj , tales que Tj
lee un elemento de datos que ha escrito previamente Ti, la operación comprometer de Ti aparece antes que la
operación de lectura de Tj. Las planificaciones sin cascada son convenientes porque el fallo de una
transacción no conduce al aborto de ninguna otra transacción. Naturalmente, esto se consigue a costa de una
menor concurrencia.
Si los fallos suceden raramente, de tal manera que se pueda pagar el precio de abortos en cascada por el
incremento de concurrencia, podrían ser convenientes planificaciones que no sean sin cascada.
CAPITULO 16

CONTROL DE CONCURRENCIA

Este capítulo describe como controlar las ejecuciones concurrentes en una base de datos, con el objeto de
garantizar las propiedades de aislamiento de las transacciones. Una variedad de protocolos se definen con este
propósito. Si se dispone de poco tiempo, se pueden omitir algunos protocolos. Se recomienda cubrir, al
menos, bloqueo de dos fases (Apartado 16.1.1), hasta 16.1.3, detección y recuperación de interbloqueos
(Apartado 16.6, omitiendo el Apartado 16.6.1), el fenómeno fantasma (Apartado 16.7.3) y los conceptos tras
el control de la concurrencia de índices (parte de introducción del Apartado 16.9). Por lo tanto, se cubrirían la
mayor parte de las técnicas empleadas.
Merece la pena apuntar como los protocolos de bloqueo basados en grafos generalizan protocolos
sencillos, tales como la adquisición ordenada de bloqueos, la cual pueden haber estudiado los estudiantes en
un curso de sistemas operativos. Aunque los protocolos de marcas temporales por sí mismos no son
ampliamente usados, el bloqueo de dos fases multi versión (Apartado 16.5.2) está aumentando de
importancia, dado que permite ejecutar grandes transacciones de sólo lectura concurrentemente con
actualizaciones.
El fenómeno fantasma es a menudo mal interpretado por los estudiantes, mostrando que el bloqueo
de dos fases es incorrecto. Vale la pena remarcar que las transacciones que exploran una relación deben leer
algunos datos para encontrar qué tuplas están en la relación; mientras que estos datos estén bloqueados en un
modo de dos fases, el fenómeno fantasma no avanzará.

Cambios a la tercera edición:

Este capítulo ha sido reorganizado a partir de la edición anterior. Algunas de las materias del capítulo de
Control de Concurrencia de la segunda edición (Capítulo 11), tales como planificaciones y pruebas para
secuencialización, se han trasladado al Capítulo 15 de la tercera edición. Los apartados sobre la gestión de
interbloqueos (Apartado 16.6) y la concurrencia en estructuras de índice (Apartado 16.9) se han trasladado
desde el Capítulo 12 de la segunda edición (Procesamiento de Transacciones). El apartado sobre bloqueo de
dos fases multi versión es nuevo.
Ejercicios

16.1 Demuéstrese que el protocolo de bloqueo de dos fases asegura la secuencialidad en cuanto a
conflictos y que se pueden secuenciar las transacciones a través de sus puntos de bloqueo.

Respuesta:

16.2 Considérense las dos transacciones siguientes:

T31: leer(A);
leer(B);
si A = 0 entonces B := B + 1;
escribir(B).

T32: leer(B);
leer(A);
si B = 0 entonces A := A + 1;
escribir(A).

Añádanse a las transacciones T31 y T32 las instrucciones de bloqueo y desbloqueo, para que sigan el protocolo
de dos fases. ¿Puede producir la ejecución de estas transacciones un interbloqueo?

Respuesta:
a. Instrucciones de bloqueo y desbloqueo:
T31: bloquear-S(A)
leer(A)
bloquear-X(B)
leer(B)
si A = 0
entonces B := B + 1
escribir(B)
desbloquear(A)
desbloquear(B)

T32: bloquear-S(B)
leer(B)
bloquear-X(A)
leer(A)
si B = 0
entonces A := A + 1
escribir(A)
desbloquear(B)
desbloquear(A)
b La ejecución de estas transacciones puede dar lugar a interbloqueos Por ejemplo, considérese la
siguiente planificación parcial:

T31 T32
bloquear-S(A)
bloquear-S(B)
leer(B)
leer(B)
bloquear-X(B)
bloquear-X(A)

Las transacciones ahora están interbloqueadas

16.3 ¿Qué beneficio proporciona el bloqueo estricto de dos fases? ¿Qué inconvenientes tiene?

Respuesta: Dado que sólo produce planificaciones sin cascada, la recuperación es muy fácil. Pero el conjunto
de planificaciones que se puede obtener es un subconjunto de los que se obtiene desde el bloqueo sencillo de
dos fases, con lo que se reduce la concurrencia.

16.4 ¿Qué beneficio proporciona el bloqueo riguroso de dos fases? Compárese con otras formas de
bloqueo de dos fases.

Respuesta: El bloqueo riguroso de dos fase tiene las ventajas del bloqueo estricto de dos fases. Además tiene
las propiedades de que para dos transacciones conflictivas, su orden de compromiso es su orden de
secuencialidad. En algunos sistemas lo usuarios pueden esperar este comportamiento.

16.5 Muchas implementaciones de sistemas de bases de datos utilizan el bloqueo estricto de dos fases.
Indíquense tres razones que expliquen la popularidad de este protocolo.

Respuesta: Es relativamente sencillo de implementar, debido a las planificaciones sin cascada impone unos
costes de retroceso bajos y generalmente permite un nivel aceptable de concurrencia.

16.6 Considérese una base de datos organizada como un árbol con raíz. Supóngase que se inserta un nodo
ficticio entre cada par de nodos. Demuéstrese que, si se sigue el protocolo de árbol con este nuevo árbol, se
obtiene una mejor concurrencia que con el árbol original.

Respuesta: La prueba está en Buckley y Silberschatz, “Concurrency Control in Graph Protocols by Using
Edge Locks,” Proc. ACM SIGACT-SIGMOD Simposio sobre los Principios de Sistemas de Base de Datos,
1984.

16.7 Demuéstrese con un ejemplo que hay planificaciones que son posibles con el protocolo de árbol, que
no lo son con protocolos de bloqueo de dos fases y viceversa.
Respuesta: Considérese el grafo de base de datos estructurada en árbol que se presenta a continuación.

Planificación posible bajo el protocolo de árbol, pero no bajo el de bloqueo de dos fases:

T1 T2
bloquear(A)
bloquear(B)
desbloquear(A)
bloquear(A)
bloquear(C)
desbloquear(B)
bloquear(B)
desbloquear(A)
desbloquear(B)
desbloquear(C)

Planificación posible bajo el bloqueo de dos fases, pero no bajo el protocolo de árbol:

T1 T2
bloquear(A)
bloquear(B)
bloquear(C)
desbloquear(B)
desbloquear(A)
desbloquear(C)

16.8 Considérese la siguiente extensión del protocolo de bloqueo de árbol, que permite bloqueos
compartidos y exclusivos:

• Una transacción puede ser de sólo lectura, en cuyo caso sólo puede solicitar bloqueos compartidos, o bien
puede ser de actualización, en cuyo caso sólo puede solicitar bloqueos exclusivos.
• Cada transacción debe seguir las reglas del protocolo de árbol. Las transacciones de sólo lectura pueden
bloquear primero cualquier elemento de datos, mientras que las transacciones de actualización deben bloquear
primero la raíz.

Demuéstrese que este protocolo garantiza la secuencialidad y la ausencia de interbloqueos.

Respuesta: La prueba está en Kedem y Silberschatz, “Locking Protocols: en exclusiva para Shared Locks,”
JACM Vol. 30, 4, 1983.
16.9 Considérese el siguiente protocolo de bloqueo basado en grafos, el cual sólo permite modos de
bloqueo exclusivos y que funciona con grafos de datos con forma de grafo acíclico dirigido con raíz.

• Una transacción puede bloquear en primer lugar cualquier nodo.


• Para bloquear cualquier otro nodo, la transacción debe poseer un bloqueo sobre la mayoría de los padres de
dicho nodo.

Demuéstrese que este protocolo garantiza la secuencialidad y la ausencia de interbloqueos.

Respuesta: La prueba está en Kedem y Silberschatz, “Controlling Concurrency Using Locking Protocols,”
Proc. Annual IEEE Simposio sobre Fundamentos de la Ciencia de la Computación, 1979.

16.10 Considérese el siguiente protocolo de bloqueo basado en grafos que sólo permite bloqueos
exclusivos y que funciona con grafos de datos con forma de grafo dirigido acíclico con raíz.

• Una transacción puede bloquear en primer lugar cualquier nodo.


• Para bloquear cualquier otro nodo, la transacción debe haber visitado a todos los padres de dicho nodo y
debe poseer un bloqueo sobre uno de los padres del vértice.

Demuéstrese que este protocolo garantiza la secuencialidad y la ausencia de interbloqueos.

Respuesta: La prueba está en Kedem y Silberschatz, “Controlling Concurrency Using Locking Protocols,”
Proc. Annual IEEE Simposio sobre Fundamentos de la Ciencia de la Computación, 1979.

16.11 Considérese una variante del protocolo de árbol llamada protocolo de bosque. La base de datos está
organizada como un bosque de árboles con raíz. Cada transacción Ti debe seguir las siguientes reglas:

• El primer bloqueo en cada árbol puede hacerse sobre cualquier elemento de datos.
Se pueden solicitar el segundo y posteriores bloqueos, sólo si el padre del nodo solicitado está bloqueado
actualmente.
• Se pueden desbloquear los elementos de datos en cualquier momento.
• Ti no puede volver a bloquear un elemento de datos después de haberlo desbloqueado.

Demuéstrese que el protocolo de bosque no asegura la secuenciabilidad.

Respuesta: Tómese un sistema con dos árboles:

Se tienen dos transacciones, T1 y T2. Considérese la siguiente planificación legal:


T1 T2
bloquear(n1)
bloquear(n3)
escribir(n3)
desbloquear(n3)
bloquear(n2)
bloquear(n5)
escribir(n5)
desbloquear(n5)
bloquear(n5)
leer(n5)
desbloquear(n5)
desbloquear(n1)
bloquear(n3)
leer(n3)
desbloquear(n3)
desbloquear(n2)

Esta planificación no es secuenciable.

16.12 El bloqueo no se hace explícitamente en lenguajes de programación persistentes. En vez de esto, se


deben bloquear los objetos (o sus páginas correspondientes) cuando se accede a dichos objetos.
Muchos de los más modernos sistemas operativos permiten al usuario definir protecciones de acceso (sin
acceso, lectura, escritura) para las páginas y los accesos a memoria que violen las protecciones de acceso dan
como resultado una violación de protección (véase la orden mprotect de Unix , por ejemplo). Descríbase
la forma en que se puede usar el mecanismo de protección de acceso para bloqueos a nivel de página en
lenguajes de programación persistentes. (Sugerencia: La técnica es algo parecida a la que se empleaba para el
rescate hardware en el Apartado 11.9.4).

Respuesta: El mecanismo de protección de acceso se puede emplear para implementar bloqueos a nivel de
página. Considérense primero las lecturas. Se permite a un proceso leer una página sólo después de que
bloquee la lectura de la página. Esto se implementa por medio de mprotect, para desactivar inicialmente
los permisos de lectura a todas las páginas, para el proceso. Cuando el proceso intenta acceder a una dirección
en una página, tiene lugar una violación de la protección. El gestor asociado con la violación de la protección
solicita, entonces, un bloqueo de lectura sobre la página y, después de que se adquiere el bloqueo, se hace uso
de mprotect para permitir que el proceso acceda a leer la página y, finalmente, permitir que continúe. El
acceso a la escritura se maneja de forma similar.

16.13 Considérese una base de datos que tiene la operación atómica incrementar, además de las
operaciones leer y escribir. Sea V el valor del elemento de datos X. La operación

incrementar (X) en C

asigna el valor de X a V + C en un paso atómico. El valor de X no está disponible para la transacción hasta que
no se ejecute posteriormente una operación leer (X). La Figura 16.17 muestra una matriz de compatibilidad de
bloqueos para tres tipos de bloqueo: modo compartido, exclusivo y de incremento.
C X I
C cierto falso falso
X falso falso falso
I falso falso cierto

Figura 16.17. Matriz de compatibilidad de bloqueos

a. Demuéstrese que, si todas las transacciones bloquean el dato al que acceden en el modo
correspondiente, entonces el bloqueo de dos fases asegura la secuencialidad.
b. Demuéstrese que la inclusión del bloqueo en modo incrementar permite una mayor concurrencia.
(Sugerencia: Considérense las transacciones de fondos en el ejemplo bancario).

Respuesta: La prueba está en Korth, “Locking Primitives in a Database System,” JACM Vol. 30, 1983.

16.14 En la ordenación por marcas temporales, marca_temporal(Q) indica la mayor marca temporal de
todas las transacciones que hayan ejecutado escribir(Q) con éxito. Supóngase que, en lugar de ello,
marca_temporal-E(Q) se define como la marca temporal de la transacción más reciente que haya ejecutado
escribir(Q) con éxito. ¿Hay alguna diferencia al cambiar esta definición? Razónese la respuesta.

Respuesta: No habría ninguna diferencia. El protocolo de escritura es tal que la última transacción para
escribir un elemento es, también, la que se ha hecho con mayor marca temporal.

16.15 Cuando se retrocede una transacción en el protocolo de ordenación por marcas temporales, se le
asigna una nueva marca temporal. ¿Por qué no puede conservar simplemente su antigua marca temporal?

Respuesta: Una transacción es retrocedida porque una transacción más nueva ha leído o escrito el dato que,
se supone, iba a escribir. Si la transacción retrocedida se reintrodujera con igual marca temporal, la misma
razón para el retroceso sería todavía válida y la transacción habría de retrocederse de nuevo. Esto continuaría
indefinidamente.

16.16 En el protocolo de granularidad múltiple, ¿qué diferencia hay entre bloqueo implícito y explícito?

Respuesta: Cuando una transacción bloquea explícitamente un nodo en modo exclusivo o compartido,
bloquea implícitamente, en el mismo modo, a todos los descendientes de ese nodo. La transacción no tiene
necesidad de bloquear explícitamente los nodos descendientes. No hay diferencia en las funcionalidades de
estos bloqueos, la única diferencia está en la forma en que se adquieren y en lo probado de su presencia.

16.17 Aunque el modo IXC es útil para el bloqueo de granularidad múltiple, no se usa un modo exclusivo e
intencional-compartido (ICX). ¿Por qué no es útil?

Respuesta: Un bloqueo exclusivo es incompatible con cualquier otro tipo de bloqueo. Una vez que se
bloquea un nodo en modo exclusivo, ninguno de los descendientes puede ser accedido simultáneamente, en
ningún modo, por cualquier otra transacción Por lo tanto, no tiene sentido una declaración exclusiva e
intencional-compartida.

16.18 La utilización de un bloqueo de granularidad múltiple puede necesitar más o menos bloqueos que un
sistema equivalente con una granularidad simple de bloqueo. Apórtense ejemplos de ambas situaciones y
compárese el aumento relativo de la concurrencia que se permite.

Respuesta: Si una transacción necesita acceder a un gran conjunto de elementos, el bloqueo de granularidad
múltiple requiere menos bloqueos mientras que, si sólo un elemento necesita ser accedido, el sistema de
bloqueo de granularidad simple permite esto con sólo un bloqueo. Debido a que todos los elementos de los
datos deseados están bloqueados y desbloqueados juntos en el esquema de granularidad múltiple, el coste del
bloqueo es bajo pero la concurrencia se reduce.

16.19 Considérese el esquema de control de concurrencia basado en la validación del Apartado 16.3.
Demuéstrese que si se elige Validación (Ti), en lugar de Inicio(Ti), como marca temporal de la transacción Ti,
se puede esperar un mejor tiempo de respuesta, con tal que la tasa de conflictos entre las transacciones sea
realmente baja.

Respuesta: En el esquema de control de concurrencia del Apartado 16.3, elegir Inicio(Ti) como la marca
temporal de Ti aporta un subconjunto de planificaciones permitido, eligiendo Validación (Ti) como la marca
temporal. Emplear Inicio(Ti) significa que quienquiera que haya empezado primero, debe terminar primero.
Las transacciones claramente podrían iniciar la fase de validación en el mismo orden en que comienzan a
ejecutarse, pero esto es demasiado restrictivo. Dado que elegir Validación(Ti) causa menos transacciones no
conflictivas al reiniciar, aporta el mejor tiempo de respuesta.

16.20 Demuéstrese que hay planificaciones que son posibles con el protocolo de bloqueo de dos fases, pero
que no lo son con el protocolo de marcas temporales y viceversa.

Respuesta: Una planificación que se permite en el protocolo de bloqueo de dos fases, pero no en el de marcas
temporales es:

Paso T0 T1 observaciones precedentes


1 bloquear-S(A)
2 leer(A)
3 bloquear-X(B)
4 escribir(B)
5 desbloquear(B)
6 bloquear-S(B)
7 leer(B) T1 g T0
8 desbloquear(A)
9 desbloquear(B)

Esta planificación no está permitida en el protocolo de marcas temporales porque en el paso 7 la marca
temporal W de B es 1.
Una planificación que se permite en el protocolo de marcas temporales, pero no en el de bloqueo de dos fases
es:

Paso T0 T1 T2
1 escribir(A)
2 escribir(A)
3 escribir(A)
4 escribir(B)
5 escribir(B)

Esta planificación no puede tener instrucciones bloqueadas añadidas para hacerla legal bajo el protocolo de
bloqueo de dos fases, porque T1 debe desbloquear (A) entre los pasos 2 y 3, y debe bloquear (B) entre los
pasos 4 y 5.
16.21 Para cada una de los protocolos siguientes, descríbanse los aspectos de aplicación práctica que
sugieran emplear el protocolo y los que sugieran no usarlo:
• Bloqueo de dos fases
• Bloqueo de dos fases con granularidad múltiple
• Protocolo de árbol
• Ordenación por marcas temporales
• Validación
• Ordenación por marcas temporales multi versión
• Bloqueo de dos fases multi versión

Respuesta:
• Bloqueo de dos fases: Se emplea en aplicaciones sencillas donde es aceptable una granularidad simple. Si
hay transacciones grandes de sólo lectura, los protocolos multi versión lo harían mejor. También, si se deben
evitar interbloqueos a toda costa, sería preferible el protocolo de árbol.

• Bloqueo de dos fases con granularidad múltiple: Se emplean en aplicaciones mixtas, donde algunas
aplicaciones acceden a registros individuales y otras acceden a relaciones enteras o a partes importantes de
ellas. Los inconvenientes del anterior bloqueo de dos fases también aplican a este protocolo.

• Protocolo de árbol: Utilícese si todas las aplicaciones tienden a acceder a elementos de datos en un orden
coherente con un orden parcial particular. Este protocolo está libre de interbloqueos pero, a menudo, las
transacciones tendrán que bloquear nodos no deseados para acceder a los nodos deseados.

• Ordenación por marcas temporales: Se emplea si la aplicación demanda una ejecución concurrente que sea
equivalente a una ordenación secuencial particular (por ejemplo, el orden de llegada), en vez de cualquier
ordenación secuencial. Aunque los conflictos se gestionen mediante el retroceso de transacciones en vez de
esperas y planificaciones, no son recuperables. Para hacerlos recuperables se han de tolerar costes adicionales
e incrementos en los tiempos de respuesta. No es adecuado si hay grandes transacciones de sólo lectura, dado
que morirán de inanición. No hay interbloqueos.

• Validación: Si es baja la probabilidad de que entren en conflicto dos transacciones que se ejecutan
concurrentemente, el protocolo se puede emplear ventajosamente para mejorar la concurrencia y los tiempos
de respuesta, con costes bajos. No es adecuado con tasas de conflictos elevadas, cuando se va a hacer mucho
trabajo inútil.

• Ordenación por marcas temporales multi versión: Se emplea si la ordenación por marcas temporales es
apropiada, pero es deseable para solicitudes de lectura que nunca esperan. Comparte la otras desventajas del
protocolo de ordenación por marcas temporales.

• Bloqueo de dos fases multi versión: Este protocolo permite comprometer siempre transacciones de sólo
lectura sin espera. Las transacciones de actualización siguen el bloqueo de dos fases, de este modo permiten la
recuperación de planificaciones con conflictos solucionadas mediante la espera, en vez de el retroceso. Pero
vuelve el problema de los interbloqueos, aunque las transacciones de sólo lectura no pueden implicarse en
ellos. Aunque el manteniendo de versiones múltiples incrementa los costes de espacio y tiempo, el bloqueo
sencillo de dos fases pude ser preferible en situaciones poco conflictivas.

16.22 En una versión modificada del protocolo de marcas temporales se necesita comprobar un bit de
compromiso para saber si una petición de lectura debe esperar, o no. Explíquese como puede evitar el bit de
compromiso que aborten en cascada. ¿Por qué no se necesita hacer esta comprobación con las peticiones de
escritura?

Respuesta: Empleando el bit de compromiso, se hace una petición de lectura para esperar si la transacción
que escribió el elemento del dato no se ha comprometido aún. Por lo tanto, si la transacción de escritura falla
antes del compromiso, se puede abortar sólo esa transacción. La lectura en espera accederá a la versión
anterior, en caso de un sistema multi versión, o al valor almacenado del elemento de datos después del aborto,
en el caso de un sistema de versión simple. Para las escrituras, la comprobación de este bit de compromiso es
innecesaria. Esto es así porque, o bien la escritura es “ciega” y por lo tanto independiente del valor antiguo del
elemento del dato, o había una lectura anterior, en cuyo caso la prueba ya se había aplicado.

16.23 Explíquese por qué la siguiente técnica de ejecución de transacciones puede proporcionar mayor
rendimiento que la utilización del bloqueo estricto de dos fases: Primero se ejecuta la transacción sin adquirir
ningún bloqueo y sin realizar ninguna escritura a la base de datos, como en las técnicas basadas en la
validación, pero, a diferencia de ellas, no se realiza otra validación o escritura en la base de datos. En cambio,
se vuelve a ejecutar la transacción utilizando bloqueo estricto de dos fases. (Sugerencia: Considérense esperas
para la E/S de disco).

Respuesta: PENDIENTE DE RESOLVER

16.24 ¿Bajo qué condiciones es menos costoso evitar los interbloqueos que permitirlos y luego detectarlos?

Respuesta: El evitar los interbloqueos es preferible si las consecuencias de abortar son serias (como en
transacciones interactivas) y si hay conflictos importantes resultando una alta probabilidad de interbloqueo.

16.25 Si se evitan los interbloqueos, ¿sigue siendo posible que haya inanición? Razónese la respuesta.

Respuesta: Una transacción puede convertirse en la víctima de retrocesos de prevención de interbloqueos,


arbitrariamente en muchas ocasiones, creando así una situación potencial de inanición.

16.26 Supóngase el protocolo de ordenación por marcas temporales y dos transacciones, una que escribe
dos elementos de datos p y q y otra que lee los mismos dos elementos de datos. Obténgase una planificación
por medio de la cual la comprobación por marcas temporales para una operación escribir falle y provoque el
reinicio de la primera transacción, provocando a su vez una cancelación en cascada de la otra transacción.
Muéstrese cómo esto podría acabar en inanición de las dos transacciones. (Tal situación, donde dos o más
procesos realizan acciones, pero no se puede completar la tarea porque se interacciona con otros procesos, se
denomina interbloqueo).

Respuesta: PENDIENTE DE RESOLVER

16.27 Explíquese el fenómeno fantasma. ¿Por qué produce este fenómeno una ejecución concurrente
incorrecta, a pesar de utilizar el protocolo de bloqueo de dos fases?

Respuesta: El fenómeno fantasma surge cuando, debido a una inserción o borrado, dos transacciones entran
en conflicto lógico a pesar de no bloquearse ninguno de los elementos de los datos en común. El caso de la
inserción se describe en el libro. El borrado también puede conducir a este fenómeno. Supóngase que Ti borra
una tupla de una relación mientras Tj rastrea la relación. Si Ti borra la tupla y después Tj lee la relación, Ti
debería secuencializarse antes que Tj . Aún no hay ninguna tupla sobre la que Ti y Tj estén en conflicto.
Una interpretación del bloqueo de dos fases, como simplemente el bloqueo de las tuplas accedidas en
una relación, es incorrecta. Hay también un índice o un dato de relación que tiene información sobre las tuplas
en la relación. Esta información es leída por cualquier transacción que rastrea la relación y modificada por
transacciones que actualizan, insertan o borran en o desde relación. Por lo tanto, el bloqueo también debe
realizarse sobre el índice o el dato de relación, evitando el fenómeno fantasma.
16.28 Diséñese un protocolo basado en marcas temporales que evite el fenómeno fantasma.

Respuesta: En el texto se han considerado dos métodos para afrontar el fenómeno fantasma por medio de
bloqueos. El método de granularidad gruesa, obviamente, funciona también para las marcas temporales. El
método basado en el índice de árbol B+ se puede adaptar al de marcas temporales, tratando los cajones de
índices como elementos de datos con marcas temporales asociadas con ellos y exigiendo que todos los
accesos de lectura empleen un índice. Ahora se demostrará que este método sencillo funciona. Supóngase una
transacción Ti que quiere acceder a todas las tuplas con un determinado rango de valores de claves de
búsqueda, empleando un índice de árbol B+ sobre esa clave de acceso. Ti necesitará leer todos los cajones de
índices que tienen los valores clave en ese rango. Se puede ver que no se necesitará ningún borrado o
inserción de una tupla, con un valor clave en el mismo rango, para escribir uno de los cajones de índices
leídos por Ti. Así, el conflicto lógico se convierte en un conflicto sobre un cajón de índices y se evita el
fenómeno fantasma.

16.29 Explíquese la razón por la que se emplea la consistencia de grado dos. ¿Qué desventajas tiene esta
técnica?

Respuesta: PENDIENTE DE RESOLVER

16.30 Supóngase que se emplea el protocolo de árbol del Apartado 16.1.5 para administrar el acceso
concurrente a un árbol B+. Puesto que puede haber una división en una inserción que afecte a la raíz, se
deduce que una operación inserción no puede liberar ningún bloqueo hasta que se complete la operación
entera. ¿Bajo que circunstancias es posible liberar antes un bloqueo?

Respuesta: Nota: El protocolo de árbol del Apartado 16.1.5, referido en esta pregunta, es diferente del
protocolo de granularidad múltiple del Apartado 16.4 y del protocolo de concurrencia de árbol B+ del
Apartado 16.9.
Ahora se presenta una estrategia para liberar bloqueos pronto. Bajando el árbol desde la raíz, si el
hijo del nodo visitado actualmente no está lleno, se liberan los bloqueos mantenidos sobre todos los nodos
excepto el nodo actual, se solicita un bloqueo X sobre el nodo hijo, después de liberar el bloqueo sobre el
nodo actual y, entonces ,se desciende al hijo. Por otra parte, si el hijo está lleno, se retienen todos los bloqueos
mantenidos, se solicita un bloqueo X sobre el hijo y se desciende a él después de bloquearlo. Al alcanzar el
nodo hoja se inicia el procedimiento de inserción. Esta estrategia resulta en mantener los bloqueos sólo sobre
los nodos del árbol de índice lleno, desde la hoja hacia arriba e incluyendo el primer nodo no lleno.
Es posible una optimización a la estrategia anterior. Incluso si el hijo del nodo actual está lleno, se
pueden todavía liberar los bloqueos sobre todos los nodos, excepto el actual. Pero después de obtener el
bloqueo X sobre el nodo hijo, se divide inmediatamente. Liberando el bloqueo sobre el nodo actual y
manteniendo sólo el bloqueo sobre el hijo dividido apropiado, se desciende sobre él convirtiéndolo en el nodo
actual. Con esta optimización, en cualquier momento se mantienen como máximo dos bloqueos, de un nodo
padre y un nodo hijo.

16.31 Apórtense ejemplos de planificaciones para mostrar que si cualquier búsqueda, inserción o borrado
no bloquea el siguiente valor clave, el fenómeno fantasma podría ser indetectable.

Respuesta: PENDIENTE DE RESOLVER


CAPITULO 17

SISTEMAS DE RECUPERACIÓN

Este capítulo cubre modelos de fallos y una variedad de técnicas de recuperación de errores. La recuperación
en un sistema de base de datos real que soporta transacciones concurrentes es bastante complicada. Para
ayudar al estudiante a comprender mejor los conceptos, el capítulo presenta modelos de recuperación en
creciente grado de complejidad. El capítulo comienza con un modelo sencillo de recuperación, sin tener en
cuenta el concepto de concurrencia. Posteriormente, se amplía el modelo para gestionar transacciones
concurrentes con bloqueos estrictos de dos fases. Hacia el final del capítulo, se presenta un algoritmo de
recuperación “avanzada” que soporta la liberación temprana de algunos tipos de bloqueo para mejorar la
concurrencia, por ejemplo en estructuras de índices. Finalmente, se esbozan las variantes del algoritmo
ARIES, ampliamente usado en la práctica.
ARIES incluye las características de los algoritmos de recuperación avanzada, junto con diversas
optimizaciones que incrementan la velocidad de recuperación.
Se recomienda que, al menos, se traten los apartados hasta, e incluyendo, la Recuperación Basada en
el Registro Histórico (Apartado 17.4). La paginación en la sombra (Apartado 17.5) no se usa mucho, pero es
útil por razones pedagógicas, para mostrar que existen alternativas a la recuperación basada en el registro
histórico.
La recuperación con transacciones concurrentes (Apartado 17.6) es una sección interesante y debería ser
tratada junto con la Gestión de la Memoria Intermedia (Apartado 17.7), si es posible. El Apartado 17.9, que
cubre el algoritmo de recuperación avanzada y ARIES, debería omitirse de todos los cursos, salvo los
avanzados. Sin embargo puede emplearse como material de trabajo individual para los estudiantes bien
preparados, incluso en un curso de introducción.
Hay algunos puntos a tener en cuenta:

• Al leer el Apartado 17.2.2 (Implementación del almacenamiento estable), se debería retomar la discusión del
apartado 11.2.1, de que la escritura sobre un bloque de disco parcial puede detectarse con una alta
probabilidad empleando sumas de chequeo.

• En el apartado 17.4.3, aunque el modelo asumido es uno donde las transacciones se ejecutan
secuencialmente, el procedimiento de recuperación establece que para todas las transacciones Tk en T que no
tienen ningún <Tk comprometida> registrado en el registro histórico, ejecútese deshacer(Tk). Más de una de
tales transacciones puede existir, debido a fallos en las transacciones sucesivas.

Cambios a la tercera edición:

Los principales cambios son (a) ahora se incluye el algoritmo de recuperación ARIES (Apartado 17.9.6), y (b)
el apartado sobre sistemas de copia de seguridad remotos (Apartado 17.10) se ha trasladado a este capítulo
desde su posición inicial en el Capítulo 20. El último cambio está motivado por la necesidad creciente de la
alta disponibilidad, la cual se reflejará en un amplio incremento del empleo de sistemas de copia de seguridad
remotos. La aportación de alta disponibilidad también puede considerarse una trabajo de los sistemas de
recuperación, dado que los mismos registros históricos pueden emplearse para ambas tareas.
Ejercicios

17.1 Explíquese la diferencia entre los tres tipos de almacenamiento –volátil, no volátil y estable- en
términos de coste.

Respuesta: El almacenamiento volátil es el que falla cuando hay una caída en el suministro eléctrico. La
memoria caché, la memoria principal y los registros, son ejemplos de almacenamiento volátil. El
almacenamiento no volátil es aquel que retiene su contenido, a pesar de fallos en el suministro eléctrico. Un
ejemplo es el disco magnético. El almacenamiento estable es aquél que teóricamente sobrevive a cualquier
tipo de fallo (salvo un completo desastre!. Este tipo de almacenamiento sólo puede conseguirse mediante la
replicación de los datos.
En términos de coste de E/S, la memoria volátil es la más rápida y el almacenamiento no volátil es
generalmente varias veces más lento. El almacenamiento estable es mas lento que el no volátil, debido al
coste que supone replicar los datos.

17.2 No se puede implementar el almacenamiento estable.


a. Explíquese por qué no.
b. Explíquese como tratan este problema los sistemas de bases de datos.

Respuesta:
a. El almacenamiento estable no puede implementarse realmente, porque todos los dispositivos de
almacenamiento están compuestos de hardware y todo el hardware es vulnerable a fallos en los dispositivos
mecánicos o eléctricos.

b. Los sistemas de bases de datos se aproximan al almacenamiento estable, grabando los datos
simultáneamente en varios dispositivos de almacenamiento. Aun cuando uno de los dispositivos caiga, los
datos estarán disponible en un dispositivo diferente. Así, la pérdida de datos se convierte en algo
extremadamente improbable.

17.3 Compárense, en términos de facilidad de implementación y sobrecarga, las versiones de


modificación inmediata y modificación diferida, de las técnicas de recuperación basadas en registro histórico.

Respuesta:
• La técnica de recuperación que emplea un registro histórico con modificaciones diferidas, tiene las
siguientes ventajas sobre la que emplea modificaciones inmediatas:
a. La técnica es más fácil y sencilla de implementar, dado que se necesitan menos operaciones y
rutinas, es decir, no hay DESHACER.

b. La técnica requiere menos sobrecarga, dado que no es necesario hacer operaciones extras de E/S
hasta el momento del compromiso (los registros del registro histórico se pueden almacenar en memoria todo
el tiempo).

c. Dado que los valores antiguos de los datos no han de estar presentes en los registros del registro
histórico, esta técnica requiere menos espacio de almacenamiento.

• Los inconvenientes de la técnica de modificación diferida son:


a. Cuando se necesita acceder a un elemento de datos, la transacción ya no puede leer directamente la
página correcta desde la memoria intermedia de la base de datos porque una escritura previa, hecha por la
misma transacción sobre el mismo elemento de datos, puede no haberse propagado aún a la base de datos.
Podría haber actualizado una copia del elemento de datos y haber diferido la modificación en curso de la base
de datos. Por lo tanto, encontrar la versión correcta de un elemento de datos resulta más caro.

b. Esta técnica permite menos concurrencia que la de recuperación con actualizaciones inmediatas.
Esto es así porque los bloqueos de las escrituras se conservan por las transacciones, hasta el momento del
compromiso.

c. Para una transacción de larga duración con numerosas actualizaciones, el espacio de memoria
ocupado por los registros del registro histórico y las copias locales de elementos de datos, puede llegar a ser
demasiado alto.

17.4 Supóngase que un sistema emplea modificación inmediata. Demuéstrese, con un ejemplo, como
podría darse un estado inconsistente en la base de datos, si no se escriben en almacenamiento estable los
registros del registro histórico de una transacción, antes de que el dato actualizado por la transacción se
escriba a disco.

Respuesta: Considérese el esquema de una banco y una transacción que transfiere 50€ desde una cuenta A a
una cuenta B. La transacción tiene los siguientes pasos:
a. leer(A,a1)
b a1 := a1 - 50
c. escribir(A,a1)
d. leer(B,b1)
e. b1 := b1 + 50
f. escribir(B,b1)

Supóngase que el sistema se cae después que la transacción se compromete, pero antes de que sus registros
del registro histórico sean desviados al almacenamiento estable. Asúmase también que, en el momento de la
caída, realmente sólo se había propagado al disco el tercer paso de la actualización de A, mientras que la
página de la memoria intermedia conteniendo B no se había grabado todavía sobre disco. Cuando ese levanta
el sistema está en un estado inconsistente y no es posible la recuperación porque no hay, en el
almacenamiento estable, registros del registro histórico que se correspondan a esta transacción.

17.5 Explíquese el propósito del mecanismo de los puntos de revisión. ¿Con qué frecuencia deberían
realizarse los puntos de revisión? Explíquese cómo afecta la frecuencia de los puntos de revisión:
• Al rendimiento del sistema cuando no ocurre ningún fallo
• Al tiempo que tarda en recuperarse de una caída del sistema
• Al tiempo que tarda en recuperarse de una caída del disco

Respuesta: El punto de revisión se hace con la técnica de recuperación basada en el registro histórico, para
reducir el tiempo necesario para la recuperación después de una caída. Si no hay punto de revisión debe
recorrerse todo el registro histórico después de una caída y, a partir de él, deshacer/rehacer todas las
transacciones. Si se ha realizado un punto de revisión, la mayor parte de los registros del registro histórico
anteriores al punto de revisión se pueden ignorar en el momento de la recuperación.
Otra razón para realizar puntos de revisión es eliminar los registros del registro histórico del
almacenamiento estable cuando se llena.
Dado que los puntos de revisión causan algo de pérdida en el rendimiento mientras están teniendo
lugar, debería reducirse su frecuencia si no es crítica una recuperación rápida. Si es necesaria una
recuperación rápida, se debería incrementar la frecuencia de los puntos de revisión. La frecuencia de los
puntos de revisión es inevitable si es pequeña la cantidad de almacenamiento estable disponible. Los puntos
de revisión no tienen efecto sobre la recuperación desde una caída del disco; los volcados de archivo son
equivalentes a los puntos de revisión para la recuperación desde caídas de disco.

17.6 Cuando el sistema se recupera de una caída (véase el Apartado 17.6.4), construye una lista-deshacer
y una lista-rehacer. Explíquese por qué deben procesarse en orden inverso los registros del registro histórico
de transacciones que se encuentran en la lista-deshacer, mientras que los registros del registro histórico
correspondientes a las transacciones de la lista-rehacer se procesan hacia delante.
Respuesta: La primera fase de la recuperación es deshacer los cambios hechos por las transacciones fallidas,
para que todos los elementos de datos que han sido modificados por ellas retornen a los valores que tenían
antes de que se iniciara la primera de las transacciones fallidas. Si varias de las transacciones fallidas
hubieran modificado el mismo elemento de datos, el procesamiento hacia delante de los registros del registro
histórico para las transacciones de la lista deshacer, haría que el elemento de datos tomara el valor que tenía
antes de que se iniciara la última transacción fallida que modificó ese elemento de datos. Esto es claramente
erróneo y se puede ver que el proceso inverso aporta el resultado deseado.
La segunda fase de la recuperación es rehacer los cambios hechos por las transacciones
comprometidas, para que todos los elementos de datos que han sido modificados por ellas sean restaurados a
los valores que tenían después de que terminara la última de las transacciones comprometidas.
Se puede ver que sólo procesando hacia delante los registros del registro histórico que pertenecen a las
transacciones de la lista rehacer, se puede garantizar esto.

17.7 Compárense, en términos de facilidad de implantación y sobrecarga, el esquema de recuperación con


paginación en la sombra con los esquemas de recuperación basados en el registro histórico.

Respuesta: La técnica de paginación en la sombra es fácil de implementar para sistemas transaccionales


sencillos, pero difícil para sistemas transaccionales múltiples. En particular, es muy duro permitir múltiples
actualizaciones concurrentes sobre la misma página. La paginación en la sombra podría sufrir una sobrecarga
de espacio extra, pero la recogida de basura puede ocuparse de eso. La sobrecarga de E/S para la paginación
en la sombra es generalmente más alta que la de las técnicas basadas en el registro histórico, dado que las
técnicas basadas en la sombra necesitan grabar un registro por actualización sobre el registro histórico,
mientras que la técnica de paginación en la sombra necesita grabar un bloque por cada bloque actualizado.

17.8 Considérese una base de datos compuesta por 10 bloques consecutivos en el disco (bloque 1, bloque
2, . . ., bloque 10). Muéstrese el estado de la memoria intermedia y una posible ordenación física de los
bloques después de las siguientes modificaciones, suponiendo que se utiliza paginación en la sombra, que la
memoria intermedia en memoria principal sólo puede contener tres bloques y que se emplea la estrategia
menos recientemente utilizada para gestionar la memoria intermedia.
leer bloque 3
leer bloque 7
leer bloque 5
leer bloque 3
leer bloque 1
modificar bloque 1
leer bloque 10
modificar bloque 5

Respuesta: La ordenación inicial de los bloques del disco es: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.


Supóngase que los dos bloques siguientes al bloque 10, sobre el disco, son los dos primeros bloques en la lista
de bloques libres.
a. Los tres primeros pasos leer dan como resultado los bloques 3, 7 y 5, siendo colocados en la
memoria intermedia.

b. El cuarto paso leer no requiere acceder al disco.

c. El quinto paso leer requiere leer el bloque 1. El bloque 7 es el que menos recientemente se ha
empleado en la memoria intermedia, por lo que se reemplaza por el bloque 1.

d. El sexto paso es para modificar el bloque 1. El primer bloque libre se elimina de la lista de bloques
libres y la entrada 1 en la tabla de páginas actual se hace que apunte a él. Se modifica el bloque 1 en la
memoria intermedia. Cuando bloques sucios se vuelven a desviar al disco en el momento de comprometer la
transacción, se deberían grabar sobre el disco los bloques que apuntaban a la tabla de páginas actual
modificada.
e. El séptimo paso hace que se lea el bloque 10. El bloque 5 se sobrescribe en la memoria intermedia,
dado que es el que menos recientemente se ha usado.

f. En el octavo paso, el bloque 3 se reemplaza por el cloque 5 y, después, el bloque 5 se modifica


como en el sexto paso.

Por lo tanto, la ordenación final de los bloques en el disco es: 2, 3, 4, 6, 7, 8, 9, 10, 1, 5. El conjunto de
bloques en la memoria intermedia es: 5 (modificado), 10, 1 (modificado). Estos deben ser desviados a los
respectivos bloques del disco apuntados por la tabla de páginas actual, antes que la transacción lleve a cabo el
proceso de comprometer.

17.9 Explíquese cómo el gestor de la memoria intermedia puede conducir a la base de datos a un estado
inconsistente, si algunos registros del registro histórico pertenecientes a un bloque no se escriben en
almacenamiento estable, antes de escribir en el disco el citado bloque.

Respuesta: Si un elemento de datos x se modifica sobre el disco mediante una transacción, antes de que el
correspondiente registro del registro histórico sea grabado sobre almacenamiento estable, el único registro del
valor antiguo de x está en la memoria principal, donde podría perderse en caso de una caída. Si la transacción
no hubiera finalizado aún, en el momento de la caída, resultaría una inconsistencia irrecuperable.

17.10 Explíquense las ventajas del registro histórico lógico. Proporciónense ejemplos de una situación en
la que sea preferible el registro histórico lógico, frente al registro histórico físico y de una situación en la que
sea preferible el registro histórico físico al registro histórico lógico.

Respuesta: El registro histórico lógico tiene menos requerimientos de espacio y, con el registro de deshacer
lógico, permite liberar antes los bloqueos. Esto es conveniente en situaciones como el control de concurrencia
para estructuras de índices, donde se requiere un muy alto grado de concurrencia. Una ventaja de emplear el
registro de rehacer físico es que son posibles los puntos de revisión difusos. Así, en un sistema que necesita
realizar frecuentes puntos de revisión, esto reduce la sobrecarga.

17.11 Explíquense las razones por las que la recuperación en transacciones interactivas es más difícil de
tratar que la recuperación en transacciones por lotes. ¿Existe una forma simple de tratar esta dificultad?
(Sugerencia: Considérese una transacción de cajero automático en la que se retira dinero).

Respuesta: Las transacciones interactivas son más difíciles de recuperar que las transacciones por lotes,
debido a que algunas acciones pueden ser irrevocables. Por ejemplo, una instrucción de salida (escritura)
puede haber encendido un misil o causado que una máquina de un banco de dinero a un cliente. La mejor
manera de gestionar esto es intentar ejecutar todas las instrucciones al final de la transacción. Así, si la
transacción aborta a la mitad, no se habrá hecho ningún daño.

17.12 A veces hay que deshacer una transacción después de que se haya comprometido porque se ha
ejecutado erróneamente, debido por ejemplo a la introducción incorrecta de datos de un cajero.
a. Se da un ejemplo para demostrar que el uso de un mecanismo normal para deshacer esta transacción
podría conducir a un estado inconsistente.
b. Una forma de manejar esta situación es llevar la base de datos a un estado anterior al compromiso de
la transacción errónea (denominado recuperación a un instante). En este esquema, se deshacen los efectos de
las transacciones comprometidas después. Sugiérase una modificación del mecanismo de recuperación
avanzada para implementar la recuperación a un instante.
c. Las transacciones correctas se pueden volver a ejecutar lógicamente, pero no se pueden reejecutar
usando sus registros del registro histórico. ¿Por qué?
Respuesta:
• Considérese una cuenta bancaria A con un saldo de 100€. Sean dos transacciones T1 y T2, cada una
depositando 10€ en la cuenta. Así, el saldo sería de 20€ después que ambas transacciones se ejecutaran.
Supongamos que las transacciones se ejecutan secuencialmente: T1 primero y después T2 . Los registros del
registro histórico, correspondientes a las actualizaciones de A por las transacciones T1 y T2, serían < T1,A,
100, 110 > y < T2,A, 110, 120 > respectivamente.
Supóngase que se desea deshacer la transacción T1. El mecanismo normal para deshacer la transacción
reemplazará el valor en cuestión – A en este ejemplo – por el campo del antiguo valor en el registro del
registro histórico. De este modo, si se deshace la transacción T1 empleando el mecanismo normal para
deshacer transacciones, el saldo resultante sería 100€ y se habrían, en efecto, deshecho las dos transacciones,
mientras se intentaba deshacer sólo la transacción T1.
• ... PENDIENTE.
• Considérese de nuevo un ejemplo a partir del primer elemento. Supóngase que ambas transacciones se
deshacen y el saldo retorna al valor original de 100€.

Ahora se desea rehacer la transacción T2. Si se rehace el registro del registro histórico < T2,A, 110, 120 >
correspondiente a la transacción T2, el saldo se convertiría en 120€ y se habrían, en efecto, rehecho las dos
transacciones, mientras que se intentaba rehacer sólo la transacción T2.

17.13 En los lenguajes de programación persistentes no se realiza explícitamente el registro histórico de las
modificaciones.
Descríbase como pueden usarse las protecciones de acceso a las páginas que proporcionan los sistemas
operativos modernos, para crear imágenes anteriores y posteriores de las páginas que son modificadas.
(Sugerencia: Véase el Ejercicio 16.12)

Respuesta: Esto se implementa por medio de mprotect, para desactivar inicialmente los accesos a todas las
páginas, para el proceso. Cuando el proceso intenta acceder a una dirección en una página, tiene lugar una
violación de la protección. El gestor asociado con la violación de la protección solicita, entonces, un bloqueo
de escritura sobre la página y, después que se adquiere el bloqueo, escribe el contenido inicial ( imagen
anterior ) de la página sobre el registro histórico. Emplea entonces mprotect para permitir el acceso de
escritura a la página por el proceso y, finalmente, permitir que continúe el proceso. Cuando la transacción está
lista para el compromiso, y antes de que libere el bloqueo sobre la página, escribe el contenido de la página
(imagen posterior) sobre el registro histórico. Estas imágenes anterior y posterior se pueden emplear en la
recuperación después de una caída.
Esta técnica se puede optimizar para no escribir la página entera sobre el registro histórico para el
registro deshacer, con tal que el programa clave la página en memoria.

17.14 ARIES asume que hay espacio en cada página para un NSR. Al manejar objetos grandes que abarcan
varias páginas, tales como archivos del sistema operativo, un objeto puede usar una página completa, sin dejar
espacio para el NSR. Sugiérase una técnica para manejar esta situación; esta técnica debe soportar
operaciones rehacer físicas, pero no es necesario que soporte operaciones rehacer fisiológicas.

Respuesta: PENDIENTE. Array independiente.

17.15 Explíquese la diferencia entre una caída del sistema y un “desastre”.

Respuesta: En una caída del sistema la CPU se viene abajo y el disco también se puede caer. Pero se supone
que el almacenamiento estable del sitio supera las caídas del sistema. En un “desastre”, todo en el sitio queda
destruido. Es necesario distribuir el almacenamiento estable para superar los desastres.
17.16 Para cada uno de los siguientes requisitos, identifíquese la mejor opción del grado de durabilidad en
un sistema remoto de copia de seguridad:
a. Pérdida de datos que se debe evitar pero se puede tolerar alguna pérdida de disponibilidad.
b. El compromiso de transacciones se debe realizar rápidamente, perdiendo algunas transacciones
comprometidas en caso de desastre.
c. Se requiere un alto grado de disponibilidad y durabilidad, pero es aceptable un mayor tiempo de
ejecución para el protocolo de compromiso de transacciones.

Respuesta:
a. Dos muy seguro es adecuado aquí porque garantiza la durabilidad de las actualizaciones mediante
transacciones comprometidas, aunque sólo pueda llevarse a cabo si el sitio principal y el de copia de
seguridad están en funcionamiento. La disponibilidad es baja, pero se ha mencionado que esto es aceptable.

b. El compromiso de uno seguro es tan rápido que no ha de esperar a que el registro histórico alcance
el sitio de la copia de seguridad. Dado que la pérdida de datos se puede tolerar, es la mejor opción.

c. Con el compromiso de dos seguro, la probabilidad de pérdida de datos es muy baja y también
compromete que se puede llevar a cabo mientras que, al menos, el sitio principal esté operativo. De este
modo, la disponibilidad es alta. Los compromisos llevan más tiempo que en el protocolo uno seguro, pero eso
ha sido mencionado como aceptable.
CAPITULO 18

ARQUITECTURAS DE SISTEMAS DE BASES DE DATOS

Este capítulo es adecuado para un curso de introducción. Se recomienda cubrirlo al menos como material de
trabajo individual, dado que los estudiantes son bastante susceptibles para el empleo de arquitecturas de bases
de datos no centralizadas (particularmente cliente-servidor), cuando acceden al mundo real. La materia de este
capítulo podría ser potencialmente sustituida por el protocolo de compromiso de dos fases (C2F), (apartado
19.4.1 del capítulo 19) para proporcionar a los estudiantes una visión general de los detalles más importantes
de las arquitecturas de bases de datos no centralizadas.

Cambios a la tercera edición:

El tratamiento de las estructuras de los procesos de bases de datos (apartado 18.2.1) es nuevo en esta edición.
Se ha actualizado el alcance de la tecnología de red y se han cubierto brevemente las redes de área de
almacenamiento.
Ejercicios

18.1 ¿Por qué es relativamente fácil trasladar una base de datos desde una máquina con un único
procesador a otra con varios procesadores, si no es necesario paralelizar las consultas individuales?

Respuesta: La transferencia es relativamente fácil para una máquina con varios procesadores con memoria
compartida.
Las bases de datos diseñadas para las máquinas monoprocesador ya disponen de multitarea permitiendo que
varios procesos se ejecuten a la vez en el mismo procesador, usando tiempo compartido, mientras que de cara
al usuario parece que los procesos se están ejecutando en paralelo. De esta manera, desde un punto de vista
lógico, las máquinas paralelas de grano grueso parecen ser idénticas a las máquinas monoprocesador,
haciendo que la transferencia sea relativamente fácil.
Transferir una base de datos a un disco compartido o a una arquitectura de varios procesadores sin
compartimiento, es un poco más duro.

18.2 Las arquitecturas servidoras de transacciones son populares entre las bases de datos relacionales
cliente-servidor, donde las transacciones son cortas. Por el contrario, las arquitecturas servidoras de datos son
populares entre los sistemas cliente-servidor de bases de datos orientadas a objetos, donde las transacciones
son relativamente largas. Dense dos razones por las que los servidores de datos puedan ser populares entre las
bases de datos orientadas a objetos y no lo sean entre las bases de datos relacionales.

Respuesta: Los servidores de datos son buenos si la transferencia de datos es pequeña respecto al cálculo, el
cual es a menudo el caso en aplicaciones de bases de datos orientadas a objetos, tales como el diseño asistido
por computadora. En contraste, en las típicas aplicaciones de bases de datos relacionales como el
procesamiento de transacciones, una transacción realiza pequeños cálculos pero puede acceder a varias
páginas, lo cual implicará la transferencia de una gran cantidad de datos, con poco beneficio en una
arquitectura servidora de datos. Otra razón es que estructuras como los índices son muy usadas en las bases de
datos relacionales y llegan a convertirse en elementos de conflicto en una arquitectura servidora de datos,
requiriendo frecuentes transferencias de datos. En las típicas aplicaciones de hoy en día de bases de datos
orientadas a objetos, tales como el diseño asistido por computadora, no hay esos puntos de conflicto
frecuente.

18.3 En lugar de almacenar estructuras compartidas en memoria compartida, una arquitectura alternativa
sería almacenarlas en la memoria local de un proceso especial y acceder a los datos compartidos mediante la
comunicación entre procesos con el proceso. ¿Cuáles serían los inconvenientes de una arquitectura así?

Respuesta: Los inconvenientes serían que, para adquirir bloqueos, se solicitarían dos mensajes entre
procesos, uno para la solicitud y otro para confirmar la concesión. La comunicación entre procesos es mucho
más costosa que los accesos a memoria, por lo que el coste de bloqueos se incrementaría. El proceso de
almacenar las estructuras compartidas podría también convertirse en un cuello de botella.
El beneficio de esta alternativa es que la tabla de bloqueos está mejor protegida de actualizaciones
erróneas, dado que sólo un proceso puede acceder a ella.

18.4 La máquina que hace de servidor en los sistemas cliente-servidor típicos es mucho más potente que
los clientes, es decir, su procesador es más rápido, puede tener varios procesadores, tiene más memoria y
discos de mayor capacidad. En vez de esto, considérese el caso en que los clientes y el servidor tuvieran
exactamente la misma potencia. ¿Tendría sentido construir un sistema cliente-servidor en ese caso? ¿Por qué?
¿Qué caso se ajustaría mejor a una arquitectura servidora de datos?

Respuesta: Con clientes potentes, todavía cobra sentido tener un sistema cliente servidor, en vez de un
sistema completamente centralizado. Si se emplea la arquitectura servidora de datos, los clientes potentes
pueden descargarse todo el tiempo y trabajar procesando transacciones de cómputo intensivo del servidor,
liberándolo para que realice sólo el trabajo de cumplir los requisitos de lectura-escritura; incluso si se emplea
el modelo de servidor de transacciones, los clientes todavía se ocupan del trabajo del interface de usuario, el
cual es típicamente de cómputo muy intensivo.
Un sistema completamente distribuido podría resultar atractivo en presencia de clientes potentes,
pero los sistemas cliente servidor todavía tienen la ventaja de técnicas de recuperación y control de
concurrencia más sencillos de implementar en un solo servidor, en vez de tener estas acciones distribuidas en
todas las máquinas.

18.5 Considérese un sistema de bases de datos orientadas a objetos sobre una arquitectura cliente servidor,
en la que el servidor actúa como servidor de datos.
a. ¿Cuál es el efecto de la velocidad de interconexión entre el cliente y el servidor, en los casos de
envío de páginas y de objetos?
b. Si se utiliza envío de páginas, la caché de datos en el cliente puede organizarse como una caché de
objetos o de páginas. La caché de páginas almacena los datos en unidades de páginas, mientras que la caché
de objetos almacena los datos en unidades de objetos. Supóngase que los objetos son más pequeños que una
página. Descríbase una ventaja de la caché de objetos frente a la de páginas.

Respuesta:
a. Se supone que los objetos son más pequeños que una página y caben en ella. Si el enlace de
interconexión es lento es mejor elegir el envío de objetos, pues en el envío de páginas se gastará mucho
tiempo en enviar objetos que posiblemente nunca se necesitarán. Incluso con una interconexión rápida, las
sobrecargas y latencias de las comunicaciones, no el volumen real de datos a enviar, se convierten en un
cuello de botella. En este escenario sería preferible el envío de páginas.

b. Dos ventajas de tener una caché de objetos en vez de una caché de páginas, incluso si se emplea el
envío de páginas, son:
i. Cuando un cliente se ejecuta fuera del espacio caché, puede reemplazar objetos sin reemplazar
páginas enteras. La reducción de la granularidad del almacenamiento caché podría dar como resultado un
mejor ratio de aciertos caché.

ii. Es posible para el servidor pedir a los clientes la devolución de algunos de los bloqueos que
almacenan, pero que no necesitan (liberación de bloqueos). De este modo, existe la posibilidad de mayor
concurrencia. Si se emplea caché de páginas, esto no es posible.

18.6 ¿Qué es la liberación de bloqueos y bajo qué condiciones es necesaria? ¿Por qué no es necesario si la
unidad de envío de datos es un elemento?

Respuesta: En un sistema cliente servidor con envío de páginas, cuando un cliente solicita un elemento el
servidor generalmente concede un bloqueo, no sobre el elemento solicitado, sino sobre la página que lo
contiene, concediendo de este modo implícitamente bloqueos sobre todos los elementos de la página. Los
otros elementos de la página se dice que están preextraídos. Si algún otro cliente posteriormente solicita uno
de los elementos preextraídos, el servidor puede pedir al propietario del bloqueo de la página que retorne el
bloqueo sobre este elemento. Si el dueño del bloqueo de la página no necesita este elemento, desbloquea el
bloqueo de la página que contiene al elemento, bloquea sobre todos los elementos a los que está accediendo
en realidad y, después, devuelve los bloqueos de los elementos no deseados. El servidor puede entonces
conceder el último bloqueo solicitado.
Si la unidad de datos enviados es un elemento, no hay bloqueos de granularidad gruesa; incluso si se
emplea pre extracción, se implementa generalmente mediante la concesión de bloqueos individuales sobre
cada uno de los elementos preextraídos. De este modo, cuando el servidor solicita la devolución de un
bloqueo, no es necesario desbloquear, el bloqueo requerido sólo se devuelve si el cliente no lo utiliza.

18.7 Suponga que se encuentra a cargo de las operaciones de la base de datos de una empresa cuyo
trabajo principal es el de procesar transacciones. Suponga que la empresa crece rápidamente cada año y que el
sistema informático actual se ha quedado pequeño. Cuando escoja una nueva computadora paralela, ¿qué
factor será más importante: la ganancia de velocidad, la ampliabilidad por lotes o la ampliabilidad de las
transacciones? ¿Por qué?

Respuesta: Con el aumento del grado de las operaciones, se espera que aumente el número de transacciones
remitidas por unidad de tiempo. Por otro lado, no sería de esperar que la mayoría de la transacciones
individuales crecieran más ni que, dada una transacción, se requiriese que se ejecutara más rápidamente ahora
de cómo lo que hacía antes. Por lo tanto, la ampliabilidad de las transacciones es la medida mas relevante en
este escenario.

18.8 Supóngase una transacción escrita en C con código SQL incorporado, que emplea el 80% del tiempo
en ejecutar el código SQL y el 20% restante en el código C. ¿Qué ganancia de velocidad puede esperarse si
sólo se paraleliza el código SQL? Justifíquese la respuesta.

Respuesta: Dado que la parte que no puede ser paralelizada representa el 20% del tiempo de ejecución total,
la mejor ganancia de velocidad que se puede esperar ha de ser menor que 5.

18.9 En un sistema de procesamiento de transacciones, ¿cuáles son los factores que trabajan en contra de
la ampliabilidad lineal?. ¿Cuál de esos factores es probablemente el más importante en cada una de las
siguientes arquitecturas: memoria compartida, disco compartido y sin compartimiento?

Respuesta: El aumento de los conflictos por los recursos compartidos impide la ampliabilidad lineal con el
aumento del paralelismo. En un sistema de memoria compartida, los conflictos por memoria (lo cual implica
conflictos del bus) dará como resultado una caída de la escalabilidad con incremento del paralelismo. En un
sistema de disco compartido, hay conflicto por los accesos al disco y al bus, lo cual afecta a la ampliabilidad.
En un sistema sin compartimiento, la sobrecarga de las comunicaciones entre procesos serán el principal
factor de impedimento. Dado que no hay memoria compartida, la adquisición de bloqueos y otras actividades
que requieren el paso de mensajes entre procesos, tomarán más tiempo con el incremento de paralelismo.

18.10 Considérese un banco que dispone de un conjunto de sedes, en cada una ejecutándose un sistema de
base de datos.
Supóngase que la transferencia electrónica de dinero entre ellas es el único modo de interacción de las bases
de datos. ¿Pude calificarse como distribuido un sistema así? ¿Por qué?

Respuesta: En un sistema distribuido, todos los sitios generalmente ejecutan el mismo software de gestión de
base de datos y comparten un esquema global. Cada sitio aporta un entorno para la ejecución, tanto de
transacciones globales iniciadas en sitios remotos, como de transacciones locales. El sistema descrito en la
pregunta no tiene estas propiedades y, por lo tanto, no puede calificarse como una base de datos distribuida.

18.11 Considérese una red basada en líneas de acceso telefónico, en la que los sitios se comunican
periódicamente, por ejemplo, todas las noches. Estas redes suelen tener un servidor y varios clientes. Los
sitios que actúan como clientes están conectados sólo con el servidor e intercambian los datos con el resto de
clientes, almacenándolos en el servidor y recuperando los almacenados por otros clientes en el servidor. ¿Cuál
es la ventaja de tal arquitectura frente a una en la que un sitio pueda intercambiar datos con otro mediante
acceso telefónico directo?

Respuesta: Con el servidor central, cada sitio no ha de recordar con qué sitio contactar, cuando se solicita un
determinado elemento de datos. El servidor central sólo necesita recordar esto, de tal modo que los elementos
de los datos pueden moverse alrededor fácilmente, dependiendo de los sitios a los que acceden los elementos
más frecuentemente. Otras tareas de mantenimiento también están centralizadas en vez de distribuidas,
haciendo el sistema más fácil de desarrollar y mantener. Naturalmente, está el inconveniente de un cierre
total, en caso de que el servidor llegue a estar no disponible. Incluso si está ejecutándose, puede convertirse en
un cuello de botella porque cada petición ha de encaminarse través de él.
CAPITULO 19

BASES DE DATOS DISTRIBUÍDAS

Las bases de datos distribuidas, en general, y las bases de datos heterogéneas, en particular, están aumentando
de importancia, dado que las organizaciones intentan integrar sus bases de datos a través de fronteras físicas y
organizacionales. La interconexión de estas bases de datos para crear una base de datos distribuida o múltiple
es, de hecho, crucial para la competitividad de muchas compañías. Este capítulo reconsidera las cuestiones
tratadas anteriormente en el texto, tales como el procesamiento de consultas y el control de concurrencias y
recuperaciones, desde el punto de vista de las bases de datos distribuidas.
Este es un capítulo extenso y apropiado sólo para un curso avanzado. Se pueden elegir temas
sencillos para su inclusión en un curso de introducción. Una buena alternativa incluye almacenamiento
distribuido, heterogeneidad y compromiso de dos fases.

Cambios a la tercera edición:


Este capítulo ha cambiado significativamente respecto de la edición anterior.

• El énfasis en la transparencia de la edición anterior ha sido abandonado y, en su lugar, el capítulo comienza


considerando la diferencia entre bases de datos distribuidas heterogéneas y homogéneas.

• Se han abandonado todos los detalles del compromiso de tres fases, dado que no se usa mucho en la
práctica.

• Se ha dado cobertura a los modelos alternativos del procesamiento de transacciones en el Apartado 19.4.3,
con énfasis en el enfoque basado en los mensajes persistentes para las transacciones distribuidas.

• La duplicidad con niveles débiles de consistencia, la cuál es ampliamente usada en la práctica, se cubre
ahora en el Apartado 19.5.3.

• Se han eliminado los algoritmos distribuidos para la detección de interbloqueos, dado que son demasiado
complicados y caros para ser prácticos.

• Se ha introducido un tratamiento detallado de la gestión de fallos, para la alta disponibilidad aportada en las
bases de datos distribuidas (Apartado 19.6).

• Las bases de datos heterogéneas se tratan ahora con mayor detalle en el Apartado 19.8, mientras que los
detalles de los niveles débiles de secuencialidad en las bases de datos múltiples se han trasladado al capítulo
24.

• Se ha introducido en esta edición (Apartado 19.9) el tratamiento de sistemas de directorio, con énfasis en
LDAP.
Ejercicios

19.1 Discútanse las ventajas relativas de las bases de datos centralizadas y de las distribuidas.

Respuesta:
• Un sistema de bases de datos distribuido permite al usuario un acceso transparente y adecuado a los datos
que no están almacenados en el sitio, mientras permite a cada sitio el control sobre sus propios datos locales.
Una base de datos distribuida puede ser más segura que un sistema centralizado porque, si un sitio falla, la
base de datos puede seguir funcionando pero, si el sistema centralizado falla, la base de datos no puede
continuar por más tiempo con su operación normal. Además, una base de datos distribuida permite la
ejecución paralela de consultas y posibilita la división de una consulta en varias partes, para incrementar la
productividad.

• Un sistema centralizado en más fácil de diseñar e implementar. Un sistema centralizado es más barato de
operar porque no se han de enviar mensajes.

19.2 Explíquense las diferencias entre transparencia de la fragmentación, transparencia de las réplicas y
transparencia de la ubicación.

Respuesta:
a. Con transparencia de la fragmentación, el usuario del sistema no es consciente de ninguna
fragmentación que el sistema haya implementado. Un usuario puede formular consultas contra relaciones
globales y el sistema realizará la transformación necesaria para generar el resultado correcto.

b. Con transparencia de las réplicas el usuario no es consciente de ninguna replicación de datos. El


sistema debe impedir operaciones inconsistentes sobre los datos. Esto requiere algoritmos de control de
concurrencia más complejos.

c. Transparencia de la ubicación significa que el usuario no es consciente de donde están almacenados


los datos.
El sistema debe encaminar los datos solicitados hacia los sitios apropiados.

19.3 Indíquese lo que diferencia a una base de datos distribuida diseñada para una red de área local, de
otra diseñada para una red de área amplia.

Respuesta: La transferencia de datos sobre una red de área local (LAN) es mucho más rápida sobre una red
de área ancha (WAN). Así, la replicación y la fragmentación no aumentarán la productividad y la velocidad
sobre una LAN, tanto como en una WAN. Pero incluso en una LAN, la replicación tiene su utilidad
incrementando la fiabilidad y disponibilidad.

19.4 Indíquese en qué momento resulta útil tener réplicas de los datos o tenerlos fragmentados.
Explíquese la respuesta.

Respuesta: La replicación es útil cuando hay numerosas transacciones de sólo lectura en diferentes sitios,
esperando acceder a los mismos datos. Todas ellas se pueden ejecutar rápidamente en paralelo, accediendo a
datos locales. Pero las actualizaciones se hacen difíciles con la replicación.
La fragmentación es útil si las transacciones sobre diferentes sitios tienden a acceder a partes diferentes de la
base de datos.
19.5 Explíquense los conceptos de transparencia y de autonomía. Indíquese el motivo de que estos
conceptos sean deseables desde el punto de vista de los factores humanos.

Respuesta: La autonomía es el grado de control que tiene un sitio concreto sobre la base de datos local. Es
importante porque los usuarios del sitio quieren accesos rápidos y correctos a los elementos de datos locales.
Esto es especialmente cierto cuando se consideran los datos locales a los que más frecuentemente se accederá
en una base de datos. La transparencia oculta la naturaleza distribuida de la base de datos. Esto es importante
porque no se debería exigir a los usuarios conocer nada sobre la localización, replicación, fragmentación u
otros aspectos de la implementación de la base de datos.

19.6 Para crear un sistema distribuido con elevada disponibilidad hay que conocer los tipos de fallos que
pueden producirse.
a. Indíquense los tipos de fallos posibles en los sistemas distribuidos.
b. Indíquense los elementos de la lista de la pregunta a, que también sean aplicables a un sistema
centralizado.

Respuesta:
a. Los tipos de fallos que pueden ocurrir en un sistema distribuido incluyen
i. Fallo de la computadora (fallo de un sitio).
ii. Fallo del disco.
iii Fallo de comunicaciones.

b. Los dos primeros tipos de fallos también pueden suceder en sistemas centralizados.

19.7 Considérese un fallo que se produce durante la ejecución de C2F para una transacción. Para cada
fallo posible de los indicados en el Ejercicio 19.6.a, explíquese el modo en que C2F asegura la atomicidad de
la transacción a pesar del fallo.

Respuesta: Una prueba de que C2F garantiza compromisos/abortos atómicos, a pesar de fallos en sitios y
enlaces, es lo que sigue. La idea principal es que, después que todos los sitios contesten con un mensaje <T
preparada>, sólo el coordinador de una transacción puede tomar una decisión de compromiso o aborto.
Cualquier compromiso o aborto posterior por un sitio, sólo puede tener lugar después que constate la decisión
del coordinador, bien directamente desde el coordinador o indirectamente desde otro sitio. Supóngase que se
enumeran los casos para el aborto de un sitio y después para el compromiso.
a. Un sitio puede abortar una transacción T (grabando un registro del registro histórico <T abortada>)
sólo bajo las siguientes circunstancias:
i. No se ha grabado aún un registro del registro histórico <T preparada>. En este caso el coordinador
no podría tenerlo y no recibirá un mensaje <T preparada> o <T comprometida> desde este sitio. Por lo
tanto, sólo el coordinador puede tomar una decisión de abortar.

ii. Se ha grabado un registro del registro histórico <T preparada>, pero al consultar descubre que
algún otro sitio tiene un registro del registro histórico <T abortada>. En este caso lo correcto es abortar,
porque ese otro sitio habría constatado la decisión del coordinador (directa o indirectamente) antes de abortar.

iii Es el propio coordinador. En este caso ningún sitio habría comprometido, o comprometerá en el
futuro, porque las decisiones de comprometer sólo las puede realizar el coordinador.

b. Un sitio puede comprometer una transacción T (grabando un registro del registro histórico <T
comprometida>) sólo bajo las siguientes circunstancias:

i. Se ha grabado un registro del registro histórico <T preparada> y al consultar descubre que algún
otro sitio tiene un registro del registro histórico <T comprometida>. En este caso lo correcto es
comprometer, porque ese otro sitio habría constatado la decisión del coordinador (directa o indirectamente)
antes de comprometer.

ii. Es el propio coordinador. En este caso ningún otro sitio participante puede abortar o habría
abortado, porque las decisiones de hacerlo sólo las puede realizar el coordinador.

19.8 Considérese un sistema distribuido con dos sitios, A y B. Indíquese si el sitio A puede distinguir
entre:
• B deja de funcionar.
• El enlace entre A y B deja de funcionar.
• B está extremadamente sobrecargado y su tiempo de respuesta es cien veces el habitual.

Indíquense las implicaciones de la respuesta para la recuperación de los sistemas distribuidos.

Respuesta: El sitio A no puede distinguir entre los tres casos hasta que se reanude la comunicación con el
sitio B. La acción que realice mientras B esté inaccesible debe ser correcta, independientemente de cual de
estas situaciones haya ocurrido realmente, y debe ser tal que B pueda reintegrarse consistentemente en el
sistema distribuido, una vez que se restaure la comunicación.

19.9 El esquema de mensajería persistente descrito en este capítulo, depende de las marcas temporales
combinadas con el desecho de los mensajes recibidos, si son demasiado antiguos.
Propóngase un esquema alternativo basado en los números de secuencia, en lugar de las marcas temporales.

Respuesta: Se puede tener un esquema basado en números secuenciales, similar al basado en marcas
temporales. Se marca cada mensaje con un número secuencial que es único para el par (sitio emisor, sitio
receptor). El número se incrementa en 1 por cada nuevo mensaje enviado desde el sitio emisor al receptor.
El sitio receptor lo almacena y reconoce que ha recibido el mensaje, sólo si también ha recibido
todos los mensajes de números inferiores; el mensaje se almacena en la relación mensajes-recibidos.
El sitio emisor retransmite un mensaje hasta que recibe un acuse de recibo del sitio receptor,
conteniendo el número de secuencia del mensaje transmitido, o uno superior. Una vez que se recibe el acuse
de recibo, se puede borra el mensaje de la cola de su cola de envío.
El sitio de recepción elimina todos los mensajes que recibe con un número de secuencia inferior al
del menor mensaje almacenado, desde el sitio de envío. El sitio de recepción elimina todos los mensajes de la
relación mensajes-recibidos, excepto los de número más recientes de cada sitio emisor (los mensajes sólo se
pueden eliminar después de ser procesados localmente).
Nótese que esta técnica requiere una sobrecarga fija (y pequeña) en el sitio receptor, por cada sitio
emisor, independientemente del número de mensajes recibidos. En cambio, la técnica de marcas temporales
requiere un espacio extra por cada mensaje. La técnica de marcas temporales tendría una sobrecarga de
almacenamiento menor, si el número de mensajes recibidos dentro del intervalo de interrupción fuera pequeño
comparado con el número de sitios mientras que, de lo contrario, la técnica de números secuenciales tendría
una sobrecarga inferior.

19.10 Se da un ejemplo en que el enfoque de leer uno, escribir todos los disponibles conduzca a un estado
erróneo.

Respuesta: Considérese el saldo de una cuenta, replicado en N sitios. Supóngase un saldo actual de 100€
consistente en todos los sitios. Sean dos transacciones T1 y T2, cada una depositando 10€ en la cuenta. Así, el
saldo sería de 120€ después que ambas transacciones se ejecutaran. Supongamos que las transacciones se
ejecutan secuencialmente: T1 primero y después T2 . Supóngase que uno de los sitios, por ejemplo s, no esté
disponible cuando se ejecute T1 y que la transacción T2 lea el saldo desde el sitio s. Se puede ver que el saldo
en el sitio principal sería, al final, de 110€.

19.11 Si se aplica una versión distribuida del protocolo de granularidad múltiple del Capítulo 16 a una base
de datos distribuida, el sitio responsable del DAG puede convertirse en un cuello de botella. Supóngase que se
modifica ese protocolo de la manera siguiente:
• Sólo se permiten en la raíz bloqueos en modo tentativo.
• A todas las transacciones se les conceden, de manera automática, todos los bloqueos en modo tentativo
posibles.

Muéstrese que estas modificaciones alivian el problema sin permitir planificaciones no secuenciables.

Respuesta: La secuencialidad está asegurada dado que no se han cambiado las reglas del protocolo de
granularidad múltiple. Dado que las transacciones acuerdan automáticamente todos los bloques tentativos
sobre el nodo raíz y que no se dan otros tipos de bloqueos en él, no hay necesidad de enviar ninguna petición
de bloqueo a la raíz. De este modo se libera el cuello de botella.

19.12 Explíquese la diferencia entre la réplica de datos en los sistemas distribuidos y el mantenimiento de
sitios remotos de respaldo.

Respuesta: En los sistemas de respaldo remotos todas las transacciones se realizan en el sitio principal y los
datos se replican sobre el sitio remoto de respaldo. El sitio remoto de respaldo se mantiene sincronizado con
las actualizaciones sobre el sitio principal mediante el envío de todos los registros del registro histórico.
Siempre que falla el sitio principal, el sitio de respaldo remoto asume los procesos. Los sistemas distribuidos
ofrecen mayor disponibilidad teniendo múltiples copias de los datos en diferentes sitios, mientras que los
sistemas remotos de respaldo ofrecen menor disponibilidad a un coste inferior y sobrecargas de ejecución.
En un sistema distribuido, el código de la transacción se ejecuta en todos los sitios, mientras que en
un sistema remoto de respaldo sólo se ejecuta en el sitio principal. La transacciones de los sistemas
distribuidos siguen el compromiso de dos fases para tener los datos en estado consistente, mientras que un
sistema remoto de respaldo no sigue el compromiso de dos fases y evita las sobrecargas relacionadas.

19.13 Se da un ejemplo en el que la réplica perezosa pueda conducir a un estado inconsistente de la base de
datos, aunque las actualizaciones obtengan un bloqueo exclusivo sobre la copia principal (maestra).

Respuesta: Considérese el saldo de una cuenta, replicado en N sitios. Supóngase un saldo actual de 100€
consistente en todos los sitios. Sean dos transacciones T1 y T2, cada una depositando 10€ en la cuenta. Así, el
saldo sería de 120€ después que ambas transacciones se ejecutaran. Supongamos que las transacciones se
ejecutan secuencialmente: T1 primero y después T2 . Supóngase que la copia del saldo en uno de los sitios, por
ejemplo s, no sea consistente – debido a una estrategia de réplica perezosa – con la copia principal después de
que se ejecute la transacción T1 y que la transacción T2 lea esta copia del saldo. Se puede ver que el saldo en
el sitio principal sería, al final, de 110€.

19.14 Estúdiense y resúmanse las facilidades que el sistema de bases de datos que se está utilizando ofrece,
para tratar los estados inconsistentes que pueden alcanzarse con la propagación perezosa de las
actualizaciones.

Respuesta: PENDIENTE.

19.15 Discútanse las ventajas e inconvenientes de los dos métodos presentados en el Apartado 19.5.2, para
la generación de marcas temporales únicas globalmente.

Respuesta: El enfoque centralizado tiene el problema de un posible cuello de botella en el sitio principal y el
de elegir un nuevo sitio central si dejara de funcionar. El enfoque centralizado tiene el problema de que deben
intercambiarse muchos mensajes para mantener el sistema justo, o un sitio puede situarse por delante de todos
los otros y dominar la base de datos.
19.16 Considérese el siguiente algoritmo de detección de interbloqueo. Cuando la transacción Ti, en el
sitio S1, solicita un recurso a Tj, en el sitio S3, se envía un mensaje de solicitud con la marca temporal n. Se
inserta el arco (Ti, Tj, n) en el grafo local de espera de S1. El arco (Ti, Tj, n) sólo se inserta en el grafo local de
espera de S3 , si Tj ha recibido el mensaje de solicitud y no se puede conceder de manera inmediata el recurso
solicitado. La solicitud de Ti a Tj en el mismo sitio se trata de la manera habitual; no se asocia ninguna marca
temporal con el arco (Ti, Tj). El coordinador central invoca el algoritmo de detección enviando el mensaje de
inicio a cada sitio del sistema.
Al recibir este mensaje, cada sitio envía al coordinador su grafo local de espera.
Obsérvese que ese grafo contiene toda la información local que el sitio tiene sobre el estado del grafo real. El
grafo de espera refleja un estado instantáneo del sitio, pero no está sincronizado con respecto a ningún otro
sitio. Cuando el controlador ha recibido una contestación de cada sitio crea un grafo de la manera siguiente:
• El grafo contiene un vértice para cada transacción del sistema.
• El grafo tiene un arco (Ti, Tj) si y sólo si
ð Hay un arco (Ti, Tj) en uno de los grafos de espera.
ð Aparece un arco (Ti, Tj, n) (para algún n) en más de un grafo de espera.

Pruébese que, si hay un ciclo en el grafo creado, el sistema se halla en estado de interbloqueo y que, si no hay
ningún ciclo en el grafo creado, el sistema no se hallaba en estado de interbloqueo cuando comenzó la
ejecución del algoritmo.

Respuesta: Supóngase un ciclo Ti g Tj g · · · g Tm g Ti que existe en el grafo construido por el


controaldor. Los arcos del grafo serán locales de la forma (Tk, Tl) o distribuidos de la forma (Tk, Tl, n). Cada
arco local (Tk, Tl) implica indudablemente que Tk está esperando a Tl. Dado que un arco distribuido (Tk, Tl, n)
se inserta en el grafo sólo si la petición de Tk ha alcanzado Tl y Tl no puede liberar el bloqueo
inmediatamente, Tk está, efectivamente, esperando a Tl . Por lo tanto, cada arco del ciclo representa, de hecho,
una transacción esperando a otra. Para una prueba detallada de que esto implica un interbloqueo, consúltese
Stuart et al [1984].

Ahora se va a probar la implicación opuesta. Tan pronto como se descubre que Tk está esperando a Tl:
a. se añade un arco local (Tk, Tl) si ambas están en el mismo sitio.
b. El arco (Tk, Tl, n) se añade en ambos sitios si Tk y Tl están en sitios diferentes.

Por lo tanto, si el algoritmo fuera capaz de agrupar en el mismo instante todos los grafos locales de espera, se
descubriría definitivamente un ciclo en el grafo construido, en caso de que haya una espera circular en ese
instante. Si hay una espera circular en el instante en que el algoritmo comienza la ejecución, ninguno de los
arcos que participan en ese ciclo pueden desaparecer hasta que termine el algoritmo. Por lo tanto, incluso si el
algoritmo no puede agrupar todos los grafos locales al mismo tiempo, se detectará igualmente a cualquiera de
los ciclos que existían justo antes de que se iniciase.

19.17 Considérese una relación que está fragmentada horizontalmente por número-planta:

empleado (nombre, dirección, sueldo, número-planta)

Supóngase que cada fragmento tiene dos réplicas: una almacenada en el sitio de Madrid y otra almacenada
localmente en el sitio de la planta. Descríbase una buena estrategia de procesamiento de las consultas
siguientes formuladas en el sitio de Lima.
a. Hallar todos los empleados de la planta de Managua.
b. Hallar el sueldo promedio de todos los empleados.
c. Hallar el empleado mejor pagado de cada uno de los sitios siguientes: Buenos Aires, Rosario,
Córdoba, Bahía Blanca.
d. Hallar el empleado peor pagado de la compañía.
Respuesta:
a. i. Enviar la consulta Õnombre(empleado) a la planta de Managua.
ii. Permitir que Managua devuelva la respuesta

b i. Calcular el promedio en Madrid.


ii. Enviar la respuesta a Lima.

c. i. Enviar la consulta para encontrar el empleado mejor pagado a Buenos Aires, Rosario,
Córdoba y Bahía Blanca.
ii. Calcular las consultas en estos sitios.
iii Devolver las respuestas a Lima.

d. i. Enviar la consulta, para encontrar el empleado peor pagado, a Madrid.


ii. Calcular la consulta en Madrid.
iii Enviar la respuesta a Lima.

19.18 Considérense las relaciones

empleado (nombre, dirección, sueldo, número-planta)


máquina (número-máquina, tipo, número-planta)

Supóngase que la relación empleado está fragmentada horizontalmente por número-planta y que cada
fragmento se almacena localmente en el sitio de su planta correspondiente. Supóngase que la relación
máquina se almacena entera en el sitio de Sucre. Descríbase una buena estrategia para el procesamiento de
cada una de las consultas siguientes.
a. Hallar todos los empleados de la planta que contiene el número de máquina 1130.
b. Hallar todos los empleados de las plantas que contienen máquinas cuyo tipo sea “trituradora”.
c. Hallar todas las máquinas de la planta de Almadén.
d. Hallar empleado |x| máquina.

Respuesta:
a. i. Realizar Õnúmero-planta (snúmero-máquina = 1130 (máquina)) en Sucre.
ii. Enviar la consulta Õnombre (empleado) a todos los sitios que están en el resultado de la
consulta previa.
iii Estos sitios calculan las respuestas.
iv Unir las respuestas en el sitio destino.
b Esta estrategia es la misma que la 0.a, salvo que el primer paso debería realizar
Õnúmero-planta (stipo =“trituradora” (máquina)) en Sucre.
c. i. Realizar snúmero-planta = x (máquina) en Sucre, donde x es el número de planta para Almadén.
ii. Enviar las respuestas al sitio de destino.
d. Estrategia 1:
i. Agrupar máquina en Sucre por número de planta.
ii. Enviar los grupos a los sitios con el correspondiente número de planta.
iii Realizar una reunión local entre los datos locales y los recibidos.
iv Unir los resultados en el sitio destino.

Estrategia 2: Enviar la relación máquina a Sucre y todos los fragmentos de la relación empleado al
sitio de destino. Entonces, realizar la reunión en el sitio de destino.

Hay paralelismo en el cálculo de la reunión, de acuerdo con la primera estrategia, pero no con la segunda. No
obstante, en una WAN, la cantidad de datos a enviar es el principal factor de coste. Se espera que cada planta
tendrá más de una máquina, por lo que el resultado de la reunión local en cada sitio será un producto cruzado
de las tuplas de los empleados y las máquinas de la planta. El tamaño de este producto cruzado es mayor que
el del fragmento de empleado en el sitio. Como consecuencia de la segunda estrategia, llevará a una
disminución del envío de datos y será más eficiente.

19.19 Para cada una de las estrategias del Ejercicio 19.18, indíquese el modo en que la elección de la
estrategia depende:
a. Del sitio en el que se formuló la consulta
b. Del sitio en el que se desea obtener el resultado

Respuesta:
a. Suponiendo que el coste de enviar la consulta es mínimo, el sitio al que la consulta sea remitida no
afecta a la estrategia para evaluar la consulta.

b. Por la primera consulta, se averigua que los números de planta donde está presente el número de
máquina 1130, se corresponden con Sucre. Entonces, las tuplas de los empleados en todas estas plantas se
envían al sitio de destino. Se puede ver que esta estrategia es más o menos independiente del sitio de destino.
Lo mismo se puede decir de la segunda consulta. Para la tercera consulta, la selección se realiza en Sucre y
los resultados se envían al sitio de destino. Esta estrategia es, obviamente, independiente del sitio de destino.
Para la cuarta consulta se tienen dos estrategias. La primera realiza reuniones locales en todos los
sitios de las plantas y sus resultados se unen en el sitio de destino. En la segunda estrategia, la relación
máquina en Sucre, así como todos los fragmentos de la relación empleado, se envían primero al destino,
donde se realiza la operación reunión. No hay una forma evidente de optimizar estas dos estrategias según el
sitio de destino. En la respuesta al Ejercicio 19.18 se vio la razón por la que la segunda estrategia se esperaba
que, como resultado, diera menos envíos de datos que la primera. Esa razón es independiente del sitio de
destino y por lo tanto se puede, en general, preferir la estrategia dos a la uno, sin importar el sitio de destino.

19.20 Calcúlese r |x s para las relaciones de la Figura 19.1.

Respuesta: El resultado es el siguiente:

r|xs A B C
1 2 3
5 3 2

19.21 ¿Es necesariamente ri|xrjigual a rj|xri? ¿En qué circunstancias es cierto que ri|xrj=rj|xri?

Respuesta: En general, ri|xrj¹rj|xri Esto se puede ver fácilmente desde


Figura 19.1 Relaciones para el Ejercicio 19.20.

el Ejercicio 19.20, en el cual r|xs¹s|xrr|xs

s|xr C D E
3 4 5
3 6 8
2 3 2

Por definición, ri |x rj = ÕRi (ri |x| rj) y rj |x ri= ÕRj (ri |x| rj ), donde Ri y Rj son los esquemas de ri y rj
1 1

respectivamente. Para que ÕRi (ri |x| rj) sea siempre igual a ÕRj (ri |x| rj ), los esquemas Ri y Rj deben ser el
1 1

mismo.

19.22 Dado que la funcionalidad LDAP puede implementarse sobre un sistema de bases de datos, indíquese
la necesidad de la norma LDAP.

Respuesta: Las razones son:

Los protocolos de acceso a directorios son protocolos simplificados que atienden a un tipo limitado
de accesos a datos.

Los sistemas de directorio ofrecen un mecanismo sencillo para nombrar a los objetos de manera
jerárquica, que pueden utilizarse en un sistema distribuido de directorio para especificar la información que se
almacena en cada servidor de directorio. El sistema de directorios puede configurarse para que envíe de
manera automática a un sitio las consultas formuladas en el otro, sin intervención del usuario.

19.23 Descríbase el modo en que se puede utilizar LDAP para ofrecer varias vistas jerárquicas de los datos
sin replicar los datos del nivel básico.

Respuesta: Esto se puede hacer empleando referencias. Por ejemplo, una organización puede mantener su
información sobre departamentos geográficamente (es decir, todos los departamentos en un sitio de la
organización) o por estructuras (es decir, información sobre un departamento desde todos los sitios). Estas dos
jerarquías se pueden mantener definiendo dos esquemas diferentes, con información de los departamentos en
un sitio como la información de base. Las entradas en las dos jerarquías se referirán a la entrada de la
información base, empleando referencias.
CAPITULO 20

BASES DE DATOS PARALELAS

Este capítulo está indicado para un curso avanzado, pero también puede emplearse en proyectos de estudio
independientes por estudiantes de primer curso. El capítulo trata diversos aspectos del diseño de sistemas de
bases de datos paralelas – particionamiento de datos, paralelización de operaciones relacionales individuales y
paralelización de expresiones relacionales. El capítulo también trata brevemente algunos aspectos de sistemas,
tales como la coherencia caché y la resistencia a fallos.
Las aplicaciones más importantes de las bases de datos paralelas hoy son los almacenamientos y los
análisis de grandes cantidades de datos. Por eso, los particionamientos de datos y los procesos de consultas
paralelas se tratan con significativo detalle. La optimización de las consultas, por la misma razón, también es
importante. Sin embargo, la optimización de consultas paralelas todavía no es un problema completamente
resuelto; la búsqueda exhaustiva, empleada por la optimización de consultas secuenciales, es demasiado cara
en un sistema paralelo, forzando el empleo de heurísticos. Así, la optimización de consultas paralelas está en
un área de investigación continua.
La descripción de algoritmos de procesamiento de consultas paralelas, está basada en el modelo sin
compartimiento. Se puede pedir a los estudiantes que estudien como mejorar los algoritmos, si en su lugar se
emplean máquinas de memoria compartida.

Cambios a la tercera edición:


No hay cambios de importancia a la edición anterior.
Ejercicios

20.1 Para cada una de las tres técnicas de división, a saber, por turno rotatorio, por asociación y en rangos,
apórtese un ejemplo de una consulta para la que esa técnica de división proporcione la respuesta más rápida.

Respuesta:
División por turno rotatorio:
Cuando las relaciones son grandes y las consultas leen relaciones enteras, el turno rotatorio da una
buena aceleración y un tiempo de respuesta rápido.

División por asociación:


Para consultas concretas aporta la respuesta más rápida, dado que cada disco puede procesar una
consulta simultáneamente. Si la división por asociación es uniforme, incluso las exploraciones secuenciales de
relaciones completas se pueden realizar eficientemente.

División en rangos:
Para las consultas de rangos, que acceden a pocas tuplas, aporta una respuesta rápida.

20.2 Al llevar a cabo una selección de rango en un atributo dividido en rangos, es posible que sólo haga
falta acceder a un disco. Descríbanse las ventajas e inconvenientes de esta propiedad.

Respuesta: Si hay pocas tuplas en el rango consultado, cada consulta se puede procesar rápidamente en un
sólo disco. Esto permite una ejecución paralela de las consultas, con lo que se reduce la sobrecarga de iniciar
consultas en varios discos.
Por otro lado, si hay muchas tuplas en el rango consultado, a cada consulta le lleva mucho tiempo la
ejecución, a la vez que no hay paralelismo en su ejecución. Además, algunos discos se pueden convertir en
puntos calientes, incrementando aún más el tiempo de respuesta.
La división en rangos híbridos, en la que pequeños rangos (de unos pocos bloques cada uno) se
dividen en forma de turnos rotatorios, aporta las ventajas de una división en rangos sin sus inconvenientes.

20.3 Indíquense los factores que puedan dar lugar a un sesgo, cuando se divide una relación basándose en
uno de sus atributos utilizando:
a. División por asociación
b. División en rangos

En cada uno de los casos anteriores, indíquese lo que se puede hacer para reducir el sesgo.

Respuesta:
a. División por asociación:
Demasiados registros con el mismo valor de los atributos de la asociación, o una función de
asociación elegida pobremente sin las propiedades de aleatoriedad y uniformidad, pueden terminar en una
división sesgada. Para mejorar esta situación, se debería experimentar con mejores funciones de asociación
para esa relación.

b. División en rangos:
Una distribución no uniforme en los valores de los atributos de la división (incluyendo valores
duplicados en los atributos de la división), que no se ha tenido en cuenta por un mal vector de división, es la
principal razón de las divisiones sesgadas. Ordenando la relación en función de los atributos de división y
dividiéndola en n rangos con igual número de tuplas cada uno, se tendrá un buen vector de división con un
sesgo muy bajo.

20.4 Indíquese la forma de paralelismo (entre consultas, entre operaciones o en operaciones) que sea
probablemente más importante para cada una de las tareas siguientes.
a. Incrementar la productividad de un sistema con muchas consultas pequeñas
b. Incrementar la productividad de un sistema con unas pocas consultas grandes, cuando el número de
discos y procesadores es grande.

Respuesta:
a. Cuando hay muchas consultas pequeñas, el paralelismo entre consultas aporta una buena
productividad. Paralelizar cada una de estas pequeñas consultas incrementaría la sobrecarga inicial, sin una
reducción significativa del tiempo de respuesta.

b. Con unas cuantas consultas grandes el paralelismo entre consultas es esencial para alcanzar tiempos
de respuesta rápidos. Dado que hay gran número de procesadores y discos, sólo el paralelismo en operaciones
puede sacar partido del hardware paralelo para consultas que típicamente tienen pocas operaciones, pero que
necesitan procesar cada una un gran número de tuplas.

20.5 Con el paralelismo encauzado, suele resultar adecuado llevar a cabo varias operaciones de un cauce
en un mismo procesador, aunque haya disponibles muchos procesadores.
a. Explíquese el motivo.
b. ¿Serían válidos los argumentos anteriores si la máquina utilizara una arquitectura de memoria
compartida? Explíquense los motivos.
c. ¿Serían válidos los argumentos anteriores con paralelismo independiente? (Es decir, ¿hay casos en
que, incluso si las operaciones no se encauzan y hay muchos procesadores disponibles, sigue siendo
conveniente llevar a cabo varias operaciones en el mismo procesador?)

Respuesta:
a. La ganancia de velocidad que se obtiene paralelizando las operaciones se compensaría con la
sobrecarga de la transferencia de datos, dado que cada tupla producida por un operador habría de transferirse
a su consumidor, que se está ejecutando en un procesador diferente.

b. En una arquitectura de memoria compartida la transferencia de tuplas es muy eficiente. Por lo tanto,
el argumento anterior no se mantiene mucho.

c. Incluso si dos operaciones son independientes, puede ser que ambas suministren sus resultados a un
tercer operador en común. En ese caso, ejecutar las tres en el mismo procesador puede ser mejor que transferir
tuplas entre los procesadores.

20.6 Se da un ejemplo de una reunión , que no sea una equirreunión simple, para la que pueda utilizarse
paralelismo de particiones. ¿Qué atributos deberían utilizarse para la división?

Respuesta: Se dan dos ejemplos de tales reuniones.


a. r |x| (r.A = s.B) Ù (r.A < s.C) s
Aquí se tiene condiciones extra que se pueden verificar después de la reunión.
Por lo tanto, el paralelismo de particiones es útil.

b. r |x| (r.A ³ (?s.B/20?)*20) Ù (r.A<((?s.B/20?)+1)*20) s


Esta es una consulta en la que una tupla r y una tupla s se reúnen entre sí, en el caso de que caigan
dentro del mismo rango de valores. Por lo tanto, el paralelismo de particiones aplica naturalmente a este
escenario.

Para ambas consultas, r debería estar particionada sobre el atributo A y s sobre el atributo B.

20.7 Considérese el procesamiento de reuniones utilizando fragmentos y réplicas simétricos con división
en rangos. ¿Cómo se puede optimizar la evaluación si la condición de reunión es de la forma | r.A - s.B| £ k,
donde k es una constante pequeña. Aquí, | x | denota el valor absoluto de x. Una reunión con una condición de
reunión así, se denomina reunión de banda.

Respuesta: La relación r está dividida en n divisiones, r0, r1, . . . , rn-1 y s está también dividida en n
divisiones, s0, s1, . . . , sn-1. Las divisiones están replicadas y asignadas a los procesadores como se muestra en
la figura siguiente.

Cada fragmento está replicado sólo en 3 procesadores, a diferencia del caso general, donde está
replicado sobre n procesadores. El número de procesadores requeridos ahora es aproximadamente 3n, en vez
de n2 del caso general. Por lo tanto, dado el mismo número de procesadores, se pueden dividir las relaciones
en más fragmentos con esta optimización, es decir, haciendo más rápida la reunión local.

20.8 Descríbase una buena manera de paralelizar lo siguiente.


a. la operación diferencia
b. la agregación utilizando la operación count
c. la agregación utilizando la operación count distinct
d. la agregación utilizando la operación avg
e. la reunión exterior por la izquierda, si la condición de reunión sólo implica igualdad
f. la reunión exterior por la izquierda, si la condición de reunión implica comparaciones distintas de la
igualdad
g. la reunión exterior completa, si la condición de reunión implica comparaciones distintas de la
igualdad

Respuesta:
a. Se puede paralelizar la operación diferencia dividiendo las relaciones en todos los atributos y
calculando las diferencias localmente, en cada procesador.
Como en la agregación, el coste de transferir las tuplas durante la división se puede reducir calculando las
diferencias parcialmente en cada procesador, antes de la división.

b. Supóngase la referencia al atributo “group-by” como atributo A y al atributo sobre el que opera la
función agregación, como atributo B. count se realiza como sum (mencionada en el libro) salvo que, en vez
de la suma, lo que se transfiere al procesador de destino correcto es un recuento del número de valores del
atributo B, por cada valor del atributo A. Después de la división, los recuentos parciales desde todos los
procesadores se suman localmente en cada procesador, para obtener el resultado final.
c. Por esto, los recuentos parciales no se pueden sumar localmente antes de la división. En cambio,
cada procesador transfiere todos los valores únicos de B, por cada valor de A, al procesador de destino
correcto. Después de la división, cada procesador cuenta localmente el número de tuplas únicas por cada valor
de A y, a continuación, obtiene el resultado final.

d. De nuevo, esto se puede implementar como sum salvo que, por cada valor de A, un sum de los
valores de B, así como un count del número de tuplas del grupo, se transfiere durante la división.
Seguidamente cada procesador produce su resultado local, dividiendo la suma total por el número total de
tuplas, para cada valor de A asignado a su división.

e. Esto se puede realizar como una reunión natural dividida. Después de la división, cada procesador
calcula localmente la reunión externa por la izquierda, empleando cualquiera de la estrategias del Capítulo 13.

f. La reunión externa por la izquierda se puede calcular empleando una ampliación de la técnica
Fragmentos y Réplicas, para calcular no equirreuniones. Considérese r ]x| s. Las relaciones están divididas y r
|x| s se calcula en cada sitio. También se agrupan las tuplas de r que no se correspondieron con ninguna tupla
de s; Supóngase que se denota como di al conjunto de estas tuplas colgantes en el sitio i. Después de realizar
el paso anterior en cada sitio, por cada fragmento de r, se toma la intersección de los di’s desde cada
procesador en el que estaba replicado el fragmento de r. Las intersecciones dan el conjunto real de tuplas
colgantes; estas tuplas se rellenan con nulos y se añaden al resultado. Las intersecciones, seguidas por la suma
de las tuplas rellenadas al resultado, se pueden hacer en paralelo mediante divisiones.

g. El algoritmo es básicamente lo mismo que antes, salvo que cuando se combinan los resultados, el
procesamiento de las tuplas colgantes debe hacerse para ambas relaciones.

20.9 Recuérdese que los histogramas se utilizan para generar particiones en rangos con carga equilibrada.
a. Supóngase que se tiene un histograma en el que los valores varían de 1 a 100 y están divididos en 10
rangos, 1-10, 11-20, . . ., 91–100, con frecuencias 15, 5, 20, 10, 10, 5, 5, 20, 5, y 5, respectivamente. Se da
una función de división en rangos con carga equilibrada para dividir los valores en cinco particiones.
b. Propóngase un algoritmo para procesar una división en rangos con carga equilibrada con p
particiones, dado un histograma de las distribuciones de frecuencias que contiene n rangos.

Respuesta:
a. Un vector de división que proporciona 5 particiones con 20 tuplas en cada una es: [21, 31, 51, 76] .
Las 5 particiones obtenidas son 1-20, 21-30, 31-50, 51-75 y 76-100. La suposición hecha respecto a este
vector de división es que, en un rango del histograma, cada valor es igualmente probable.

b. Considérese llamar a los rangos del histograma como h1, h2, . . , hh, y a las particiones como p1, p2, .
.. , pp. Supóngase que las frecuencias de los rangos del histograma son n1, n2, . . . , nh . Cada partición debería
contener N/p tuplas, donde N = S hi=1 ni.

Para construir el vector de división con carga equilibrada, se necesita determinar el valor de la tupla kth1, el
valor de la tupla kth2 y así sucesivamente, donde k1 = N/p, k2 = 2N/p etc, hasta kp-1 . El vector de división será
entonces [k1, k2, . . . , kp-1] . El valor de la tupla kthi se determina como sigue. Primero se determina el rango hj
del histograma en el que falla. Suponiendo que todos los valores en un rango son igualmente probables, el
valor kthi será

sj + (ej - sj) * (kij / nj)


donde
sj : primer valor en hj
ej : último valor en hj
kij : ki - S j-1l=1 nl
20.10 Descríbanse las ventajas e inconvenientes de utilizar paralelismo encauzado.

Respuesta:
Ventajas:
No es necesario grabar relaciones intermedias a disco, sólo para leerlas de nuevo inmediatamente.

Inconvenientes:
a. No puede aprovechar los altos grados de paralelismo, dado que las típicas consultas no tienen gran
número de operaciones.
b. No es posible encauzar los operadores que necesitan atender a todas las entradas antes de producir
cualquier salida.
c. Dado que cada operación se ejecuta en un mismo procesador, las más costosas tardan mucho en
terminar. Entonces, a pesar del paralelismo, la ganancia de velocidad será baja.

20.11 Algunos sistemas paralelos de bases de datos guardan otra copia de cada elemento de los datos en
discos conectados a un procesador diferente , para evitar la pérdida de los datos si falla uno de los
procesadores.
a. ¿Por qué es conveniente dividir las copias de los elementos de los datos de un procesador entre
varios procesadores?
b. ¿Cuáles son las ventajas e inconvenientes de utilizar almacenamiento RAID, en lugar de guardar otra
copia de cada elemento de datos?

Respuesta:
a. Las copias de los elementos de los datos de un procesador deberían estar divididas entre otros
procesadores, en vez de almacenarse en el mismo procesador, por las siguientes razones:
• para distribuir mejor entre los procesadores restantes el trabajo que debería hacerse, si el procesador fallara.
• incluso en ausencia de fallos, esta técnica puede en cierto modo ocuparse de los puntos calientes creados por
transacciones de sólo lectura.

b. RAID nivel 0 almacena una copia extra de cada elemento de datos (creación de imagen). Así, esto
es similar a la creación de imágenes realizada por la propia base de datos, excepto que el sistema de la base de
datos no se ha de molestar por los detalles de llevar a cabo la creación de imágenes. Sólo facilita la grabación
al sistema RAID que, automáticamente, realiza la creación de imágenes. A continuación se presentan loas
ventajas e inconvenientes de los otros niveles RAID, en comparación con la creación de imágenes.

Ventajas de los niveles RAID superiores:


i. Menos caros que la creación de imágenes, en términos de requerimientos de espacio en disco.
ii. Mejor velocidad de transferencia para grandes lecturas. De este modo, si predominan estos tipos de
consultas, RAID tiene un tiempo de respuesta más rápido que la creación de imágenes.

Inconvenientes de los niveles RAID superiores:


i. Las escrituras son más caras.
ii. La reconstrucción de un disco destruido es más cara.
CAPITULO 21

DESARROLLO DE APLICACIONES Y ADMINISTRACIÓN

Ejercicios

21.1 ¿Cuál es la razón principal por la que los servlets dan mejor rendimiento que los programas que
utilizan la interfaz de pasarela común (common gateway interface, CGI), pese a que los programas Java suelen
ejecutarse más lentamente que los programas C o C++?

Respuesta: El interface CGI inicia un proceso nuevo para atender a cada solicitud, lo que tiene una
sobrecarga significativa sobre el sistema operativo. Por otro lado, los servlets se ejecutan como hebras de un
proceso existente, evitando estas sobrecargas. Además, el proceso que ejecuta la hebras podría ser el propio
proceso del servidor Web, evitando comunicaciones entre procesos que pueden ser costosas. Así, para tareas
de tamaño moderado, la sobrecarga de Java es menor que la sobrecargas ahorradas al evitar crear y comunicar
procesos.
Para tareas que implican mucha actividad de la CPU, este puede no ser el caso, y empleando CGI
con un programa C o C++, se puede mejorar el rendimiento.

21.2 Indíquense algunas de las ventajas y de los inconvenientes de los protocolos sin conexión frente a los
protocolos que mantienen las conexiones.

Respuesta: La mayoría de los ordenadores pueden aceptar un número limitado de conexiones simultáneas.
Con los protocolos sin conexión las conexiones se interrumpen tan pronto como se atiende la petición y, de
esta manera, otros clientes pueden abrir conexiones. De esta manera, se pueden atender más clientes al mismo
tiempo. Una petición se puede dirigir a cualquier servidor para equilibrar la carga y, si un servidor cae, otro
puede tomar el control sin que el cliente se percate del problema.
El inconveniente de los protocolos sin conexiones es que, cada vez que se envía una petición, ha de
reestablecerse la conexión. También se ha de enviar cada vez información sobre la sesión, en forma de
cookies o campos ocultos. Esto los hace más lentos que los protocolos que mantienen la conexión, en caso de
que se requiera información de estado.

21.3 Indíquense tres maneras en que se puede utilizar el almacenamiento en caché para acelerar el
rendimiento de los servidores Web.

Respuesta: El almacenamiento caché se puede emplear para mejorar el rendimiento, explotando las
similitudes entre las transacciones.
a. Si el código de la aplicación para la atención de cada solicitud necesita abrir una conexión a la base
de datos, que consume tiempo, se puede haber creado con antelación un fondo de conexiones abiertas para
que cada petición utilice una de ellas.
b. Los resultados de una consulta generada por una petición se pueden almacenar en caché. Si la
misma petición llega de nuevo, o se genera la misma consulta, se puede emplear el resultado caché en vez de
establecer una nueva conexión a la base de datos.
c. Se puede almacenar en caché la página Web final, generada en respuesta a la petición. Si la misma
petición llega de nuevo, se puede sacar la página almacenada en la memoria caché.
21.4 a. ¿Cuáles son los tres niveles principales en los que se puede ajustar un sistema de bases de
datos para mejorar su rendimiento?
b. Apórtense dos ejemplos del modo en que se puede realizar el ajuste para cada uno de los
niveles.

Respuesta:
a. Se hace referencia al ajuste del rendimiento de un sistema de base de datos, como es el caso de la
modificación de algunos componentes del sistema para mejorar los tiempos de respuesta de las transacciones,
o la productividad de las transacciones en su conjunto. Los sistemas de bases de datos se pueden ajustar a
diferentes niveles para aumentar el rendimiento; a saber:
i. Diseño del esquema y las transacciones
ii. Gestión de la memoria intermedia y de las transacciones
iii Estructuras de acceso y almacenamiento
iv Hardware: discos, CPU, busses etc.

b. Se describen algunos ejemplos, para ajustar el rendimiento, de algunos de los principales


componentes de un sistema de base de datos.
i. Ajuste del esquema:
En este capítulo se han visto dos ejemplos de ajustes de esquema; a saber; división vertical de una
relación (recíprocamente, reunión de dos relaciones) y desnormalización (recíprocamente, normalización).
Estos ejemplos reflejan el escenario general y las ideas que contiene se pueden aplicar para ajustar otros
esquemas.

ii. Ajuste de las transacciones:


Un enfoque empleado para acelerar la ejecución de las consultas es mejorar su planificación.
Supóngase que se necesita la reunión naturas de dos relaciones, por ejemplo cuenta e impositor, desde el
ejemplo de la base de datos de un banco. Una reunión por mezcla-ordenación (Apartado 13.5.4) sobre el
atributo número-cuenta puede ser más rápida que una simple reunión en bucle anidado sobre las relaciones.
Otras maneras de ajustar transacciones son, descomponiendo las transacciones de actualización de
larga duración y combinando conjuntos de consultas relacionadas en una sola consulta. Ejemplos genéricos de
estos enfoques se dan en este capítulo.
Para los sistemas cliente servidor, en donde la consulta ha de transmitirse desde el cliente al servidor,
el propio tiempo de transmisión de la consulta puede suponer una parte importante del coste total de la
consulta. Empleando procedimientos almacenados se puede reducir significativamente el tiempo de respuesta
de las consultas.

iii Ajuste del gestor de la memoria intermedia:


El gestor de la memoria intermedia puede incrementar o disminuir el número de páginas de la
memoria intermedia, para modificar las tasas de fallo de página. Sin embargo, debe notarse que un gran
número de páginas puede significar altos costes en la gestión de pestillos y en el mantenimiento de otras
estructuras de datos, como las listas libres y las tablas de mapas de páginas.

iv Ajuste del gestor de las transacciones:


La planificación de las transacciones afecta al rendimiento del sistema. Una consulta que calcula
estadísticas para los clientes de cada sucursal del banco, necesitará explorar las relaciones cuenta e impositor.
Durante estas exploraciones no se permitirá actualizar el saldo de ningún cliente. Así, el tiempo de respuesta
para las transacciones de actualización es alto. Las consultas largas se ejecutan mejor cuando hay pocas
tuplas, como es el caso de la noche.
Los puntos de revisión también suponen un coste. Si el tiempo de recuperación no es crítico, es
preferible examinar un registro histórico grande (durante la recuperación), en vez de gastar mucho tiempo
(puntos de revisión) durante la operación normal. Por lo tanto, puede merecer la pena ajustar los intervalos de
los puntos de revisión, de acuerdo con la tasa de caídas y los tiempos de recuperación requeridos

v Ajuste de las estructuras de acceso y almacenamiento:


El tiempo de respuesta de una consulta se puede mejorar creando un índice apropiado sobre la
relación. Por ejemplo, considérese una consulta en la que una impositora pregunta sobre su saldo en una
determinada cuenta. Esta consulta implicaría la exploración de la relación cuenta, si no tiene ningún índice
sobre número-cuenta. Consideraciones similares sobre la indexación también aplican al cálculo de reuniones,
es decir, un índice sobre número-cuenta en la relación cuenta, evita explorar cuenta cuando una se realiza con
impositor una reunión natural de cuenta.
En cambio, la indexación puede perjudicar el rendimiento de las transacciones de actualización.
Supóngase que es necesario actualizar el saldo frecuentemente.
Supóngase también que hay un índice sobre saldo (presumiblemente pata consultas por rangos) en
cuenta. Ahora, por cada actualización del valor del saldo, el índice también habrá de actualizarse. Además, las
actualizaciones concurrentes sobre la estructura de índices requerirán una sobrecarga adicional por bloqueos.
Nótese que ,si no hubiera índice sobre saldo, el tiempo de respuesta de cada actualización no sería mayor. El
tipo de índice elegido también afecta al rendimiento. En una consulta por rangos, un índice conservando el
orden (como los árboles B) es mejor que un índice asociativo.
Los agrupamientos de datos afecta al tiempo de respuesta de algunas consultas. Por ejemplo,
supóngase que las tuplas de la relación cuenta están agrupadas por nombre-sucursal. Entonces, el tiempo
medio de ejecución para una consulta que encuentra el saldo total depositado en una determinada sucursal,
puede mejorar. Tener un índice agrupado sobre nombre-sucursal aporta más ventajas.
Si el sistema de la base de datos tiene más de un disco, los desagrupamientos de datos posibilitará
accesos paralelos. Supóngase que se tienen cinco discos y una hipotética situación donde cada cliente tiene
cinco cuentas y cada cuenta tiene gran cantidad de información histórica a la que se necesita acceder.
Almacenando una cuenta por cliente por disco, se dispondrá de acceso paralelo en todas las cuentas
de un determinado cliente. Así, la velocidad de una exploración sobre impositor aumentará alrededor de cinco
veces

vi Ajuste del hardware:


El hardware del sistema de la base de datos generalmente se compone de discos, procesador y la
arquitectura de interconexiones (busses, etc.). Cada uno de estos componentes puede ser un cuello de botella y
aumentando el número de discos o el tamaño de sus bloques, o empleando un procesador más rápido o
mejorando la arquitectura del bus, se puede obtener una mejora en el rendimiento del sistema.

21.5 ¿Cuál es el motivo para separar una transacción de larga duración en una serie de transacciones más
breves? ¿Qué problemas pueden surgir como consecuencia y cómo pueden evitarse?

Respuesta: Las transacciones de actualización de larga duración hacen que se grabe mucha información
sobre el registro histórico y, por lo tanto, amplían el intervalo de puntos de revisión así como el tiempo de
recuperación después de una caída. Una transacción que realiza numerosas actualizaciones puede, incluso,
originar el desbordamiento del registro histórico del sistema antes de que se comprometa la transacción.
Para evitar estos problemas con las transacciones de actualización de larga duración, puede ser
aconsejable descomponer la transacción en otras más pequeñas. Esto se puede ver como una transacción de
grupo, se divide en muchas transacciones pequeñas de mini lotes. Se obtiene el mismo efecto ejecutando la
transacción de grupo y las transacciones de mini lotes, las cuales están planificadas en el orden en que
aparecen sus operaciones en la transacción de grupo.
Sin embargo, ejecutar las transacciones de mini lotes en lugar de la transacción de grupo tiene
algunos costes, como es el caso de un esfuerzo extra cuando falla el sistema de recuperación.
También, incluso si la transacción de grupo cumple el requerimiento de aislamiento, el mini lote
puede que no lo haga. Así, el gestor de transacciones puede liberar los bloqueos mantenidos por los mini
lotes, sólo cuando la última transacción del mini lote complete su ejecución.

21.6 Supóngase que un sistema ejecuta tres tipos de transacciones. Las transacciones de tipo A se ejecutan
a razón de cincuenta por segundo, las transacciones de tipo B se ejecutan a cien por segundo y las
transacciones de tipo C se ejecutan a doscientas por segundo. Supóngase que la mezcla de transacciones tiene
un veinticinco por ciento del tipo A, otro veinticinco por ciento del tipo B y un cincuenta por ciento del tipo
C.

a. ¿Cuál es el flujo promedio de transacciones del sistema, suponiendo que no hay interferencia entre
las transacciones?
b. ¿Qué factores pueden generar interferencias entre las transacciones de los diferentes tipos, haciendo
que el flujo calculado sea incorrecto?

Respuesta:
a. Supóngase que hay 100 transacciones en el sistema. La mezcla de transacciones podría ser de 25
transacciones de cada tipo A y B, junto con 50 transacciones del tipo C. De este modo, el tiempo empleado en
ejecutar sólo las transacciones del tipo A es 0,5 segundos y el de las transacciones sólo del tipo B o sólo del
tipo C, es de 0,25 segundos. Dado que las transacciones no interfieren, el tiempo total empleado en ejecutar
las 100 transacciones es 0,5+0,25+0,25 = 1 segundo, es decir, la productividad media sobre todas las
transacciones en de 100 transacciones por segundo.

b. Una de las más importantes causas de interferencias en las transacciones es la contención de


bloqueos. En el ejemplo anterior, supóngase que las transacciones de los tipos A y B son transacciones de
actualización y que las del tipo C son consultas. Debido a la falta de correspondencia de la velocidad entre el
procesador y el disco, es posible que una transacción del tipo A esté manteniendo un bloqueo sobre un
elemento de datos “caliente” y esté esperando a que se complete una escritura sobre el disco, mientras otra
transacción (posiblemente del tipo B o C) está esperando que A libere el bloqueo. En este escenario se
malgastan algunos ciclos de CPU. Por lo tanto, la productividad observada sería menor que la calculada.
Por el contrario, si las transacciones de tipos Ay B están en el límite del disco y las del tipo C en el
límite de la CPU y no hay contención de bloqueos, la productividad observada puede ser incluso mejor que la
calculada.
La contención de bloqueos puede conducir a interbloqueos, en cuyo caso se abortarán algunas
transacciones. Los abortos y reinicios de transacciones (que pueden emplearse por una técnica optimista de
control de concurrencia) contribuyen a que la productividad observada sea menor que la calculada.
Factores tales como los límites en los tamaños de las estructuras de los datos y la variación en el
tiempo empleado por las funciones de contabilidad del gestor de transacciones, pueden causar también una
diferencia entre los valores de la productividad observada y calculada.

21.7 Supóngase que el precio de la memoria cae a la mitad y la velocidad de acceso al disco (número de
accesos por segundo) se dobla, mientras el resto de los factores permanecen iguales. ¿Cuál sería el efecto de
este cambio en las reglas de los cinco minutos y del minuto?

Respuesta: Estos cambios no tendrán ningún efecto sobre las reglas de los cinco minutos y del minuto. El
valor de n, es decir, la frecuencia de los accesos a página en el punto de ni ganar ni perder es proporcional,
manteniendo constantes otros factores, al producto del precio de la memoria por la velocidad del acceso a
disco. Así, cuando el precio de la memoria baja a la mitad y se dobla la velocidad de acceso, n permanece
constante.

21.8 Indíquense algunas de las características de las pruebas TPC que ayudan a hacer las medidas realistas
y dignas de confianza.

Respuesta: Algunas de las características que hacen a las pruebas TPC realistas y fiables son:
a. Asegurar el pleno soporte de las propiedades ACID de las transacciones.
b. Calcular la productividad observando el rendimiento de extremo a extremo.
c. Haciendo proporcionales los tamaños de las relaciones a las tasas esperadas de llegada de
transacciones y
d. Midiendo en euros el coste por unidad de producción.
21.9 ¿Por qué se sustituyó al índice TPC-D por los pruebas TPC-H y TPC-R?

Respuesta: Varias consultas TPC-D pueden acelerarse significativamente empleando vistas materializadas y
otra información redundante, pero deberían tenerse en cuenta la sobrecarga de emplearlas. Por lo tanto, TPC-R
y TPC-H se introdujeron como modificaciones al TPC-D; los dos emplean el mismo esquema y la misma carga
de trabajo. TPC-R modela consultas de informes periódicos y se permite que la base de datos que ejecuta el
índice utilice vistas materializadas. Por otro lado, TPC-H modela consultas ad hoc y prohíbe las vistas
materializadas y otra información redundante.

21.10 Indíquense algunas ventajas e inconvenientes de las normas anticipativas frente a las normas
reaccionarias.

Respuesta: En ausencia de una norma anticipativa, puede resultar difícil compatibilizar los diferentes
productos desarrollados por varias organizaciones. Así, puede ser duro formular una norma reaccionaria, sin
sacrificar alguno de los proyectos de desarrollo de productos. Este problema ha sido afrontado por la norma
ODMG, al normalizar la sintaxis de punteros y los mecanismos de acceso.
Por otro lado, una norma reaccionaria es usual que se forme después de utilizar el producto
intensamente y, por lo tanto, tiene una ventaja sobre una norma anticipativa, que se construye a partir de
experiencias pragmáticas. En la práctica, se ha encontrado que algunas normas anticipativas tienden a ser
demasiado ambiciosas. SQL-3 es un ejemplo de una norma que es compleja y tiene un gran número de
características. Algunas de estas características se pueden implementar en ningún sistema durante mucho
tiempo y otras, sin duda, se encontrarán inadecuadas.

21.11 Supóngase que alguien suplanta a una empresa y obtiene un certificado de una autoridad emisora de
certificados. ¿Cuál es el efecto sobre las cosas (como las órdenes de compra o los programas) certificadas por
la empresa suplantada y sobre las certificadas por otras empresas?

Respuesta: El problema clave con los certificados digitales (cuando se usan fuera de línea, sin contactar con
el emisor del certificado) es que no hay manera de eliminarlos.
Por ejemplo (esto ha sucedido realmente, pero se han cambiado los nombres de las partes) una
persona C dice ser un empleado de la compañía X y obtiene un nuevo certificado de clave pública de la
autoridad de certificación A. Supóngase que la autoridad A pensó equivocadamente que C estaba actuando en
nombre de la compañía X, entrega a C un certificado cert. Ahora, C puede comunicar con la persona Y, quien
verifica el certificado cert presentado por C y cree que la clave pública contenida en cert pertenece realmente
a X. Ahora C se comunicaría con Y empleando la clave pública, e Y cree que la comunicación es de la
compañía X.
La persona Y ahora puede revelar información confidencial a C, o aceptar ordenes de compra de C, o
ejecutar programas certificados por C basados en la clave pública, pensando que él se esta comunicando
realmente con la empresa X. En cada caso hay un daño potencial hacia Y.
Incluso si A detecta la suplantación, mientras que Y no compruebe con A (el protocolo no exige esta
comprobación), no hay manera de que Y averigüe que el certificado está falsificado.
Si X era la propia autoridad de certificación, se pueden crear aún más niveles de certificados falsos.
Pero los certificados que no son parte de esta cadena no estarían afectados.
CAPITULO 21

CONSULTAS AVANZADAS Y RECUPERACIÓN DE LA


INFORMACIÓN

Este capítulo trata las técnicas de consultas avanzadas para bases datos y la recuperación de la información.
Las técnicas de consultas avanzadas incluyen sistemas de apoyo a las decisiones, procesamiento en conexión
analítica, incluyendo el soporte de SQL:1999 para OLAP y la extracción inteligente de datos.
Aunque la recuperación de la información ha sido considerada por los investigadores como un
campo independiente de las bases de datos, hay fuertes conexiones. Está aumentando la importancia de la
recuperación de la información distribuida, con la explosión de documentos en la Web y la importancia
resultante de las técnicas de búsquedas en la Web.
Considerando la creciente importancia de todos los tópicos que se tratan en este capítulo, algunos de
los apartados del mismo se pueden asignar como material de lectura suplementario, incluso en un curso de
introducción. Estos podrían incluir OLAP, algunas partes de la extracción inteligente de datos y de la
recuperación de la información. La materia del capítulo es también adecuada para sentar las bases de un curso
avanzado o para mantener a los profesionales en contacto con los desarrollos recientes.

Cambios a la tercera edición:

• Se ha ampliado el tratamiento de OLAP con la cobertura de jerarquías y se han introducido nuevas materias
sobre soporte a OLAP en SQL:1999, incluyendo agregación extendida, clasificación y ventanas.
• El apartado sobre extracción inteligente de datos se ha ampliado significativamente con nuevas materias
sobre los diferentes tipos de extracción, incluyendo clasificación, asociación y agrupamiento, así como
diferentes métodos para la clasificación y la regresión. También se ha introducido el tratamiento de
algoritmos para la construcción de árboles de decisión y para encontrar reglas de asociación.
• Se ha ampliado la cobertura de los almacenes de datos con el tratamiento de esquemas de estrellas.
• Se ha ampliado la cobertura de la recuperación de la información con un mejor tratamiento de la
recuperación de la información básica y el tratamiento de la recuperación de la información en la Web,
aprovechando la información de hiperenlaces.
Ejercicios

22.1 Por cada una de las funciones de agregación SQL sum, count, min y max, muéstrese como calcular
el valor agregado para el conjunto múltiple S1 U S2, dados los valores agregados en los conjuntos múltiples S1
y S2.
Basado en lo anterior, dense expresiones para calcular valores agregados con agrupamiento en un
subconjunto S, de los atributos de una relación r(A, B, C, D, E), dados los valores agregados para
agrupamiento de los atributos T Ê S, para las funciones de agregación siguientes:
a. sum, count, min y max
b. avg
c. desviación estándar

Respuesta: Dados valores agregados en los conjuntos múltiples S1 y S2, se pueden calcular los
correspondientes valores agregados sobre el conjunto múltiple S1 È S2 como sigue:
a. sum(S1 È S2) = sum(S1) + sum(S2)
b. count(S1 È S2) = count(S1) + count(S2)
c. min(S1 È S2) = min(min(S1), min(S2))
d. max(S1 È S2) = max(max(S1), max(S2))

Supóngase los conjuntos de atributos T = (A, B, C, D) y S = (A, B). Supóngase que la agregación
sobre el conjunto T se almacena en la tabla t-on-agregación con columnas de agregación t-suma, t-contador,
min, y t-max almacenando respectivamente sum, count, min y max.

a. Las agregaciones t-suma, t-contador, min, y t-max sobre el conjunto de atributos S se calculan por
la consulta:

(select A, B, sum(t-suma) as s-suma, sum(t-contador) as s-contador,


min(t-min) as s-min, max(t-max) as s-max
from t-on-agregación
groupby A, B
)

b. La agregación avg sobre el conjunto de atributos S se calcula por la consulta:

(select A, B, sum(t-suma)/sum(t-contador) as s-avg


from t-on-agregación
groupby A, B
)

c. Para calcular la desviación estándar se emplea la fórmula alternativa:

lo cual se obtiene expandiendo la fórmula

Si S está dividido en n conjuntos S1, S2, . . . Sn se mantiene la siguiente relación:


Empleando esta fórmula, la agregación stddev se calcula por la consulta:

select A, B,
[sum(t-contador * (t-stddev2+ t-avg2))/sum(t-contador)] -
[sum(t-suma)/sum(t-contador)]
from t-on-agregación
groupby A, B

22.2 Muéstrese la manera de expresar group by cube(a, b, c, d) usando rollup; la respuesta debe tener
sólo una cláusula group by .

Respuesta:
groupby rollup(a), rollup(b), rollup(c), rollup(d)

22.3 Se da un ejemplo de un par de agrupamientos que no puedan expresarse empleando sólo una cláusula
group by con cube y rollup.

Respuesta: Considérese un ejemplo de jerarquías de las dimensiones de la Figura 22.4.


No se puede expresar una consulta para buscar agregaciones en grupos (Ciudad, Hora del día) y (Ciudad,
Fecha) empleando sólo una cláusula group by con cube y rollup.
Cualquier cláusula sencilla groupby con cube y rollup que calcule estos dos grupos, también
calcularía otros grupos.

22.4 Dada una relación E(estudiante, asignatura, notas), escríbase una consulta para encontrar los n
estudiantes con mejores notas, empleando la clasificación.

Respuesta: Se supone que varios estudiantes no tienen las mismas notas dado que, de lo contrario, la
pregunta no es unívoca; la consulta siguiente devuelve unívocamente todos los estudiantes con las mismas
notas como los n estudiantes, de manera que puede devolver más de n estudiantes.
select estudiante, sum(notas) as total,
rank() over (order by (total) desc) as trank
from S
groupby estudiante
having trank £ n

22.5 Dada la relación r(a, b, c, d), muéstrsese la manera de usar las características ampliadas del SQL
para generar un histograma de d frente a a, dividiendo a en 20 partes iguales (es decir, cada parte contiene un
5% de las tuplas en r, ordenadas por a).

Respuesta:
select tile20, sum(d)
from (select d, ntile(20) over (order by (a)) as tile20
from r) as s
groupby tile20
22.6 Escríbase una consulta para hallar saldos acumulativos, equivalente a la mostrada en el Apartado
22.2.5, pero sin utilizar las estructuras ampliadas para la creación de ventanas de SQL.

Respuesta:
select t1.número-cuenta, t1.fecha-hora, suma(t2.valor)
from transaction as t1, transaction as t2
where t1.número-cuenta = t2.número-cuenta and
t2.fecha-hora < t1.fecha-hora
groupby t1.número-cuenta, t1.fecha-hora
order by t1.número-cuenta, t1.fecha-hora

22.7 Considérese el atributo saldo de la relación cuenta. Escríbase una consulta en SQL para calcular un
histograma de los valores de saldo, dividiendo el rango desde cero hasta el máximo saldo de una cuenta
presente, en tres rangos iguales.

Respuesta:
(select 1, count(*)
from cuenta
where 3* saldo <= (select max(saldo)
from cuenta)
)
union
(select 2, count(*)
from cuenta
where 3* saldo > (select max(saldo)
from cuenta)
and 1,5 * saldo <= (select max(saldo)
from cuenta)
)
union
(select 3, count(*)
from cuenta
where 1,5 * saldo > (select max(saldo)
from cuenta)
)

22.8 Considérese la relación ventas del Apartado 22.2. Escríbase una consulta en SQL para calcular la
operación cubo para la relación, dada la relación de la Figura 22.2. No se debe utilizar la constructora with
cube.

Respuesta:
(select color, tamaño, sum(número)
from ventas
groupby color, tamaño
)
union
(select color, ’all’, sum(número)
from ventas
groupby color
)
union
(select ’all’, tamaño, sum(número)
from ventas
groupby tamaño
)
union
(select ’all’, ’all’, sum(número)
from ventas
)

22.9 Constrúyase un clasificador de árboles de decisión con divisiones binarias en cada nodo, utilizando
las tuplas de la relación r(A, B, C) que se muestra más abajo como datos de formación; el atributo C denota la
clase. Muéstrese el árbol final y, con cada nodo, la mejor división para cada atributo junto con su valor de
ganancia de la información.

(1, 2, a), (2, 1, a), (2, 5, b), (3, 3, b), (3, 6, b), (4, 5, b), (5, 5, c), (6, 3, b), (6, 7, c)

Respuesta:

22.10 Supóngase que hay dos reglas de clasificación, una que dice que la gente con sueldos entre 10.000 €
y 20.000 € tienen una calificación de crédito de buena y otra que dice que la gente con sueldos entre 20.000 €
y 30.000 € tienen una calificación de crédito de buena. Hay que indicar las condiciones para las que se pueden
sustituir las reglas, sin pérdida de información, por una sola regla que diga que las personas con sueldos entre
10.000 € y 30.000 € tienen una calificación de crédito de buena.

Respuesta: Considérese el siguiente par de reglas y sus niveles de confianza:

Número Regla Confianza


1. " personas P, 10.000 < P.sueldo £ 20.000 Þ 60%
P.crédito = bueno
2. " personas P, 20.000 < P.sueldo £ 30.000 Þ 90%
P.crédito = bueno

La nueva regla ha de estar asignada a un nivel de confianza que se encuentre entre los niveles de
confianza de las reglas 1 y 2. Al reemplazar las reglas originales por la nueva regla se originará una pérdida
del nivel de confianza en la clasificación de las personas, dado que no se puede distinguir entre los niveles de
confianza de las personas que ganan entre 10.000 y 20.000, de aquellas que ganan entre 20.000 y 30.000. Por
lo tanto, se pueden combinar ambas reglas sin pérdida de información, sólo si sus niveles de confianza son los
mismos.

22.11 Supóngase que la mitad de las transacciones en una tienda de ropa adquieren vaqueros y que una
tercera parte adquieren camisetas. Supóngase además que la mitad de las transacciones que adquieren
vaqueros también adquieren camisetas. Escríbanse todas las reglas de asociación (no triviales) que se puedan
deducir de la información anterior, indicando el soporte y la confianza de cada regla.

Respuesta: Las reglas son como sigue. La última regla se puede deducir de las anteriores.

Regla Apoyo Confianza


" transacciones T, true Þ compra(T, vaqueros) 50% 50%
" transacciones T, true Þ compra(T, camisetas) 33% 33%
" transacciones T, compra(T, vaqueros) Þ compra(T, camisetas) 25% 50%
" transacciones T, compra(T, camisetas) Þ compra(T, vaqueros) 25% 75%

22.12 Considérese el problema de hallar conjuntos de artículos de gran tamaño.


a. Descríbase la manera de encontrar el soporte para una colección dada de conjuntos de elementos,
utilizando sólo una exploración de los datos. Supóngase que los conjuntos de artículos y la información
asociada, como los recuentos, caben en la memoria.
b. Supóngase un conjunto de artículos que tiene un soporte menor que j. Pruébese que ningún
superconjunto de este conjunto de artículos puede tener soporte mayor o igual que j.

Respuesta:
a. Sea {S1, S2, . . . , Sn} la colección de conjuntos de artículos para los que se quiere encontrar el
soporte. Asóciese un contador contadorSi) con cada conjunto de artículos Si.
Inicialícese el contador a cero. Examínense ahora las transacciones, una por una. Sea S(T ) el
conjunto de artículos de una transacción T . Por cada conjunto de artículos Si que es un subconjunto de S(T ),
increméntese el contador correspondiente, contador(Si).
Cuando se hayan rastreado todas las transacciones, los valores de contador(Si) darán, para cada i, el
soporte para el conjunto de artículos Si.

b. Sea A un conjunto de artículos. Considérese cualquier conjunto de artículos B, que sea un


superconjunto de A. Sean tA y tB los conjuntos de transacciones que adquieren todos los artículos en A y B,
respectivamente. Por ejemplo, supóngase que A es {a, b, c} y B es {a, b, c, d}.
Una transacción que adquiera todos los artículos de B debe haber adquirido todos los artículos de A
(dado que A Í B). De este modo, cada transacción en tA está también en tB. Esto implica que el número de
transacciones en tB es, a lo sumo, el número de transacciones en tA. En otras palabras, el soporte para B es,
como máximo, el soporte para A.
Entonces, si cualquier conjunto de artículos tiene un soporte menor que j, todos los súper conjuntos
de este conjunto de artículos tienen soporte menor que j.

22.13 Descríbanse las ventajas e inconvenientes de una arquitectura dirigida por el origen para la
recolección de datos en los almacenes de datos, en comparación con una arquitectura dirigida por el destino.

Respuesta: En una arquitectura dirigida por el destino para la recolección de datos, las transferencias de datos
desde la fuente al almacén de datos se basan en la demanda del almacén, mientras que en una arquitectura
dirigida por el origen, las transferencias se inician por cada fuente de datos.

Las ventajas de una arquitectura dirigida por el origen son:

• Los datos se pueden propagar al destino tan pronto como están disponibles.
En una arquitectura dirigida por el destino, para capturar los datos en cuanto estén disponibles, el almacén
tendría que comprobar frecuentemente las fuentes, originando una alta sobrecarga.

• La fuente no ha de mantener información histórica. Tan pronto como se actualizan los datos, la fuente puede
enviar un mensaje de actualización al destino y olvidarse el histórico de las actualizaciones. Por el contrario,
en una arquitectura dirigida por el destino, cada fuente ha de mantener un histórico de los datos que aún no
han sido recogidos por el almacén de datos. Así, los requerimientos de almacenamiento de las fuentes son
menores para una arquitectura dirigida por la fuente.

Por otro lado, una arquitectura dirigida por el destino tiene las siguientes ventajas.

• En una arquitectura dirigida por el origen, la fuente ha de estar activa y debe gestionar condiciones de error,
tales como el no ser capaz de contactar con el almacén durante un tiempo. Es más fácil implementar fuentes
pasivas y un solo almacén activo. En una arquitectura dirigida por el destino, cada fuentes es requerida para
que aporte sólo una funcionalidad básica de ejecución de consultas.

• El almacén tiene más control cuando, para llevar a cabo actividades de recolección de datos y procesar
consultas de usuarios, no es una buena idea desarrollar simultáneamente ambos, dado que pueden entrar en
conflictos de bloqueos.
22.14 Considérese el esquema dibujado en la Figura 22.9. Se da una consulta de SQL:1999 para resumir las
cifras de ventas y los precios por tienda y por fecha, junto con las jerarquías para tienda y fecha.

Respuesta:
select id-almacén, ciudad, provincia, país,
fecha, mes, trimestre, año,
sum(número), sum(precio)
from ventas, almacén, fecha
where ventas.id-almacén = almacén.id-almacén and
ventas.fecha = fecha.fecha
groupby rollup(país, provincia, ciudad, id-almacéb),
rollup(año, trimestre, mes, fecha)

22.15 Calcúlese la importancia (mediante las definiciones adecuadas de la frecuencia de los términos y de
la frecuencia inversa de los documentos) de cada una de las preguntas de este capítulo para la consulta
“relación SQL”.

Respuesta: No se consideran las preguntas que no contienen ninguna de la palabras clave, dado que su
importancia para la palabra clave es cero. El número de palabras en una pregunta incluye las palabras de
parada. Se emplean las ecuaciones dadas en el Apartado 22.5.1.1 para calcular la importancia; el registro
histórico de términos en la ecuación se asume que está para la base 2.

Q.# # # # “SQL” “relación” “SQL” “relación” Total


palabras “SQL” térm freq. térm freq. relv. relv. relv.
“relatción

1 84 1 1 0,0170 0,0170 0,0002 0,0002 0,0004
4 22 0 1 0,0000 0,0641 0,0000 0,0029 0,0029
5 46 1 1 0,0310 0,0310 0,0006 0,0006 0,0013
6 22 1 0 0,0641 0,0000 0,0029 0,0000 0,0029
7 33 1 1 0,0430 0,0430 0,0013 0,0013 0,0026
8 32 1 3 0,0443 0,1292 0,0013 0,0040 0,0054
9 77 0 1 0,0000 0,0186 0,0000 0,0002 0,0002
14 30 1 0 0,0473 0,0000 0,0015 0,0000 0,0015
15 26 1 1 0,0544 0,0544 0,0020 0,0020 0,0041

22.16 Explíquese la diferencia entre un falso positivo y un rechazo falso. Si es fundamental que las
consultas de recuperación de la información no pierdan ninguna información importante, explicar si es
aceptable tener falsos positivos o rechazos falsos. ¿Por qué?

Respuesta: Los sistemas de recuperación de la información localizan documentos que contienen una
determinada palabra clave, utilizando un índice que asocia esta palabra clave sobre un conjunto de
identificadores de documentos contenidos en él. Cada palabra clave puede estar contenida en un gran número
de documentos. Para ahorrar espacio de almacenamiento para los identificadores de los documentos
correspondientes a una palabra clave, el índice, a veces, se almacena de tal manera que la recuperación es
aproximada. El error en esta aproximación puede conducir a una de las dos situaciones: un rechazo falso
sucede cuando algunos documentos importantes no se recuperan; un falso positivo tiene lugar cuando se
recuperan algunos documentos sin importancia. De este modo, para las consultas de recuperación de la
información que tienen la obligación de no perder información relevante, es aceptable tener falsos positivos,
pero no rechazos falsos.

22.17 Supóngase que se desea hallar documentos que contengan como mínimo k palabras clave de un
conjunto dado de n. Supóngase también que se dispone de un índice de palabras clave que da una lista
(ordenada) de identificadores de documentos que contienen una palabra clave dada. Se da un algoritmo
eficiente para hallar el conjunto de documentos deseado.

Respuesta: Sea S un conjunto de n palabras clave. Un algoritmo para encontrar todos los documentos
que contienen al menos k de estas palabras clave, se presenta a continuación:
Este algoritmo calcula un contador de referencia por cada identificador de documentos. Un contador
de referencia de i para un identificador de documentos d significa que, al menos, i de las palabras claves en S
están presentes en el documento identificadas por d. El algoritmo mantiene una lista de registros, cada uno
con dos campos: un identificador de documentos y el contador de referencia para este identificador. Esta lista
se mantiene ordenada sobre el campo identificador de documentos.

inicializar la lista L a la lista vacía;


for (cada palabra clave c en S) do
begin
D := la lista de identificadores de documentos correspondientes a c;
for (cada identificador de documentos d en D) do
if (un registro R con identificador de documentos como d está en la lista
L) then
R.contador_referencia := R.contador_referencia + 1;
else begin
grabar un nuevo registro R;
R.id_documento := d;
R.contador_referencia := 1;
sumar R a L;
end;
end;
for (cada registro R en L) do
if (R.contador_referencia >= k) then
producir R;

Nótese que la ejecución de la segunda instrucción for hace que la lista D se “fusione” con la lista L . Dado que
las listas L y D están ordenadas, el tiempo empleado en esta fusión es proporcional a la suma de las longitudes
de las dos listas. Así, el algoritmo se ejecuta en tiempo (como máximo) proporcional a n veces la suma total
de los números de identificadores de documentos correspondientes a cada palabra clave en S.
CAPITULO 23

TIPOS DE DATOS AVANZADOS Y NUEVAS APLICACIONES

Este capítulo cubre los tipos de datos automáticos y las nuevas aplicaciones, incluyendo bases de datos
temporales, bases de datos espaciales, geográficas y bases de datos portátiles y personales. En concreto, en los
últimos años ha aumentado la importancia de los tipos de datos mencionados anteriormente y los sistemas de
bases de datos comerciales están incrementando la provisión de complementos para tales tipos de datos, por
medio de ampliaciones a los sistemas de bases de datos, denominadas de diferentes maneras cartuchos o
extenders.
Este capítulo es adecuado como una herramienta para sentar las bases de un curso avanzado.
Algunas de las materias, como los tipos de datos espaciales y temporales, pueden ser adecuados para el
trabajo individual de un primer curso.

Cambios a la tercera edición:

En la edición anterior esta materia formaba parte del capítulo 21, pero en esta edición ese capítulo se dividido
en dos, los capítulos 22 y 23.
El tratamiento de los árboles R se ha ampliado con una descripción informal sobre los algoritmos de
inserción y borrado. Se han actualizado las comunicaciones móviles de datos.
Ejercicios

23.1 Indíquense los dos tipos de tiempo y en lo que se diferencian. Indíquese el motivo de que haya dos
tipos de tiempo asociados con cada tupla.

Respuesta: Una base de datos temporal modela los cambios en los estados de algunos aspectos del mundo
real. Los intervalos de tiempo que relacionan los datos almacenados en una base de datos temporal pueden ser
de dos tipos: momento válido y momento de transacción. El momento válido de un hecho es el conjunto de
intervalos de tiempo en el que el hecho es cierto en el mundo real. El momento de transacción de un hecho es
el conjunto de intervalos de tiempo en el que el hecho es actual en el sistema de la base de datos. Sólo el
momento de transacción depende del sistema y se genera por el sistema de la base de datos.
Supóngase que se considera el ejemplo de la base de datos del banco para que sea bitemporal. Sólo el
concepto de momento válido permite al sistema responder a consultas tales como: ¿Cuál era el saldo de
Santos hace dos días? Por otro lado se pueden responder, basándose en el momento de transacción, a
consultas como: ¿Qué se grabó hace dos días como saldo de Santos? La diferencia entre los dos momentos es
importante. Por ejemplo, supóngase que hace tres días el cajero cometió un error al introducir el saldo de
Santos y que hasta ayer no se corrigió el error. Este error significa que hay una diferencia entre los resultados
de las dos consultas ( si ambas se ejecutasen hoy).

23.2 Indíquese si se conservarán las dependencias funcionales si se convierte una relación en una relación
temporal añadiéndole un atributo temporal. Indíquese el modo en que se resuelve el problema en las bases de
datos temporales.

Respuesta: Las dependencias funcionales pueden violarse cuando se amplia una relación para que incluya un
atributo temporal. Por ejemplo, supóngase que se añade un atributo temporal a la relación cuenta, en el
ejemplo de la base de datos bancaria. La dependencia número-cuenta g saldo puede ser violada, dado que el
saldo de un cliente cambiaría con el tiempo.
Para solucionar este problema los sistemas de bases de datos temporales tienen un noción
ligeramente diferente de dependencia funcional, denominada dependencia funcional temporal. Por ejemplo, la
dependencia funcional temporal número-cuenta gT saldo sobre el esquema-cuenta significa que, por cada
instancia cuenta de esquema-cuenta, todas las instantáneas de cuenta cumplen la dependencia funcional
número-cuenta g saldo; es decir que en cualquier momento, cada cuenta tendrá un solo saldo bancario
correspondiente a él.

23.3 Supóngase que se tiene una relación que contiene las coordenadas x, y junto con los nombres de
varios restaurantes. Supóngase también que las únicas consultas que se plantearán serán de la forma siguiente:
La consulta especifica un punto y pregunta si hay algún restaurante exactamente en ese punto. Indíquese el
tipo de índice que sería preferible, árbol R o árbol B. Indíquese el motivo.

Respuesta: La consulta dada no es una consulta por rangos, dado que sólo requiere buscar por un punto. Esta
consulta se puede responder de forma eficiente mediante un índice árbol B sobre el par de atributos (x, y).

23.4 Considérense datos vectoriales bidimensionales en que los elementos de datos no se solapan.
Indíquese si es posible convertir esos datos vectoriales en datos lineales. En caso de que sea posible,
indíquense los inconvenientes de almacenar los datos lineales obtenidos de esa conversión en lugar de los
datos vectoriales originales.

Respuesta: Para convertir datos vectoriales que no se solapan en datos lineales, se definen los valores para
justamente esos píxeles que se encuentran sobre cualquiera de los elementos de datos (regiones); los otros
píxel tienen un valor por defecto.
Los inconvenientes de este enfoque son: pérdida de precisión en la información de la localización (
dado que los datos lineales pierden resolución), un requerimiento de almacenamiento mucho mayor y la
pérdida de información de resumen (como la forma de una región).

23.5 Supóngase que se dispone de una base de datos espacial que soporta consultas regionales (con
regiones circulares) pero no consultas de vecino más próximo. Descríbase un algoritmo para encontrar el
vecino más próximo haciendo uso de varias consultas regionales.

Respuesta: Supóngase que se desea buscar el vecino más próximo de un punto P, en una base de datos de
puntos en el plano. La idea es emitir múltiples consultas regionales centradas en P. Cada consulta regional
cubre una área de puntos mayor que la consulta anterior. El procedimiento se detiene cuando el resultado de
una consulta regional no está vacío. Se calcula la distancia desde P a cada punto dentro de esta región y se
publica el conjunto de puntos más cercanos.

23.6 Supóngase que se desean almacenar segmentos rectilíneos en un árbol R. Si un segmento rectilíneo
no es paralelo a los ejes, su caja límite puede ser grande y contener una gran área vacía.

• Descríbase el efecto en el rendimiento de tener cajas límite de gran tamaño en las consultas que piden los
segmentos rectilíneos que interceptan una región dada.
• Descríbase brevemente una técnica para mejorar el rendimiento de esas consultas y apórtese un ejemplo de
sus ventajas. Sugerencia: se pueden dividir los segmentos en partes más pequeñas.

Respuesta:

Figura 21.17 a) : Representación de un segmento mediante un rectángulo

Figura 21.17 b) : División de cada segmento en cuatro partes.

La cajas límite de gran tamaño tienden a solapar incluso donde la región de solape no contiene
ninguna información. La Figura 21.17 a) muestra una región R dentro de la cual se ha de localizar un
segmento. Nótese que, aunque ninguno de los cuatro segmentos se encuentra en R, debido a las cajas límite
grandes, se han de verificar cada una de las cuatro cajas límite para confirmar esto. Se observa una mejora
significativa en la Figura 21.17 b), donde cada segmento está dividido en múltiples partes, cada una con su
propia caja límite. En el segundo caso, la caja R no forma parte de las cajas indexadas por el árbol R. En
general, el dividir un segmento en partes más pequeñas origina que las cajas límite lo sean también,
malgastándose menos el área.

23.7 Se da un procedimiento recursivo para calcular de manera eficiente la mezcla espacial de dos
relaciones con índices de árbol R. (Sugerencia: Utilícense cajas límite para verificar si las entradas de hojas
bajo un par de nodos internos pueden interseccionar.)

Respuesta: Lo que sigue es un procedimiento recursivo para calcular reuniones espaciales de dos árboles R.

SpJoin(nodo n1, nodo n2)


begin
if(las cajas límite de n1 y n2 no interseccionan)
return;
if(tanto n1 como n2 son hojas)
output todos los pares de entradas (e1, e2) tales que
e1În1 e2În2 y e1 e2solapan
if(n1 no es una hoja)
NS1 = conjunto de hijos de n1;
else
NS1 = { n1 };
if(n2 no es una hoja)
NS2 = conjunto de hijos de n2;
else
NS2 = { n2 };
for each ns1 en NS1 y ns2 en NS2;
SpJoin(ns1, ns2);
end

23.8 Estúdiese el soporte de los datos espaciales ofrecido por el sistema de bases de datos que se está
utilizando e impleméntese lo siguiente:
a. Un esquema para representar la ubicación geográfica de los restaurantes y características como la
cocina que se sirve en cada restaurante y su nivel de precios.
b. Una consulta para hallar los restaurantes económicos que sirven comida india y que se hallan a
menos de nueve kilómetros de casa del lector (supóngase cualquier ubicación para la casa del lector).
c. Una consulta para hallar, para cada restaurante, su distancia al restaurante más cercano que sirve la
misma cocina y con el mismo nivel de precios.

Respuesta: PENDIENTE DE RESOLVER

23.9 Indíquense los problemas que se producen en un sistema de medios continuos si los datos se
entregan demasiado lentamente o demasiado rápidamente.

Respuesta: Los sistemas de medios continuos generalmente manejan un gran número de datos, que se han de
llevar a una velocidad constante. Supóngase que el sistema aporta los fotogramas de las imágenes para una
televisión. La velocidad de entrega de los datos desde el sistema, debería corresponderse con la velocidad de
visualización de los fotogramas de la televisión. Si la velocidad de entrega fuese demasiado lenta, la pantalla
periódicamente se paralizaría o se quedaría en blanco dado que, durante un tiempo, no habría nuevos datos
que visualizar. Por el contrario, si la velocidad de entrega fuese demasiado rápida, la memoria intermedia de
datos con destino al televisor se desbordaría, causando una pérdida de datos; los datos perdidos no se
visualizarían nunca.

23.10 Descríbase el modo en que las ideas subyacentes a la organización RAID (Apartado 11.3) pueden
utilizarse en un entorno de datos de difusión, donde puede que haya ocasionalmente ruido que impida la
recepción de parte de los datos que se están transmitiendo.

Respuesta: Los conceptos de RAID se pueden emplear para mejorar la fiabilidad de la difusión de datos a
través de sistemas inalámbricos. Cada bloque de datos que se va a transmitir se divide en unidades de igual
tamaño. Se calcula un valor de suma de chequeo para cada unidad y se añade a la unidad. Ahora se calculan
los datos de paridad para estas unidades. Una suma de chequeo para el dato de paridad se añade al dato, para
formar una unidad de paridad. Tanto las unidades de datos como las de paridad se difunden, una tras otra,
como una sola transmisión.
En la recepción de la difusión, el receptor emplea las sumas de chequeo para verificar si cada unidad
se recibe sin errores. Si se encuentra una unidad con errores, se puede reconstruir desde las otras unidades.
El tamaño de la unidad se debe elegir cuidadosamente. Las unidades pequeñas no sólo requieren
calcular más sumas de chequeo, sino que la posibilidad de que una explosión de ruido corrompa más de una
unidad, es también alta. El problema de emplear unidades grandes es que aumenta la probabilidad de que el
ruido afecte a una unidad; por lo tanto, ha de haber un equilibrio.

23.11 Indíquense tres características principales de la informática móvil en redes inalámbricas que son
diferentes de las de los sistemas distribuidos tradicionales.

Respuesta: Algunas de las principales características que los diferencian son las siguientes.

• En los sistemas distribuidos, el que un anfitrión se desconecte de la red se considera un fallo, mientras que
se permite como una característica de los sistemas portátiles.

• Los sistemas distribuidos se administran generalmente de forma centralizada mientras que, en las
computadoras portátiles, cada ordenador personal que forma parte del sistema se administra por el usuario
(propietario) de la máquina y hay, si acaso, una pequeña administración central.

• En los sistemas distribuidos convencionales, cada máquina tiene una localización determinada y una
dirección de red. Esto no es cierto para las computadoras portátiles y, de hecho, es lo opuesto al propósito de
la informática móvil.

• Las consultas hechas sobre un sistema de computación móvil pueden implicar la localización y velocidad de
un ordenador anfitrión.

• En un sistema distribuido, se permite a cada ordenador un tamaño arbitrario y puede consumir gran cantidad
de energía eléctrica (casi) ininterrumpidamente. Los sistemas móviles generalmente tienen pequeños
ordenadores que funcionan a baja potencia, con pequeñas baterías.

23.12 Indíquense tres factores que haya que considerar en la optimización de las consultas para la
informática móvil que no se consideren en los optimizadores de consultas tradicionales.

Respuesta: El factor de influencia más importante sobre el coste del procesamiento de consultas, en un
sistema tradicional de bases de datos, es la E/S a disco. Sin embargo, en la informática móvil, el minimizar la
cantidad de energía requerida para ejecutar una consulta es una tarea importante en un optimizador de
consultas. Para reducir el consumo de energía (la carga de las baterías) el optimizador de consultas en un
ordenador móvil minimiza el tamaño y el número de las consultas a transmitir a computadoras remotas, así
como el tiempo que está girando el disco.
En los sistemas de bases de datos tradicionales, el modelo de costes generalmente no incluye el
tiempo de conexión y la cantidad de datos transferidos. Sin embargo, los usuarios de computadoras portátiles
generalmente cargan con el coste de acuerdo a estos parámetros. Por ello, se deberían minimizar estos
parámetros mediante un optimizador de consultas de la computadora portátil.
23.13 Defínase un modelo en que se difundan repetidamente los datos, donde el medio de transmisión se
modele como un disco virtual
Descríbase el modo en que el tiempo de acceso y la velocidad de transferencia de datos del disco virtual se
diferencian de los valores correspondientes a un disco duro normal.

Respuesta: Se pueden distinguir dos modelos de difusión de datos. En el caso de un medio de difusión puro,
donde el receptor no puede comunicar con el difusor, este transmite datos con ciclos de transmisión
periódicos del conjunto de datos, de tal manera que los nuevos receptores puedan ponerse al corriente de toda
la información difundida. Por ello, los datos se difunden en un ciclo continuo. Este período del ciclo se puede
considerar semejante al peor caso de latencia rotacional en una unidad de disco. Aquí no hay concepto del
tiempo de búsqueda. El valor para la latencia del ciclo depende de la aplicación, pero es posible que sea al
menos del orden de segundos, lo cual es muy superior que la latencia en una unidad de disco.
En un modelo alternativo, el receptor puede devolver peticiones al difusor. En este modelo también
se puede añadir un equivalente de latencia de acceso a disco, entre el receptor enviando una petición y el
difusor recibiendo la petición y respondiéndola. La latencia es una función del volumen de peticiones y del
ancho de banda del medio de difusión. A su vez, las consultas pueden cumplirse sin ni siquiera enviar una
petición, dado que el difusor da la casualidad que envía los datos en un ciclo, o basados en alguna otra
petición de los receptores. A pesar de todo, la latencia es probable que sea al menos del orden de segundos, de
nuevo muy superior que los correspondientes valores para un disco duro.
Un típico disco duro puede transferir datos a la velocidad de 1 a 5 mega bytes por segundo. Por el
contrario, el ancho de banda de una canal de difusión es generalmente de sólo unos pocos kilo bytes por
segundo. La latencia total es probablemente del orden de segundos a cientos o incluso miles de segundos, en
comparación con los pocos mili segundos de un disco duro.

23.14 Considérese una base de datos de documentos en la que todos los documentos se conserven en una
base de datos central. En las computadoras portátiles se guardan copias de algunos documentos. Supóngase
que la computadora portátil A actualiza una copia del documento 1 mientras está desconectada y que, al
mismo tiempo, la computadora portátil B actualiza una copia del documento 2 mientras está desconectada.
Muéstrese el modo en que el esquema del vector versión puede asegurar la actualización adecuada de la base
de datos central y de las computadoras portátiles cuando se vuelva a conectar una computadora portátil.

Respuesta: Sea C la computadora sobre la que se carga la base de datos central. Cada computadora portátil
(anfitrión) i almacena, con su copia de cada documento d, una versión - vector – que es un conjunto de
números de versión Vd,i,j con una entrada por cada otro anfitrión j, que almacena una copia del documento d
que posiblemente pudo actualizar.
El anfitrión A actualiza el documento 1 mientras está desconectado de C. Por ello, de acuerdo al
esquema del vector versión, el número de versión V1,A,A se incrementa en uno.
Supóngase ahora que el anfitrión A se reconecta a C. Esta pareja intercambia el vector versión y
encuentra que el número de versión V1,A,A es, en uno, mayor que V1,C,A (asumiendo que la copia del documento
1 almacenada en el anfitrión A, fue actualizada muy recientemente sólo por el anfitrión A). Siguiendo el
esquema del vector versión, la versión del documento 1 en C se actualiza y se refleja el cambio mediante un
incremento en el número de versión V1,C,A. Nótese que estos son los únicos cambios hechos por el anfitrión.
Análogamente, cuando el anfitrión B se conecta al anfitrión C, se intercambian los vectores versión y
el anfitrión B encuentra que V1,B,A es, en uno, menor que V1,C,A . De este modo, el número de versión V1,B,A se
incrementa en uno y la copia del documento 1 se actualiza en el anfitrión B.
Así se ve que el esquema del vector versión asegura la adecuada actualización de la base de datos
central, justamente para el caso considerado. Este argumento se puede generalizar fácilmente para el caso en
que se realicen, fuera de línea, múltiples actualizaciones a copias del documento 1 sobre el anfitrión A, así
como sobre el anfitrión B y el C. Es similar el argumento para las actualizaciones fuera de línea del
documento 2.

23.15 Se da un ejemplo para mostrar que el esquema del vector versión no asegura la secuenciabilidad.
(Sugerencia: Utilícese el ejemplo del Ejercicio 23.14 con la suposición de que los documentos 1 y 2 están
disponibles en las dos computadoras portátiles A y B, y téngase en cuenta la posibilidad de que un documento
pueda leerse aunque no se actualice).

Respuesta: Considérese el ejemplo dado en el ejercicio anterior. Supóngase que los anfitriones A y B no
están conectados entre sí. A su vez, supóngase que copias idénticas de los documentos 1 y 2 están
almacenadas en los anfitriones A y B.
Sea {X = 5} el contenido inicial del documento 1 y {X = 10} el del documento 2. Si pérdida de
generalidad, supóngase que se inicializan a cero todos los vectores versión.
Supóngase que el anfitrión A actualiza el número de su copia del documento 1 con el de su copia del
documento 2. Entonces, el contenido de ambos documentos (en el anfitrión A) son ahora {X = 10} . El número
de versión V1,A, A se ha incrementado en 1.
Mientras el anfitrión B está desconectado del anfitrión A, actualiza el número en su copia del
documento 2 con el de su copia en el documento 1. Así, los contenidos de ambos documentos (en el anfitrión
B) son ahora {X = 5} . El número de versión V2,A, A se ha incrementado en 1.
Posteriormente, cuando se conecten entre sí los anfitriones A y B, intercambiarán vectores versión.
El esquema del vector versión actualiza la copia del documento 1en el anfitrión B a {X = 10} y la copia del
documento 2 en el anfitrión A a {X = 5} . Así, las dos copias de cada documento son idénticas, a saber, el
documento 1 contiene {X = 10} y el documento 2 {X = 5}.
Sin embargo, nótese que una planificación secuencial de ambas actualizaciones (una sobre el
anfitrión A y otra sobre el B), implicaría que ambos documentos tendrían el mismo contenido.
Por lo tanto, este ejemplo muestra que el esquema del vector versión no asegura la secuencialidad.
CAPITULO 24

PROCESAMIENTO AVANZADO DE TRANSACCIONES

En este capítulo se va mas allá de los esquemas de procesamiento básico de transacciones discutidos
previamente, tratando conceptos de procesamiento de transacciones más avanzados, incluyendo monitores de
procesamiento de transacciones, sistemas de flujos de trabajo, bases de datos en memoria principal, sistemas
de transacciones en tiempo real y gestión de transacciones de larga duración por medio de transacciones
anidadas, transacciones multinivel y niveles débiles de consistencia. El capítulo finaliza tratando los niveles
débiles de consistencia empleados para gestionar los sistemas de bases de datos múltiples.
Este capítulo es adecuado para un curso avanzado. La secciones sobre monitores TP y flujos de
trabajo pueden tratarse también en un curso de introducción, como material de trabajo individual.

Cambios a la tercera edición:

El tratamiento de los sistemas de copia de seguridad remotos se ha trasladado desde al capítulo sobre
recuperación, mientras que el procesamiento de transacciones, en bases de datos múltiples, se ha trasladado a
este capítulo desde la posición anterior, en el capítulo de bases de datos distribuidas.
Ejercicios

24.1 Explíquese el modo en que los monitores TP administran los recursos de la memoria y del
procesador, de manera más efectiva que los sistemas operativos habituales.

Respuesta: En un sistema operativo típico, cada cliente se representa por un proceso que ocupa mucha
memoria. Así mismo, las sobrecargas de los procesos multitarea son elevadas.
Un monitor TP tiene más de proveedor de servicios que de entorno para la ejecución de procesos
cliente. Los procesos cliente se ejecutan en sus propios sitios y envían solicitudes al monitor TP, siempre que
desean aprovecharse de algún servicio. El mensaje se encamina al servidor adecuado por medio del monitor
TP, devolviendo al cliente los resultados del servicio.
La ventaja de este esquema es que el mismo proceso servidor puede servir simultáneamente a varios
clientes, empleando múltiples hebras. Esto ahorra espacio de memoria y reduce los costes de CPU en la
conservación de las propiedades ACID y en la planificación de procesos enteros. Incluso sin múltiples hebras,
el monitor TP puede cambiar dinámicamente el número de servidores en ejecución, en función de cualquier
factor que afecte al buen rendimiento. Todo esto no es posible con una configuración de sistema operativo
típico.

24.2 Compárense las características de los monitores TP con las proporcionadas por los servidores Web
que soportan servlets (estos servidores se han denominado TP-lite).

Respuesta: PENDIENTE.

24.3 Considérese el proceso de admisión de nuevos alumnos en la universidad (o de nuevos empleados en


la organización).
a. Se da una imagen de alto nivel del flujo de trabajo, comenzando por el procedimiento de matrícula
de los estudiantes.
b. Indíquense los estados de terminación aceptables y los pasos que implican intervención de personas.
c. Indíquense los posibles errores (incluido el vencimiento del tiempo límite) y el modo en que se
tratan.
d. Estúdiese la cantidad de flujo de trabajo que se ha automatizado en la universidad.

Respuesta: PENDIENTE.

24.4 Al igual que los sistemas de bases de datos, los sistemas de flujo de trabajo también necesitan la
gestión de la concurrencia y de la recuperación. Indíquense tres motivos por los que no se puede aplicar
simplemente un sistema relacional de bases de datos empleando bloqueo de dos fases, registro histórico de
operaciones físicas de deshacer y el bloqueo de dos fases.

Respuesta:
a. Las tareas en un flujo de trabajo tienen dependencias basadas en su estado Por ejemplo, el inicio de
una tarea puede estar condicionado al resultado (tales como comprometido o abortado) de algunas otras
tareas. Todas las tareas no se pueden ejecutar independiente y concurrentemente, empleando compromiso de
dos fases sólo para compromisos atómicos.

b. Cuando termine una tarea, habrá de exponer sus actualizaciones para que otras tareas, ejecutando las
mismas entidades de procesamiento, no tengan que esperar mucho. El bloqueo de dos fases es una forma
demasiado estricta de control de concurrencia y no es apropiada para los flujos de trabajo.

c. Los flujos de trabajo tiene sus propios requerimientos de consistencia, es decir atomicidad ante
fallos. Una ejecución de flujo de trabajo debe finalizar en un estado de terminación aceptable. Por esto y por
la exposición temprana de actualizaciones no comprometidas, el procedimiento de recuperación será bastante
diferente. Habrán de emplearse algunas formas de registro histórico lógico y transacciones de compensación.
Además, para realizar una recuperación en avance de un flujo de trabajo fallido, las rutinas de recuperación
necesitan restaurar la información sobre el estado del planificador y las tareas, no sólo los elementos de datos
actualizados. Por esto no se puede usar un simple registro histórico de escritura anticipada.

24.5 Si toda la base de datos cabe en la memoria principal, indíquese si continúa haciendo falta un sistema
de bases de datos para administrar los datos. Explíquese la respuesta.

Respuesta: Incluso si toda la base de datos cabe en memoria principal, se necesita un sistema de gestión de
bases de datos para realizar tareas como control de concurrencia, recuperación, registro histórico, etc., a la
hora de conservar las propiedades ACID de las transacciones.

24.6 Considérese un sistema de bases de datos en memoria principal que se recupera de un fallo del
sistema.
Explíquense las ventajas relativas de
• Volver a cargar toda la base de datos en memoria principal, antes de reanudar el procesamiento de las
transacciones
• Cargar los datos a medida que los soliciten las transacciones

Respuesta:
• Cargar toda la base de datos en memoria, por adelantado, puede facilitar transacciones que necesiten alta
velocidad o accesos a datos en tiempo real con la garantía de que, una vez que se inicien, no tendrán que
esperar por accesos a disco para coger los datos.
Sin embargo, ninguna transacción puede ejecutarse hasta que toda la base de datos esté cargada.

• La ventaja de cargar bajo demanda es que el procesamiento de las transacciones puede iniciarse
inmediatamente; sin embargo, las transacciones pueden ver largos e impredecibles retrasos en los accesos a
disco, hasta que toda la base de datos se cargue en memoria.

24.7 En la técnica de compromiso en grupo, ¿cuántas transacciones deben formar parte de cada grupo?
Explíquese la respuesta.

Respuesta: Como los registros del registro histórico se escriben para almacenamiento estable en múltiplos de
un bloque, se deberían comprometer los grupos de transacciones de tal manera que el último bloque,
conteniendo los registros del registro histórico del grupo actual, esté casi lleno.

24.8 Indíquese si un sistema de transacciones de alto rendimiento es necesariamente un sistema de tiempo


real. ¿Por qué sí, o por qué no?

Respuesta: Un sistema de alto rendimiento no es necesariamente un sistema de tiempo real. En un sistema de


alto rendimiento la principal finalidad es ejecutar cada transacción tan rápido como sea posible, teniendo más
recursos y utilizándolos mejor. De este modo la velocidad media y el tiempo de respuesta son las principales
cosas a optimizar. En un sistema en tiempo real, la velocidad no es el tema central. Aquí, cada transacción
tiene una fecha límite y tener cuidado de que finalice dentro de la fecha límite o emplee un tiempo extra, tan
pequeño como sea posible, es el tema crítico.

24.9 En un sistema de bases de datos que utilice el registro histórico de escritura adelantada indíquese, en
el peor caso posible, el número de accesos a disco necesarios para leer un elemento de datos. Explíquese el
motivo por el que esto supone un problema para los diseñadores de sistemas de bases de datos de tiempo real.

Respuesta: En el peor de los casos, una lectura puede causar que una página del búfer se escriba en disco
(precedida por los correspondientes registros del histórico), seguido por la lectura desde disco de la página
que contiene los datos a acceder. Esto emplea dos o más accesos a disco y el tiempo requerido es varios
ordenes de magnitud mayor que la referencia de memoria principal, requerida en el mejor de los casos. Por lo
tanto, la variancia del tiempo de ejecución de una transacción es muy alta y sólo se puede estimar
pobremente. Por eso es difícil planificar los calendarios que necesitan finalizar en una fecha límite.

24.10 Explíquese el motivo por el que puede que no resulte práctico exigir la secuencialidad para las
transacciones de larga duración.

Respuesta: En presencia de transacciones de larga duración, el tratar de asegurar secuencialidad tiene varios
inconvenientes:
a. Con un esquema de espera para el control de concurrencias, las transacciones de larga duración
forzarán largos tiempos de espera. Esto significa que el tiempo de respuesta será alto, la concurrencia será
baja, con lo que sufrirá el rendimiento. También se incrementa la probabilidad de impases.

b. Con un esquema basado en marcas temporales, mucho trabajo hecho por una transacción de larga
duración se perderá si se ha de abortar.

c. Las transacciones de larga duración son generalmente interactivas y es muy difícil imponer
secuencialidad con interactividad.
Así, el requerimiento de secuencialidad no es práctico. Alguna otra noción de consistencia de base de datos ha
de emplearse para soportar transacciones de larga duración.

24.11 Considérese un proceso con varias hebras que entrega mensajes desde una cola duradera de mensajes
persistentes. Pueden ejecutarse de manera concurrente diferentes hebras, que intentan entregar mensajes
diferentes. En caso de fallo en la entrega, el mensaje debe restaurarse en la cola. Modélense las acciones que
lleva a cabo cada hebra como una transacción multinivel, de manera que no haga falta mantener los bloqueos
en la cola hasta que se entregue cada mensaje.

Respuesta: Cada hebra puede modelarse como una transacción T que toma un mensaje desde la cola y lo
dirige. Se pueden escribir transacciones T como una transacción multinivel, con subtransacciones T1 y T2. La
subtransacción T1 saca un mensaje de la cola y la subtransacción T2 lo dirige. Cada subtransacción libera
bloqueos una vez que se completa, permitiendo a otras transacciones acceder a la cola. Si falla la transacción
T2 en la conducción del mensaje, la transacción T1 se deshará mediante la invocación de una transacción
compensadora, que restaurará el mensaje en la cola.

24.12 Discútanse las modificaciones que hay que hacer en cada uno de los esquemas de recuperación
tratados en el Capítulo 17, si se permiten las transacciones anidadas. Explíquense también las diferencias que
se producen si se permiten las transacciones multinivel.

Respuesta:
• El algoritmo de recuperación avanzada del Apartado17.9 :
La operación rehacer, que repite la historia, es igual que antes. A continuación se discute la manera
en que se gestiona la operación rehacer.

Recuperación con transacciones anidadas:

Cada subtransacción necesita tener un único TID, porque una subtransacción fallida podría tener que ser
independientemente retrocedida y reinicializada. Si una subtransacción falla, las acciones de recuperación
dependen de si la transacción de nivel superior no terminada debe abortar o continuar. Si debe abortar, todas
las subtransacciones, terminadas o no, se deshacen mediante una lectura hacia atrás del registro histórico (esto
es posible porque los bloqueos, sobre los elementos de datos modificados, no se liberan tan pronto como
finaliza una subtransacción). Si la transacción anidada va a continuar, solo se deshace la transacción fallida y
después continua la transacción de nivel superior.
En el caso de un fallo del sistema, dependiendo de la aplicación, puede ser necesario abortar la transacción
anidada entera o (por ejemplo en el caso de transacciones de larga duración) las subtransacciones incompletas
y reanudar la transacción anidada. Si se debe abortar la transacción anidada, la vuelta atrás puede hacerse de
la manera usual mediante el algoritmo de recuperación, durante la operación deshacer. Si la transacción
anidada debe reiniciarse, cualquier subtransacción incompleta que necesite ser retornada puede hacerlo como
antes. Para reiniciar la transacción anidada, la información sobre el estado de la transacción, tal como los
bloques mantenidos y el estado de la ejecución, debe haberse anotado en el histórico y se debe restaurar
durante la recuperación. Las transacciones por lotes pequeños (discutidas en el Apartado 21.2.7) son un
ejemplo de transacciones anidadas que se deben reiniciar.

Recuperación con transacciones multinivel:

Además de lo hecho en el caso anterior, se han de gestionar los problemas causados por la exposición de
actualizaciones realizadas por subtransacciones comprometidas, de transacciones de nivel superior
incompletas. Una subtransacción comprometida puede tener bloqueos liberados que almacena, para que la
transacción compensadora los adquiera. Esto es claro en el caso de fallos de transacciones, pero es más
complicado en el caso de fallos del sistema.
El problema es que una subtransacción de nivel inferior a, de una transacción de nivel superior A, puede tener
bloqueos liberados que han de ser readquiridos para compensar a A durante la recuperación.
Desafortunadamente, puede haber alguna otra subtransacción de nivel inferior b, de una transacción de nivel
superior B, que arranque y adquiera los bloqueos liberados por a, antes de que finalice A. De este modo, los
registros deshacer para b pueden preceder la operación del registro comprometido por A. Pero si b no hubiera
terminado en el momento en que falla el sistema, primero debe ser retrocedida y liberada de sus bloqueos,
para permitir a la transacción compensadora de A readquirir los bloqueos.
Esto complica la operación deshacer, ya no puede hacerse en una lectura hacia atrás del registro histórico. La
recuperación multinivel se describe con detalle en David Lomet, “MLR: Un método de recuperación para
sistemas multinivel”, ACM SIGMOD Conf. on the Management of Data 1992, San Diego.

• Recuperación en un esquema de paginación en la sombra :


En un esquema basado en la paginación en la sombra, la implementación se complicará mucho si las
subtransacciones se van a ejecutar de manera concurrente. Si se van a ejecutar secuencialmente, la tabla de
páginas actual se copia a la tabla de páginas en la sombra, al final de cada subtransacción. La idea general de
recuperación es, entonces, similar al esquema basado en registros históricos, excepto en que las operaciones
deshacer y rehacer se hacen mucho más fácilmente, como en el Apartado 17.5.

24.13 Indíquese la finalidad de las transacciones compensadoras. Preséntense dos ejemplos de su


utilización.

Respuesta: Una transacción compensadora se emplea para realizar un deshacer semántico de los cambios
hechos previamente por transacciones comprometidas. Por ejemplo, una persona podría ingresar un cheque en
su cuenta de ahorro. Entonces la base de datos se actualizaría para reflejar el nuevo saldo. Dado que lleva
unos pocos días dar el visto bueno al cheque, podría descubrirse más tarde que el cheque se rechazó, en cuyo
caso se ejecutaría una transacción de compensadora para restar el importe del cheque rechazado desde la
cuenta del impositor. Otro ejemplo de cuando se emplearía una transacción compensadora es en un programa
de evaluación. Si la calificación de un estudiante en una tarea se va a cambiar después de haberse registrado,
un programa compensador (generalmente una opción del propio programa de evaluación) se ejecuta para
cambiar la calificación y rehacer los promedios, etc.
24.14 Considérese un sistema con varias bases de datos en el que se garantice que, como máximo, está
activa una transacción global en un momento dado y que cada sistema local asegura la secuencialidad local.
a. Sugiéranse maneras de que el sistema con varias bases de datos pueda asegurar que haya como
máximo una transacción global activa, en cualquier momento dado.
b. Demuéstrese, mediante un ejemplo, que resulta posible que se produzca una planificación global no
secuenciable, pese a estas suposiciones.

Respuesta:
a. Se puede tener un elemento de datos especial en algún sitio sobre el que, antes de iniciar una
transacción global, se tenga un bloqueo. El bloqueo debería liberarse después que se complete la transacción.
Esto asegura el requerimiento de una sola transacción global activa. Para reducir la dependencia sobre el sitio
particular en que tiene lugar, se puede generalizar la solución seleccionando el esquema para elegir uno de los
sitios actuales que sea el coordinador, y requerir que el bloqueo se solicite sobre el elemento de datos que
reside en el coordinador elegido actualmente.

b. La siguiente planificación implica dos sitios y cuatro transacciones. T1 y T2 son transacciones locales
ejecutándose en los sitios 1 y 2 respectivamente. TG1 y TG2 son transacciones globales ejecutándose en ambos
sitios. X1, Y1 son elementos de datos en el sitio 1, y X2, Y2 están en el sitio 2.

T1 T2 TG1 TG2
write(Y1)
read(Y1)
write(X2)
read(X2)
write(Y2)
read(Y2)
write(X1)
read(X1)

En esta planificación , TG2 se inicia sólo después de que TG1 termine. Dentro de cada sitio hay secuencialidad
local. En el sitio 1, TG2 ® T1 ® TG1 es un orden secuencial.
En el sitio 2, TG1 ® T2 ® TG2 es un orden secuencial. Todavía la planificación global no es secuenciable.

24.15 Considérese un sistema con varias bases de datos en el que cada sitio local asegura la secuencialidad
local y todas las transacciones globales son sólo de lectura.
a. Demuéstrese mediante un ejemplo que pueden producirse ejecuciones no secuenciables en este
sistema.
b. Muéstrese la manera en que se podría utilizar un esquema de billete para asegurar la secuencialidad
global.

Respuesta:
a. Se supone el mismo sistema que el de la respuesta del Ejercicio 24.14, excepto en que ahora las dos
transacciones globales son de sólo lectura. Considérese la planificación siguiente.

T1 T2 TG1 TG2
read(X1)
write(X1)
read(X1)
read(X2)
write(X2)
read(X2)
Aunque hay secuencialidad local en ambos sitios, la planificación global no es secuenciable.

b. Dado que la secuencialidad está garantizada, cualquier ciclo en el amplio sistema del grafo
precedente debe implicar,al menos, dos sitios y dos transacciones globales diferentes. El esquema de billete
asegura que siempre que dos transacciones globales tengan acceso a los datos de un sitio, entran en conflicto
con los datos (el billete) de cada sitio. El gestor de transacciones globales controla el acceso del billete, de tal
manera que las transacciones globales se ejecutan con el mismo orden secuencial en todos los sitios. Así se
elimina la probabilidad de su participación en un ciclo del amplio sistema del grafo precedente

También podría gustarte