Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PREFACIO ____________________________________________________ 4
INTRODUCCIÓN _______________________________________________ 5
SQL _______________________________________________________ 38
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.
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.
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.
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.
• 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.
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.
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.
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.
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.
Respuesta:
a. Véase la Figura 2.4
b. Véase la Figura 2.5
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)
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.
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.
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?
• 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.
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
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.
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).
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.
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.
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.
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).
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.
• 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.
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á.
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.
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.
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))
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))
g.
1
Õnombre-persona (trabaja) - Õtrabaja.nombre-persona (trabaja
|x| (trabaja.sueldo £ trabaja2.sueldo Ù trabaja2.cpnmbre-compañía =“Banco Pequeño”)
r trabaja2 (trabaja)))
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.
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.
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))
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)))
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))
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.
Respuesta:
a. {t | $ q Î r (q[A] = t[A])}
b. {t | t Î r Ù t[B] = 17}
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)}
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)))
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)}
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.
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 €.
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.
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
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’)
select nombre-empleado
from trabaja T
where sueldo > (select avg (sueldo)
from trabaja S
where T.nombre-compañía = S.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’
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
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)
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
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.
¿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.
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.
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.
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)
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
)
)
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
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.
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.
condiciones
fecha =
( ³ 1989-00-00 and
£ 1989-12-31 )
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.
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".
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.
b. Averiguar el nombre y la ciudad de residencia de todos los empleados que trabajan para el Banco
Importante.
i.
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.
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.
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.
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.
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.
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.
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.
condiciones
_x > AVG.ALL._z
condiciones
CNT.UNQ._x ³ MAX.CNT.UNQ.ALL._y
c. Buscar la empresa que tiene el menor sueldo medio.
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.
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.
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:
condiciones
_y > 100000/1.1
Segunda actualización:
condiciones
_y £ 100000/1.1
e. Borrar todas las tuplas de la relación trabaja para los empleados del Banco Pequeño.
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.
b. s B = 17 (r)
i.
r A B C
P. 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
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
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
c. r1 - r2
i.
r1 A B C
P. _a _b _c
r2 A B C
¬ _a _b _c
r1 A B C
_a _b
r2 A B C
_b _c
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:
Respuesta:
a. {<a> | $ b (<a, b> Î r Ù b = 17)}
i.
r A B
P. 17
s A C
_a _c
result A B C
P. _a _b _c
r A B
_a >_s
_c _s
s A C
P._a _c
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
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:
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.
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)
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.
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))
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:
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
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
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
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.
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.
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
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.
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
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.
(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.
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[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
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.
• 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.
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).
i a ® b y a ® g, entonces a ® bg.
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
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
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+.
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.
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.
• 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);
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).
A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
A B C
a1 b1 c1
a2 b2 c1
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
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
7.18 Demuéstrese que la descomposición del Ejercicio 7.2 no es una descomposición que preserve las
dependencias.
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.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
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.
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
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).
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;
};
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.
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.
• 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:
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:
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
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.
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
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’
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.
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:
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.
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)
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.
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:
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.
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:
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>
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
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”.
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:
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.
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.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.
<!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.
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.
<!DOCTYPE partes [
<!ELEMENT parte (nombre, informaciónsubpartes*)>
<!ELEMENT informaciónsubpartes (parte, cantidad)>
<!ELEMENT nombre (#PCDATA )>
<!ELEMENT cantidad (#PCDATA )>
] >
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)
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.
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.
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:
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:
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).
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
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
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 ^ ^
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).
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.
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?
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.
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
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.
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.
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.
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: 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.
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:
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
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
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?.
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.
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?
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.
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:
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
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;
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.
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
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.
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.
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
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:
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.
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
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
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”.
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.
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
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.
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
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.
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:
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
Obviamente, si una tupla t pertenece a R2 - R3, entonces t[atributos de R2] Î E2 y t[atributos de R2] Ï E3. Por
lo tanto:
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:
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:
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)}.
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)
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)
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
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
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.
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.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.
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).
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
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á.
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:
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)
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.
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.
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.
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.
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
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:
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).
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.
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).
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?
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.
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.
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.
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.
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.
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.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
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.
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: 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
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.
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
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.
• 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.
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.
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.
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:
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
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.
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.
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?
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.
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
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.
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 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?
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.
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á
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.
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.
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.
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
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.
• 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-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.
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.
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.
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.
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.
• 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.
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.
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
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.
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:
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.
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.
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
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.
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.
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.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.
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.
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.
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