Documentos de Académico
Documentos de Profesional
Documentos de Cultura
datos
Jordi Casas Roma
Los textos e imágenes publicados en esta obra están sujetos –excepto que se indique lo contrario– a
v.3.0. Se puede copiar, distribuir y transmitir la obra públicamente siempre que se cite el autor y la
fuente (Fundació per a la Universitat Oberta de Catalunya), no se haga un uso comercial y ni obra
http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es
Índice
Introducción
Objetivos
2.1.1.Recogida de requisitos
2.2.1.El modelo ER
2.5.2.Procesamiento de vistas
2.5.3.Administración de la seguridad
Resumen
Glosario
Bibliografía
Introducción
El diseño de bases de datos es un proceso complejo que permite obtener una implementación de
una base de datos a partir de los requisitos iniciales de los usuarios del sistema de información.
Este proceso guía al diseñador de bases de datos por varias etapas con el objetivo de segmentar
un problema de una complejidad considerable en diferentes subproblemas de menor
complejidad.
Cada uno de los subproblemas identificados corresponde a una de las etapas del proceso de
diseño de bases de datos. En estos materiales didácticos se describe el proceso global de diseño
de bases de datos y las diferentes etapas que lo forman. Este módulo es solo un texto
introductorio al diseño de bases de datos y será necesario profundizar en el estudio de cada una
de sus etapas mediante los distintos módulos de la asignatura que corresponden a las diferentes
etapas del proceso. Así pues, en este módulo se presenta una visión general de todo el proceso
de diseño de bases de datos.
Objetivos
En estos materiales encontraréis las herramientas indispensables para lograr los objetivos
siguientes:
1. Entender en qué consiste el diseño de bases de datos y cuáles son sus objetivos.
2. Conocer las distintas etapas que integran el proceso de diseño de una base de datos.
Mediante un proceso de diseño de bases de datos, se pueden decidir las tablas y relaciones que
debe tener una base de datos determinada, los atributos de las diferentes tablas, las claves
primarias y las claves foráneas que se deben declarar en cada tabla, etc. Todas estas tareas
forman parte del proceso de diseño de bases de datos. Para poder tomar estas decisiones de la
manera más correcta posible, hay que tener en cuenta las necesidades de información de los
usuarios en relación con un conjunto concreto de aplicaciones.
Por lo tanto, el diseño de una base de datos es el proceso en el que se define la estructura de los
datos que debe tener la base de datos de un sistema de información determinado.
Si aplicamos este concepto, obtenemos las diferentes etapas del diseño de bases de datos. Estas
etapas son secuenciales y el resultado de cada una sirve de punto de partida de la etapa
siguiente. El resultado de la última etapa será el diseño final de nuestra base de datos. De este
modo, un proceso de una cierta complejidad se descompone en diferentes procesos de menor
complejidad. La figura 1 muestra las distintas etapas del diseño de bases de datos.
En primer lugar, tenemos la recogida y análisis de requisitos. Esta etapa debe permitir
obtener los requisitos y las restricciones de los datos del problema. Para obtener esta
información será necesario mantener conversaciones con los diferentes usuarios de la futura
base de datos y de las aplicaciones que estén relacionadas con ésta. Sólo si se cruzan los
requisitos de los diferentes perfiles de usuarios será posible establecer un marco completo de
requisitos y las restricciones de los datos relacionados con la futura base de datos.
en un conjunto de problemas más sencillos donde la resolución de los diferentes subproblemas implica
tipo de software específico que sirve de interfaz entre la base de datos, el usuario y las aplicaciones
que la utilizan.
Hasta esta etapa del diseño de bases de datos todavía no ha sido necesario elegir el tipo de
bases de datos que se utilizará (relacional, orientada a objetos, documental, etc.) ni el sistema
gestor de bases de datos (SGBD (1) ) que se utilizará o el lenguaje concreto con el que se
implementará la base de datos.
En el momento en el que se inicia la tercera etapa del proceso de diseño, el diseño lógico, hay
que determinar el tipo de bases de datos que se utilizará. Es decir, no es necesario todavía
escoger un SGBD concreto, pero sí el tipo de bases de datos que se quiere utilizar. En esta etapa
el esquema conceptual se convierte en un esquema lógico adecuado al tipo de bases de datos
que se pretende usar.
En este punto, y antes de iniciar la etapa de diseño físico, hay que elegir un SGBD concreto
sobre el que se pretende implementar la base de datos. La etapa de diseño físico adapta el
esquema lógico a las necesidades específicas de un SGBD concreto y, posteriormente, ajusta
algunos parámetros para el funcionamiento correcto de la base de datos. Por base de datos
concreta o SGDB concreto entendemos una aplicación concreta de bases de datos. En el caso de
bases de datos relacionales, ejemplos de SGBD concretos son Oracle Database, Mysql, SQL
Server o IBM Informix, entre otros.
Estas etapas del diseño no hay que seguirlas estrictamente de manera secuencial, y en muchos
casos es habitual rehacer el diseño de la etapa anterior a partir de necesidades detectadas en
fases posteriores. Estos bucles de retroalimentación son habituales y permiten afinar los
diseños de las distintas etapas de una manera iterativa.
El proceso que muestra la figura 1 se basa en el modelo de diseño orientado a datos. Este
modelo se centra en el diseño de los contenedores de la información y en la estructura de la
base de datos. Paralelamente a este modelo existe el modelo de diseño orientado a procesos,
que se centra en las aplicaciones de bases de datos para determinar los datos y el uso que de
estas hacen las aplicaciones. Tradicionalmente, el diseño de aplicaciones se ha basado en este
segundo modelo, pero cada vez resulta más claro que ambas actividades son paralelas y que
están estrechamente interrelacionadas. Las herramientas de diseño de bases de datos y de
aplicaciones se combinan cada vez con mayor frecuencia.
2.1.1.Recogida de requisitos
Para determinar los requisitos, en primer lugar hay que establecer los actores del sistema de
información que interaccionarán con la base de datos. Esto incluye a los usuarios y las
aplicaciones, tanto si son nuevos como si no lo son. Normalmente, un grupo de analistas se
encarga de hacer el análisis de requisitos y, muy probablemente, este análisis suele ser
informal, incompleto e incluso incoherente en algún punto. Por lo tanto, hay que dedicar muchos
esfuerzos a trabajar esta información y convertirla en una especificación que los diseñadores de
bases de datos puedan utilizar para modelizar e implementar el sistema de información.
En esta fase, no solo hay que recoger y analizar los requisitos referentes a la estructura o la
forma de la información (tipos de datos y relaciones entre ítems de datos), sino que hay que
capturar y analizar cualquier tipo de requisito, independientemente de qué tipo sea. Hay que
recoger, analizar y documentar cualquier requisito que los usuarios esperen de la base de datos.
Esto incluye los procesos que se deben ejecutar sobre la base de datos, las restricciones sobre
los datos, las restricciones sobre el rendimiento del sistema de información, las restricciones
relativas a la implementación (tanto en lo que respecta al hardware como en lo que se refiere al
software), requisitos de seguridad o requisitos de rendimiento (por ejemplo, tiempo de
respuesta), entre otros. Algunas de las actividades más habituales de esta fase son las
siguientes:
Identificar los grupos de usuarios y las principales áreas de aplicación que utilizarán la
base de datos y que se verán directa o indirectamente afectados por ésta. Dentro de
cada grupo hay que elegir usuarios clave y formar comités para llevar a cabo la
recopilación y la especificación de requisitos.
Estudiar el entorno actual y el uso que se quiere dar a la información. Esto incluye el
estudio de las entradas, el flujo y las salidas de información, además de las
frecuencias y los usos de las diferentes tareas dentro del sistema de información.
Hacer entrevistas y encuestas a los futuros usuarios para que puedan manifestar su
opinión y sus prioridades acerca del nuevo sistema de información.
Esta fase puede representar un coste importante dentro del proceso de diseño de una base de
datos, pero es muy importante y puede ser determinante para el éxito o el fracaso del sistema
de información. Detectar y corregir los errores o problemas en las fases iniciales del proyecto es
mucho menos costoso que arrastrar los errores hasta las fases finales, cuando corregirlos tendrá
unos costes mucho más importantes. La satisfacción del usuario final vendrá determinada por la
capacidad de recoger y captar sus necesidades e implementarlas de manera correcta en la
solución final.
OOA es la sigla de la expresión inglesa object oriented analysis.
(3)
La notación Z
Un esquema conceptual es una descripción concisa de los requisitos de datos que se expresa
mediante conceptos proporcionados por un modelo de datos de alto nivel, fácil de entender y sin
detalles de implementación. El esquema, además, debe servir de referencia para verificar que se
han agrupado todos los requisitos y que no hay ningún conflicto entre ellos.
En esta fase del diseño todavía no se considera el tipo de base de datos que se utilizará. Y, por
lo tanto, tampoco el SGBD ni el lenguaje concreto de implementación de la base de datos. En
esta etapa nos concentraremos en la estructura de la información, sin resolver de momento
cuestiones relacionadas con la tecnología.
2.2.1.El modelo ER
Hay varios modelos de datos de alto nivel que permiten modelizar los requisitos, las
especificaciones y las restricciones que se han obtenido en la primera fase del diseño de una
base de datos. Uno de los más conocidos y utilizados es el modelo entidad-interrelación, que
abreviaremos como modelo ER. Este modelo es uno de los más utilizados en el diseño
conceptual de las aplicaciones de bases de datos, principalmente, debido a su simplicidad y
facilidad de uso.
Los principales elementos que incluye el modelo son los tipos de entidad, los atributos y los tipos
de relaciones entre entidades. El objetivo principal del modelo ER es permitir a los diseñadores
reflejar en un modelo conceptual los requisitos del mundo real que sean de interés para el
problema. El modelo ER facilita el diseño conceptual de una base de datos y, como ya hemos
comentado, es aplicable al diseño de cualquier tipo de bases de datos.
Modelo ER
Lenguaje UML
propósito general para modelizar sistemas de software. Este estándar fue creado, y actualmente es
En esta etapa se parte del diseño conceptual desarrollado en el paso anterior y se obtiene un
diseño lógico de la futura base de datos. En esta transformación se ajusta el modelo
considerando el tipo de SGBD en el que se quiere implementar la base de datos. Por ejemplo, si
se quiere crear la base de datos en un sistema relacional, esta etapa obtendrá un conjunto de
relaciones con sus atributos, sus claves primarias y sus claves foráneas correspondientes.
En esta etapa nos concentramos en las cuestiones tecnológicas relacionadas con el modelo de la
base de datos, asumiendo que en la etapa anterior ya hemos resuelto la problemática de
estructuración de la información desde el punto de vista conceptual.
Por lo tanto, el resultado de esta etapa será un modelo lógico de la estructura de la información.
Generalmente, cuando este modelo lógico hace referencia a un SGBD relacional, se
denomina modelo relacional. En este material nos centraremos en la transformación del modelo
conceptual a un modelo relacional, es decir, a un modelo lógico para una base de datos
relacional.
En el diseño lógico se pueden ver tres subfases o partes independientes, que se aplican de
manera secuencial para transformar el modelo conceptual obtenido en la fase anterior en un
modelo lógico que será el resultado de esta fase. En primer lugar, en la subfase
llamada reconsideraciones del modelo conceptual revisamos el modelo conceptual para
asegurarnos de que está libre de algunos errores tipificados e identificables. A continuación, se
produce la transformación del modelo conceptual en el modelo lógico y, finalmente, aplicamos la
teoría de la normalización al modelo lógico.
El modelo relacional
2.3.3.Normalización
La teoría de la normalización aplica la teoría de conjuntos, la lógica y el álgebra relacional para
formalizar un conjunto de ideas simples, que guían un buen diseño de bases de datos
relacionales.
La teoría de la normalización utiliza las formas normales (FN) para reconocer los casos en los
que no se aplican buenos criterios de diseño. Una relación está en una forma normal
determinada si satisface un conjunto de restricciones específicas que son propias de esta forma
normal. La infracción de estas restricciones origina que la relación tenga un conjunto de
anomalías y redundancias de actualización no deseables. Las formas normales son declarativas,
es decir, cada forma normal indica las restricciones que se deben cumplir, pero no describe
ningún procedimiento para conseguirlo.
Los componentes físicos que forman cada SGBD son específicos. Los fabricantes utilizan
estrategias y tecnologías diferentes para maximizar el rendimiento de sus sistemas gestores de
bases de datos. En este nivel no existe ningún estándar y, por lo tanto, habrá que adaptar el
esquema lógico obtenido en el paso anterior, teniendo presentes las características de cada
sistema gestor. El diseñador debe considerar los aspectos de implementación física y de
eficiencia que dependen específicamente del SGBD elegido.
El diseño físico es una fase del proceso de diseño de bases de datos que adapta el esquema
lógico obtenido en la fase anterior al SGBD concreto, que utilizará el sistema de información.
También es importante conocer las características de los procesos que consultan y actualizan la
base de datos, como por ejemplo las frecuencias de ejecución y los volúmenes que se espera
tener de los diferentes datos que se quieren almacenar con el fin de conseguir un buen
rendimiento de la base de datos.
Algunos criterios importantes que pueden ser útiles para elegir las opciones de diseño físicas de
la base de datos son los siguientes:
Tiempo de respuesta. Es el tiempo que transcurre desde que se envía una petición al
SGBD hasta que éste devuelve los datos de la respuesta. Una parte importante de
este tiempo está bajo el control del SGBD y hace referencia al tiempo de acceso por
parte del SGBD a los datos requeridos para generar la respuesta. Otros aspectos no
son controlados por el SGBD, como por ejemplo la planificación del sistema operativo
o los tiempos de acceso a los medios físicos de almacenamiento de los datos.
Uso del espacio. Es la cantidad de espacio de disco utilizado por los ficheros de la base
de datos y las estructuras de rutas de acceso al disco, incluyendo índices y otras rutas
de acceso.
El estándar SQL incorpora la definición de todos los componentes del diseño lógico de la base de
datos. En cambio, no contiene ningún elemento del diseño físico.
Para transformar el diseño lógico de la base de datos en un SGBD concreto, partimos de las
definiciones de tablas (con toda la información relacionada; es decir, atributos, claves primarias,
claves foráneas y claves alternativas). A continuación se relaciona cada elemento con un espacio
adecuado en el nivel virtual y finalmente se relaciona cada espacio virtual con un fichero físico,
que constituye el nivel físico del sistema de información.
Finalmente, también habrá que concretar los diferentes roles de usuarios y aplicaciones para
poder determinar los permisos de los diferentes grupos. El componente de gestión de la
seguridad y las vistas permiten limitar los accesos y de este modo reducir el riesgo de problemas
derivados de accesos no autorizados.
Los SGBD relacionales evalúan sistemáticamente las posibles estrategias alternativas que se
pueden presentar, con el objetivo de elegir la que se considera óptima. El procesamiento de
consultas recoge todo el conjunto de actividades realizadas por el SGBD, que tienen como
objetivo la extracción de información de la base de datos para lograr la estrategia más eficiente
y proporcionar un mejor rendimiento del sistema de información.
c) Optimización física, con el objetivo de elegir entre los distintos planes de evaluación –que
pueden tener costes diferentes– el que sea más eficiente. Para determinar el coste más eficiente
hay que conocer el coste de cada operación, que a menudo depende de diferentes parámetros.
3) Generación de código.
4) Ejecución de la consulta.
La optimización de consultas es un aspecto muy importante que hay que considerar cuando se
diseña y se construye un SGBD relacional. Las técnicas que se utilizan para optimizar consultas
condicionan el rendimiento global del sistema, puesto que determinan el tiempo que necesita el
sistema gestor para resolver las consultas que han hecho los usuarios.
2.5.2.Procesamiento de vistas
Una vista es una tabla lógica que permite acceder a la información de una o varias tablas
mediante una consulta predefinida. No contiene información por sí misma, sino que se basa en
información de otras tablas. Las vistas proporcionan mecanismos de seguridad y permiten al
diseñador de la base de datos personalizar la vista que tienen los diferentes usuarios de la base
de datos.
Hacer un uso adecuado de las vistas es un aspecto clave para lograr un buen diseño de una base
de datos, puesto que nos permite ocultar los detalles de las tablas y mantener la visión del
usuario independientemente de la evolución que tenga la estructura de tablas.
Las vistas habían sido durante mucho tiempo un simple mecanismo de simplificación de
consultas, pero actualmente tienen una importancia capital en varias áreas, como el diseño
externo, los almacenes de datos (5) o la informática distribuida.
En inglés, data warehouse.
(5)
2.5.3.Administración de la seguridad
Por último, hay que tener en cuenta las técnicas que se emplean para proteger la base de datos
contra accesos no autorizados y los mecanismos para asignar y revocar privilegios a los
diferentes usuarios. De estas y otras acciones se encarga el componente de seguridad del SGBD.
Este componente viene siendo cada día más importante, dado que en la actualidad una gran
cantidad de ordenadores y otros tipos de dispositivos están interconectados y, por lo tanto,
cualquier persona podría convertirse en usuario, y posible atacante, de una base de datos.
Resumen
En este módulo hemos visto, de una manera muy general, el proceso de diseño de una base de
datos.
Hemos introducido, aunque muy brevemente, las distintas etapas que forman el proceso de
diseño de una base de datos. Abordaremos este tema en detalle en el resto de los módulos de la
asignatura.
El proceso de diseño de una base de datos se inicia con la fase de recogida y análisis de
requisitos, lo cual permite recoger y centralizar las necesidades de los diferentes grupos de
usuarios y aplicaciones. A partir de este análisis, en la segunda fase, se modeliza un esquema
conceptual que permite describir el modelo de datos de una manera independiente de la
tecnología.
La etapa siguiente en este proceso es el diseño lógico, que requiere haber elegido previamente
el tipo de base de datos que se quiere utilizar en la implementación del sistema de información.
El tipo de base de datos determina el modelo lógico que va a desarrollarse. Por ejemplo, en el
caso de utilizar un tipo de base de datos relacional, se transforma el modelo conceptual en un
modelo lógico específico para bases de datos relacionales denominado modelo relacional.
El diseño físico permitirá adaptar el modelo lógico a un sistema gestor de bases de datos (SGBD)
concreto. Por lo tanto, previamente a este paso se deberá escoger el SGBD específico que se
quiere utilizar para implementar el sistema de información. En esta etapa se crea la estructura
física que almacenará los datos de la base de datos.
Glosario
database management system f
Véase sistema gestor de bases de datos.
sigla DBMS
divide y vencerás loc
Estrategia que propone resolver un problema complejo mediante la subdivisión en un
conjunto de problemas más sencillos cuya resolución implica resolver el problema inicial.
en divide and conquer
modelo ER m
Modelo entidad-interrelación de datos de alto nivel que permite modelizar los requisitos,
las especificaciones y las restricciones.
en entity-relationship model
SGBD m
Véase sistema gestor de bases de datos.
UML m
Véase lenguaje unificado de modelización.
Bibliografía
Elmasri, Ramez; Navathe, Shamkant, B. (2007). Fundamentos de sistemas de bases de
datos (5.ª ed.). Madrid: Pearson Educación.
v.3.0. Se puede copiar, distribuir y transmitir la obra públicamente siempre que se cite el autor y la
fuente (Fundació per a la Universitat Oberta de Catalunya), no se haga un uso comercial y ni obra
http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es
Índice
Introducción
Objetivos
1.1.1.Metodologías de diseño
1.1.2.Estrategias de diseño
o 1.2.El modelo ER
o 2.2.Atributos
2.2.5.Atributos derivados
o 2.4.Tipos de relaciones
2.4.3.Tipos de relaciones n-arias
o 2.7.Opciones de diseño
o 2.9.Ejemplo completo
3.1.1.Restricciones en la generalización/especialización
3.1.3.Clasificación múltiple
o 3.2.Agregación y composición
o 3.3.Restricciones de integridad
3.3.4.Otras restricciones
o 3.4.Modelización de datos históricos
o 3.5.Ejemplo completo
Resumen
Glosario
Bibliografía
Introducción
El diseño conceptual de bases de datos es la segunda etapa después del análisis de requisitos en
el proceso de diseño de una base de datos. El diseño conceptual permite crear un esquema
conceptual de alto nivel e independiente de la tecnología de implementación a partir de las
especificaciones y los requisitos de un problema del mundo real. Durante este proceso hay que
extraer las necesidades y los requisitos de los problemas planteados con el fin de sintetizar en
un modelo visual la representación de los datos y las restricciones de los conceptos que se
desean representar en el sistema de información.
El objetivo de esta etapa es elaborar un modelo conceptual del problema. Este modelo se
representa mediante algún modelo de datos de alto nivel. Uno de los modelos más conocidos es
el modelo entidad-interrelación (modelo ER). Dicho modelo ha tenido una gran relevancia hasta
nuestros días, aunque actualmente el uso del lenguaje unificado de modelización (UML) ha
tomado una gran fuerza en todos los ámbitos de la computación. Inicialmente, este último se
desarrolló para modelizar sistemas de software, pero la potencia y la flexibilidad que tiene lo han
convertido en un lenguaje ideal para otros ámbitos de la computación.
Concretamente, en este módulo explicaremos los principios del diseño conceptual y la aplicación
de este diseño mediante diagramas en lenguaje UML.
Objetivos
En los materiales didácticos de este módulo encontraréis las herramientas indispensables para
lograr los objetivos siguientes:
3. Estudiar los diagramas de clases UML como herramienta para representar modelos de
datos.
Un esquema conceptual es una descripción concisa de los requisitos de datos por parte de los
usuarios e incluye descripciones detalladas de las entidades que están involucradas, las
relaciones entre estas entidades y las restricciones de integridad que tienen. Se expresa
mediante conceptos proporcionados por un modelo de datos de alto nivel, que debe ser fácil de
entender y no debe contener detalles de implementación.
El esquema conceptual, además, debe servir como referencia para verificar que se han
considerado todos los requisitos y que no hay conflicto entre ellos. Si algunos de los requisitos
iniciales no se pueden representar gráficamente en el modelo conceptual, deben añadirse de
manera textual, para asegurarnos de que quedan recogidos en el modelo conceptual y de que se
tendrán en cuenta en las fases siguientes del diseño de la base de datos. Hay diferentes
lenguajes para representar modelos conceptuales de datos. Algunas características importantes
para representar modelos conceptuales de datos son estas:
Además de las características comentadas, hemos dicho que un esquema conceptual es una
descripción de alto nivel e independiente de la tecnología. Estas dos características son
importantes para un lenguaje que permita definir un modelo conceptual. Hay muchas razones
que destacan estas dos características como importantes en el modelo conceptual, entre las
cuales se pueden señalar las siguientes:
El uso del modelo conceptual permite a los diseñadores de bases de datos concentrarse
en expresar las propiedades, las asociaciones y las restricciones de los datos sin
preocuparse de los detalles de implementación y con independencia de las
particularidades de los diferentes sistemas gestores de bases de datos (SGBD (1) ).
El modelo se puede utilizar como vehículo de comunicación entre los usuarios, los
diseñadores y los analistas de la base de datos.
1.1.1.Metodologías de diseño
A partir de los requisitos recopilados y trabajados en la primera fase del proceso de diseño de
una base de datos se pueden establecer dos metodologías básicas para el diseño conceptual de
bases de datos:
1.1.2.Estrategias de diseño
A partir de un conjunto de requisitos, recopilados para un único usuario o para un conjunto de
ellos, hay que diseñar un esquema conceptual que los satisfaga. Para llevar a cabo esta tarea, se
pueden utilizar diferentes estrategias. La mayoría utilizan un método incremental, es decir,
empiezan por modelizar algunas estructuras principales derivadas de los requisitos y las van
modificando y refinando en diferentes iteraciones del mismo proceso.
Algunas de las estrategias más utilizadas para el diseño conceptual de bases de datos son las
siguientes:
b) Estrategia ascendente: se empieza el proceso con un esquema que contiene los detalles de
las abstracciones y se van combinando de manera sucesiva formando conjuntos de más entidad
o conceptos complejos.
d) Estrategia mixta: esta estrategia divide los requisitos según una estrategia descendente y
entonces construye cada una de las divisiones siguiendo una estrategia ascendente. Finalmente
se combinan las partes para generar el esquema completo.
1.2.El modelo ER
El modelo entidad-interrelación, o modelo ER, es un modelo conceptual de datos de alto
nivel e independiente de la tecnología. Este modelo y las variaciones que tiene constituyen los
modelos más utilizados por el diseño conceptual de las aplicaciones de bases de datos. Esto se
debe, principalmente, a la simplicidad y la facilidad de uso. Los principales elementos que
incluye el modelo son las entidades, los atributos y las relaciones entre entidades.
Este modelo facilita el diseño conceptual de una base de datos y es aplicable al diseño de
cualquier tipo de bases de datos (relacionales, orientadas a objetos, etc.), ya que en la etapa del
diseño conceptual no se tiene en cuenta todavía la tecnología concreta que se empleará para
implementar la base de datos.
Modelo ER
El modelo ER tiene el origen en los trabajos hechos por Peter Chen en 1976. Posteriormente,
otros muchos autores han propuesto variantes y ampliaciones para este modelo. Por lo tanto, en
la literatura se pueden encontrar variaciones en el modelo ER que pueden diferir simplemente en
la notación diagramática o en algunos conceptos en los que se basan para modelizar los datos.
en la Universidad de Harvard en 1973. Posteriormente, en 1976, desarrolló el modelo ER, hecho por el
que es conocido.
El lenguaje UML lo desarrolló la compañía Rational Software Corporation durante los años
noventa. Después de un periodo en el que coexistieron diferentes tendencias en la modelización
orientada a objetos, la compañía unificó los esfuerzos de tres pioneros en esta área: James
Rumbaugh, Grady Booch e Ivar Jacobson. En 1996 se creó el consorcio UML Partners con el
objetivo de completar la especificación de UML. En enero de 1997 se publicó la versión 1.0 de
UML. Durante el mismo año se publicó la versión 1.1, que aceptó y adoptó el consorcio OMG.
Finalmente, la versión 2.0 se publicó en el 2005. En el momento de escribir este material, la
última versión es la 2.3, publicada en mayo del 2010.
El lenguaje UML incorpora una gran cantidad de diagramas que permiten representar el modelo
de un sistema desde diferentes perspectivas. Podemos encontrar diagramas que hacen
referencia a la estructura (por ejemplo, diagramas de clase, diagramas de componentes o
diagramas de paquetes), diagramas referentes al comportamiento (por ejemplo, diagramas de
actividad o diagramas de casos de uso) o diagramas referentes a la interacción (por ejemplo,
diagramas de comunicación o diagramas de secuencia).
especificaciones de tecnologías orientadas a objetos, como UML, XMI o CORBA. Es una organización
sin ánimo de lucro que promueve el uso de la tecnología orientada a objetos mediante guías y
Diagramas estructurales:
El dominio del discurso, universo del discurso, o simplemente dominio, es el conjunto de cosas de las
Diagramas de comportamiento:
Los espacios de tabla (tablespaces) se ven en el subapartado 5.2 del módulo “Diseño físico de bases
2.1.Tipos de entidades
Entendemos por entidad un objeto del mundo real, que tiene identidad propia y que es
distinguible del resto de los objetos.
Las entidades pueden ser objetos con existencia física (por ejemplo, un coche o una persona) u
objetos con existencia conceptual (por ejemplo, un trabajo o una asignatura de un curso
universitario).
Ejemplos de entidades
Algunos ejemplos de entidad son una manzana, un coche o una persona. Otros ejemplos, que no
son tangibles pero que tienen identidad y son distinguibles del resto, son un pedido a un
proveedor, una petición de préstamo en una biblioteca o una incidencia municipal.
Entendemos por tipo de entidad la abstracción que permite definir el conjunto de objetos con
las mismas propiedades, comportamiento común, semántica común e idéntica relación con los
demás objetos.
Ejemplos de entidades
El tipo de entidad coche se define como el concepto de vehículo que describe las partes comunes
de diferentes coches con independencia de la marca, el color, el modelo y otras características
concretas. Un coche concreto, por ejemplo mi coche, es una instancia u ocurrencia del tipo de
entidad coche.
En la literatura se pueden encontrar autores que utilizan las diferentes terminologías y, por lo
tanto, hay que tenerlas todas presentes para identificar de manera rápida y unívoca a qué
concepto se hace referencia cuando se utiliza cualquiera de estos términos.
Terminología UML
entidades, objetos.
2.2.Atributos
Un atributo es una propiedad que tienen todas las entidades de un mismo tipo de entidad y que
permite representar sus características.
Para representar gráficamente los tipos de entidad y sus atributos, utilizaremos los diagramas de
clases del modelo UML.
Diagrama de clases
El tipo de entidad ‘coche’ tiene un conjunto de atributos; por ejemplo: marca, modelo, matrícula,
color y año de fabricación. Una entidad de coche tiene valores específicos para cada uno de
estos atributos. Por ejemplo, un coche puede ser de la marca Fiat, modelo Punto, matrícula
3621-GHV, color negro y fabricado en el 2010.
De manera similar, el tipo de entidad ‘persona’ tiene un conjunto de atributos; por ejemplo:
identificación (en el caso de España es el documento nacional de identidad o DNI), nombre y
apellidos, fecha de nacimiento, número de teléfono y correo electrónico. Una entidad de
‘persona’ puede ser, por ejemplo, una persona con DNI 33551058D, nombre Fred y apellido
Smith, nacido el 1 de marzo de 1968, con número de teléfono 85542154 y correo electrónico
fredsmith@mydom.com.
En los diagramas de clases del modelo UML representaremos los tipos de entidad
(denominados clases en los diagramas UML) mediante un rectángulo con tres secciones. En la
primera sección indicaremos el nombre del tipo de entidad. Los atributos se representan como
una lista en la segunda sección, y la tercera sección permite representar ciertas restricciones
sobre los datos u operaciones, que no utilizaremos en el diseño conceptual de bases de datos.
En teoría, un atributo no es más que un tipo de relación binaria en la que uno de los participantes es
un tipo de dato (podéis ver el subapartado siguiente). No obstante, para simplificar el modelo y
Tipos de entidad
La figura 2 muestra un tipo de entidad en el que podemos ver un atributo opcional (surname),
un atributo derivado (age), un atributo de tipo enumeración (sex), un atributo con valor inicial
especificado (isWearingGlasses) y un atributo multivalor (phoneNumber). Una nota asociada al
atributo age indica la fórmula de cálculo de este atributo derivado.
Un atributo de tipo enumeración presenta un conjunto cerrado de valores que el atributo puede tomar.
Por ejemplo, se pueden definir los días de la semana como un atributo de tipo enumeración, donde el
conjunto de posibles valores es lunes, martes, miércoles, jueves, viernes, sábado y domingo.
La figura 3 muestra el tipo de entidad ‘coche’ (Car), en el que se especifica el dominio para cada
uno de sus atributos.
En este ejemplo hemos definido un nuevo atributo para indicar el número de plazas de un coche
(seats), que corresponde al dominio de los enteros y que está limitado por un valor mínimo de 1
plaza y un valor máximo de 10 plazas (para este ejemplo se considera que no hay coches que
tengan un número de plazas superior a 10). Para indicar esta restricción sobre el dominio en
UML se pueden utilizar notas textuales o recurrir a uno de los lenguajes que permiten definir
restricciones sobre los modelos UML, como por ejemplo OCL.
Figura 3. Ejemplo de los tipos de entidad ‘coche’ (Car) con el dominio de los atributos
OCL es un lenguaje declarativo que permite definir reglas que se aplican a modelos UML. Entre otras,
permite describir restricciones sobre el dominio de los atributos. En este módulo no utilizaremos este
lenguaje, puesto que supone una dificultad añadida, y utilizaremos las notas textuales para indicar
Reflexión
El uso de lenguajes como OCL, por su complejidad, cae fuera del alcance de este texto y, por lo tanto,
aquí utilizaremos una nota que indique de manera textual la restricción asociada al atributo en
cuestión.
Atributo compuesto
En lenguaje UML, los atributos compuestos se representan mediante un nuevo tipo de entidad.
Un ejemplo de atributo multivalor es el atributo ‘teléfono’ de una persona, puesto que se puede
dar el caso de que una persona tenga ninguno, uno o más de un teléfono (por ejemplo, un
teléfono fijo y un teléfono móvil).
La figura 4 muestra el tipo de entidad ‘persona’ (Person) con el atributo ‘teléfono’ convertido en
atributo multivalor.
Figura 4. Ejemplo del tipo de entidad ‘persona’ (Person) con un atributo multivalor
Un número para indicar el número exacto de valores que debe tener el atributo.
El símbolo * para indicar que el atributo puede tener indefinidos valores (cero o más).
Para indicar que el atributo ‘teléfono’ (phoneNumber) del tipo de entidad ‘persona’ (Person) de la
figura 4 puede tener entre 0 y 5 valores hay que indicar “phoneNumber: String[0..5]” en la definición
2.2.5.Atributos derivados
Un atributo derivado es aquel que se calcula a partir de otros atributos. Por lo tanto, un
atributo derivado lleva asociado un procedimiento de cálculo para obtener el valor a partir de
otros atributos, que pueden ser derivados o no. Un atributo no derivado es aquel al que hay que
asignar un valor.
Atributos derivados
Supongamos la clase ‘factura’ (Bill) con los atributos ‘número de factura’ (number), ‘cliente’
(customer), ‘fecha de la factura’ (date) e ‘importe total de la factura’ (total). Para obtener la
información del importe total de la factura, tenemos que crear el atributo ‘importe total’ (total)
como atributo derivado, calculado a partir de la suma de cada una de las líneas de los detalles
de la factura, tal como se muestra en la figura 5.
La figura 6 muestra el tipo de entidad ‘dirección’ (Address), que permite definir la dirección física
de una casa, un piso o un local. Hay que señalar que en las casas unifamiliares no tiene sentido
el atributo de ‘número de piso y puerta’. Los atributos que indican el ‘número de piso’ (floor) y
‘puerta de escalera’ (doorNumber) especifican una multiplicidad de 0 o 1, es decir, que para
cada entidad pueden tener un valor asociado o tener valor no definido (NULL).
2.3.Claves
Una clave candidata es un conjunto de atributos mínimo que permite identificar de manera
única todas las entidades de un tipo de entidad.
Un tipo de entidad puede tener una o más claves candidatas. Pero es necesario que tenga al
menos una clave candidata que permita identificar de manera unívoca todas las entidades.
Una clave candidata puede estar formada por uno o más atributos. En el caso de estar formada
por varios atributos, recibe el nombre de clave candidata compuesta. En este caso, la
combinación de los diferentes valores de los atributos debe ser única para identificar de manera
unívoca a todas las entidades de un mismo tipo de entidad. Una clave candidata compuesta
debe ser mínima, es decir, debe incluir el número mínimo de atributos que permitan identificar
de manera unívoca las entidades. La definición de clave candidata se puede ver como una
restricción sobre los datos, puesto que prohíbe que dos entidades tengan el mismo valor en los
atributos que forman la clave candidata.
El diseñador de la base de datos elige una de las claves candidatas para que sea la clave
primaria. Esta es la clave elegida para identificar las entidades de manera unívoca. Como clave
candidata, no puede contener valores duplicados pero además, de manera implícita, no puede
contener valores NULL en ninguna entidad.
En UML no hay ninguna notación para indicar las claves candidatas ni la clave primaria. En este
texto tomamos un convenio para indicar las claves candidatas y las claves primarias. Las claves
candidatas se marcan con la etiqueta <Un>, donde n (n > 0) agrupa cada uno de los conjuntos
de claves candidatas. Por lo tanto, si dos o más atributos tienen la misma etiqueta, por
ejemplo <U1>, entendemos que se trata de una clave candidata compuesta por todos los
atributos con esta etiqueta. La clave primaria se marca con la etiqueta <P> para distinguirla del
resto de claves.
Otros autores prefieren indicar las claves con la etiqueta {Un} y {P} o utilizar restricciones
textuales como método de notación. Aunque el significado es el mismo para las diferentes
notaciones, en este texto utilizaremos la notación mencionada inicialmente.
La figura 7 muestra ejemplos de los tipos de entidad ‘coche’ y ‘ persona’ con las marcas de la
clave primaria y de las claves candidatas, en caso de que existan.
El tipo de entidad ‘persona’ (Person) tiene dos claves candidatas: por un lado tenemos la clave
formada por el atributo ‘ID’ y por el otro tenemos la clave formada por los atributos ‘nombre’
(name) y ‘apellidos’ (surname). Para este ejemplo, suponemos que no pueden existir dos
personas con los mismos nombre y apellidos. Aun así, elegimos como clave primaria el atributo
‘ID’. El tipo de entidad ‘coche’ (Car) sólo tiene una clave candidata, formada por el atributo
‘matrícula’ (plateNumber), que por lo tanto es elegida para ser clave primaria.
Figura 7. Ejemplos de los tipos de entidad ‘coche’ (Car) y ‘persona’ (Person) con la clave primaria y las
2.4.Tipos de relaciones
Denominamos tipos de relaciones a las asociaciones entre tipos de entidades, y relaciones, a
las asociaciones entre las entidades.
Los tipos de relaciones indican generalmente las relaciones en las que pueden participar las
entidades de un tipo de entidad, y en qué condiciones.
Entre los tipos de entidades ‘coche’ (Car) y ‘persona’ (Person) podemos establecer un tipo de
relación de propiedad que indique que una persona posee un coche. Para representar esta
información debemos crear en el diagrama conceptual de la figura 8 un nuevo tipo de relación
denominado Has, para indicar que una persona tiene un coche.
Figura 8. Ejemplo de tipo de relación Has entre los tipos de entidad ‘persona’ (Person) y ‘coche’ (Car)
Tal como se puede ver en la figura 8, en un tipo de relación pueden aparecer diferentes
etiquetas, todas con el fin de facilitar la comprensión de la relación entre las entidades:
Los tipos de relación casi siempre tienen una etiqueta de tipo de relación que indica
el significado de la asociación entre los dos tipos de entidades. Esta etiqueta indica la
acción entre los dos tipos de entidades, y suele ser un verbo. Para especificar mejor
su significado, de manera opcional se puede indicar la dirección del tipo de relación.
Esto facilita la lectura de la acción o de la relación que existe entre los dos tipos de
entidad. En la figura 8 podemos leer que “una persona tiene un coche”. Aunque no es
muy habitual, cuando esta relación es lo bastante evidente se puede considerar que
no es necesario indicarlo explícitamente y se puede obviar la etiqueta o la dirección.
También se puede dar la situación en que sea necesario definir mejor el papel que tiene
cada una de las entidades en la relación. En estos casos se puede definir una etiqueta
en cada extremo del tipo de relación, que indica el papel que juega cada una de las
entidades en la relación y que ayuda a explicar el significado de la relación. Estas
etiquetas se denominan etiquetas de rol o nombres de rol. En términos generales
no suelen ser necesarias y no siempre se utilizan, pero en algunos casos pueden ser
útiles para definir el papel de las entidades en la relación. La figura 8 muestra los
nombres de roles para los dos tipos de entidades que aparecen. Utilizando las
etiquetas de rol, podemos leer que “una persona posee (owns) un coche” y, de
manera inversa, que “un coche es propiedad (belongs to) de una persona”. Es
necesario que todo tipo de relación tenga definidos los roles de los participantes o el
nombre del tipo de relación.
En algunos casos los tipos de relaciones, en primera instancia, se modelizan como atributos. Un
análisis posterior con más detalle ayuda a ver que lo que se había modelizado en un primer
momento como un atributo es un tipo de relación hacia un tipo de entidad nuevo o existente.
Supongamos que queremos modelizar el tipo de entidad empleado (Employee) para almacenar
datos de los empleados de una empresa. Entre otros atributos, nos interesa indicar a qué
departamento de la empresa pertenece cada empleado. Una primera aproximación sugiere un
diseño en el que se incluye el atributo ‘departamento’ en el tipo de entidad ‘empleado’, tal como
muestra la figura 9. Pero refinando este modelo, es posible que nos interese tener categorizados
los diferentes departamentos, e incluso nos podría interesar almacenar cierta información
relativa al departamento. En este nuevo diseño se crea un nuevo tipo de entidad para los
departamentos y se establece un tipo de relación entre los empleados y los departamentos
(tipos de entidad Department) que indica a qué departamento pertenece cada empleado. La
figura 10 muestra el nuevo diseño.
Figura 9. Ejemplo de diseño del departamento como un atributo del tipo de entidad ‘empleado’ (Employee)
Figura 10. Ejemplo de diseño del departamento como un nuevo tipo de entidad ‘departamento’ (Department)
Terminología UML
Figura 11. Ejemplo del tipo de relación binaria ‘matrícula’ (Enrollment) entre los tipos de entidad ‘estudiante’
Siguiendo con el ejemplo de la figura 11, la figura 12 muestra la misma relación, pero a escala
de entidades. Es decir, este ejemplo muestra una posible asociación entre los datos de las dos
entidades mediante la relación Enrollment. Se puede ver, por ejemplo, que el
estudiante John está matriculado en las asignaturas Mathematics y Databases.
Conectividad
1) Conectividad uno a uno (1:1): indica que cada entidad de un tipo se relaciona solo con una
de las entidades del otro tipo. En la figura 13a se puede ver un ejemplo de conectividad 1:1,
donde, según el modelo, cada empleado tiene un despacho y en cada despacho hay un solo
empleado. La conectividad 1:1 se denota poniendo un 1 en cada parte del tipo de relación.
2) Conectividad uno a muchos (1:N o 1..*): indica que cada entidad de un tipo se relaciona con
varias entidades del otro tipo, pero las entidades de este segundo tipo solo se relacionan con
una única entidad del primer tipo. En la figura 13b se puede ver un ejemplo de conectividad 1:N,
donde la N está en la parte del tipo de entidad ‘despacho’. Según el modelo, cada empleado
tiene varios despachos, pero en cada despacho hay un solo empleado. En la figura 13c se puede
ver la relación inversa. En este caso la N está en la parte del tipo de entidad ‘empleado’. Según
el modelo, cada empleado tiene un único despacho, pero un mismo despacho lo pueden
compartir varios empleados. La conectividad 1:N se denota poniendo un 1 en una parte del tipo
de relación y una N o * en la otra parte.
3) Conectividad muchos a muchos (M:N o *..*): indica que cada entidad de un tipo de entidad
se relaciona con varias entidades del otro tipo. En la figura 13d se puede ver un ejemplo de
conectividad M:N, donde, según el modelo, cada empleado tiene varios despachos y en cada
despacho hay varios empleados. La conectividad M:N se denota poniendo una M o * en una
parte del tipo de relación y una N o * en la otra parte.
Figura 13. Ejemplos de conectividad en los tipos de relaciones binarias entre los tipos de entidad ‘empleado’
Estas restricciones las determinan los requisitos de cada problema y son los usuarios de la base
de datos quienes han de conocer las restricciones implícitas en los problemas.
Conectividad “a muchos”
Figura 14. Ejemplo del tipo de relación ‘matrícula’ (Enrollment) donde se indica el número mínimo y máximo
Observación
En algunos diagramas de ejemplo de los tipos de relaciones obviaremos los atributos y las
características que no sean necesarias para explicar el concepto que nos interese, con objeto de
La figura 15 muestra un modelo en el que aparece un tipo de relación binaria que expresa la
relación de ‘dirección de departamento’ (Heads) entre los tipos de entidad ‘profesor’ (Professor)
y ‘departamento’ (Department). El tipo de entidad ‘profesor’ es obligatorio en la relación
‘dirección de departamento’. Esto indica que no puede haber un departamento que no tenga un
profesor que haga de director de departamento. El tipo de entidad ‘departamento’, en cambio,
es opcional en la relación ‘dirección de departamento’. Puede ser que haya uno o más profesores
que no tengan la responsabilidad de dirigir un departamento.
En los diagramas UML se utiliza la cardinalidad del tipo de relación para expresar la
obligatoriedad o no de cada uno de los tipos de entidades que participan en la asociación.
Considerando los tipos de conectividad que hemos visto, hay que aplicar:
Tipo de entidad obligatoria: para designar este concepto también se puede decir que el tipo de
entidad tiene una participación total en la asociación o que presenta una dependencia de existencia
respecto a la asociación.
Tipo de entidad opcional: para designar este concepto también se puede decir que el tipo de
Hay situaciones en las que no basta modelizar una asociación entre dos tipos de entidades para
representar un concepto y es necesario modelizar la asociación entre tres tipos de entidades
para representar el concepto deseado.
Figura 17. Ejemplo de tipo de relación ternaria entre los tipos de entidad ‘estudiante’ (Student), ‘asignatura’
En la conectividad de un tipo de relación ternaria hay implicados tres tipos de entidades y cada
uno puede tomar la conectividad “a uno” o “a muchos”.
Conectividad M:N:P o *..*..*.
Conectividad M:N:1 o *..*..1.
Conectividad M:1:1 o *..1..1.
Veamos cómo definimos la conectividad en un tipo de relación ternaria mediante el ejemplo que
ilustra la figura 18.
En la figura podemos ver los tres tipos de entidad, ‘estudiante’ (Student), ‘asignatura’ (Subject)
y ‘semestre’ (Semester), y el tipo de relación ‘matrícula’ (Enrollment).
Para determinar el grado de conectividad de cada tipo de entidad en la asociación, debemos fijar
“a una” las instancias del resto de los tipos de entidades y nos tenemos que preguntar si es
posible conectar con la relación “a una” o “a muchas” instancias del primer tipo de entidad.
En primer lugar, por ejemplo, nos preguntamos si con referencia a la relación ‘matrícula’ y dados
una asignatura y un semestre concretos se pueden tener “uno” o “muchos” estudiantes. La
respuesta es que puede haber “muchos” estudiantes matriculados, puesto que varios
estudiantes pueden matricularse de una misma asignatura en el mismo semestre. Por lo tanto,
el tipo de entidad ‘estudiante’ participa con grado N en la relación ‘matrícula’.
En segundo lugar, nos preguntamos, por ejemplo, si fijados un estudiante y una asignatura
concretos puede existir matrícula en “uno” o “muchos” semestres. La respuesta es que pueden
tener “muchos” semestres, puesto que un estudiante se puede matricular más de una vez en
diferentes semestres hasta superarlos. Por lo tanto, el tipo de entidad ‘semestre’ participa con
grado N en la relación ‘matrícula’.
Así pues, vemos que el tipo de relación ‘matrícula’ tiene cardinalidad M:N:P o *..*..*.
2.4.3.Tipos de relaciones n-arias
Se define un tipo de relación n-aria como la asociación entre tres o más tipos de entidades.
El tipo de relación ternaria es un caso concreto de tipo de relación n-aria. Lo que hemos visto en
el subapartado anterior se puede generalizar para los tipos de relaciones n-arias. Por lo tanto, en
una relación n-aria puede haber n + 1 tipos de conectividad, puesto que cada una de
las n entidades puede estar conectada “a uno” o “a muchos” tipos en la asociación.
La figura 19 presenta una ampliación del ejemplo anterior, en el que se presentaban los tipos de
entidad ‘estudiante’ (Student), ‘asignatura’ (Subject) y ‘semestre’ (Semester) asociados
mediante el tipo de relación ‘matrícula’ (Enrollment).
En este caso queremos añadir el concepto de turno o franja horaria en el esquema para indicar
que una misma asignatura puede ser de turno de mañana o de tarde. Para modelizar este
concepto, hemos creado el tipo de entidad ‘franja horaria’ (TimeSlot).
Para determinar el grado de conectividad del nuevo tipo de entidad seguiremos el mismo
proceso visto para el caso del tipo de relaciones ternarias. En este caso, nos preguntamos si con
referencia al tipo de relación ‘matrícula’ y fijados un estudiante, un semestre y una asignatura
concretos puede haber “una” o “muchas” franjas horarias. La respuesta es que solo puede haber
“una” franja horaria. Por lo tanto, el tipo de entidad de ‘franja horaria’ o ‘turno’ (TimeSlot)
participa con grado 1 en este tipo de relación.
Se presenta una relación entre dos entidades del mismo tipo de entidad. Igual que en el resto de
los tipos de relaciones binarias, pueden tener conectividad 1:1, 1:N o M:N y pueden expresar
dependencia de existencia.
Generalmente no se hace referencia explícita al rol de cada entidad en una relación, puesto que
normalmente cada entidad participa una única vez en una relación y su rol se sobreentiende.
Pero en las relaciones recursivas puede ser que el rol de cada entidad no sea tan claro. Por lo
tanto, si se considera oportuno, se puede indicar el rol de cada asociación entre la entidad y la
relación.
La figura 21 muestra un tipo de relación recursiva que describe la relación de maternidad entre
las personas. Podemos ver que una persona puede tener cero o más hijos, y que una persona
solo puede tener una madre. Las etiquetas o nombres de rol, en este caso, pueden ayudar a
comprender el rol de cada entidad en esta relación recursiva.
Un tipo de entidad asociativa es el resultado de considerar una relación entre entidades como
si fuera una entidad. Su nombre se corresponde con el nombre de la relación sobre la que se
define.
Los tipos de entidades asociativas añaden nuevas funcionalidades a las relaciones. Algunas de
las principales son las siguientes:
1) Permiten definir atributos que hacen referencia a la relación. Es decir, son específicos de la
asociación que hay entre las dos instancias de los dos tipos de entidad que forman la relación.
2) Permiten que el tipo de entidad asociativa, y por lo tanto la relación entre los tipos de
entidades, participe en otras relaciones con otros tipos de entidades o con otros tipos de
entidades asociativas.
La figura 22 muestra el tipo de relación ‘matrícula’ (Enrollment) entre los tipos de entidad
‘estudiante’ (Student) y ‘asignatura’ (Subject). Esta relación indica en qué asignaturas están
matriculados cada uno de los estudiantes. La entidad asociativa contiene el atributo ‘nota’
(Grade), que indica la nota que ha obtenido un estudiante en una asignatura. Para cada relación
entre un estudiante y una asignatura hay una relación ‘matrícula’ con un atributo ‘nota’.
En el caso de situar el atributo ‘nota’ (Grade) en la entidad ‘estudiante’ (Student), decimos que
un estudiante siempre tendrá la misma nota de todas las asignaturas de las que se matricule. En
el caso de situar el atributo en la entidad ‘asignatura’ (Subject), en cambio, decimos que todos
los estudiantes tienen la misma nota en una misma asignatura. Por lo tanto, la única manera de
modelizar la realidad de manera correcta es considerar el atributo ‘nota’ como un atributo de la
relación entre estos dos tipos de entidad.
Los tipos de entidades asociativas permiten establecer relaciones con otras entidades y también
con otras entidades asociativas, es decir, permiten crear relaciones entre relaciones.
Cabe señalar que esta misma situación no se puede modelizar mediante un tipo de relación
ternaria.
Error de expresión
La figura 24 muestra el modelo conceptual y emplea un tipo de relación ternaria. En este caso el
significado del modelo es diferente del que planteábamos en el ejemplo anterior. Este modelo
nos dice que para cada estudiante (Student) y asignatura (Subject) puede haber ninguna o una
justificación (Justification). Pero también indica que fijadas una justificación y una asignatura
puede haber muchos estudiantes, afirmación que es falsa según los requisitos iniciales.
Igualmente, el modelo indica que fijados un estudiante y una justificación puede haber muchas
asignaturas, afirmación que también es falsa. Si modificamos las cardinalidades de los tipos de
entidad ‘estudiante’ y ‘asignatura’ y las establecemos a 1, entonces no podremos representar de
manera correcta que un estudiante puede estar matriculado en varias asignaturas.
El problema reside en el hecho de que intentamos representar con un tipo de relación ternaria
un modelo que es binario. Hay que señalar que el concepto de justificación hace referencia a la
relación que existe entre las entidades ‘estudiante’ y ‘asignatura’, y para ello es necesario que
sea modelizado como un tipo de entidad que se relaciona con el tipo de entidad asociativa que
surge del tipo de relación entre los dos tipos de entidades.
La existencia de las instancias de un tipo de entidad fuerte no depende de ningún otro tipo de
entidad o tipo de relación. Es decir, el significado de las entidades fuertes no necesita ninguna
relación con otras entidades que complemente su significado. Por lo tanto, se pueden ver estas
entidades como aquellas que tienen existencia propia y muy definida.
Un tipo de entidad débil, por lo tanto, necesita una asociación con un tipo de entidad que le
permite identificar de manera única sus instancias. Este tipo de relación recibe el nombre de tipo
de relación identificativa del tipo de entidad débil. El tipo de entidad débil debe tener una
restricción de participación total (dependencia de existencia) respecto al tipo de relación
identificativa, puesto que si no es así, hay instancias que no se podrán identificar de manera
única.
Toda entidad débil debe formar parte de una relación binaria con conectividad 1:N, donde la
entidad débil debe estar en el lado N. Esta relación le permitirá identificarse completamente.
Las entidades débiles no pueden sobrevivir si se elimina la entidad fuerte con la que están
relacionadas mediante la relación identificativa. Por lo tanto, hay que tener en cuenta que, si se
elimina una entidad fuerte, hay que eliminar las entidades débiles que están relacionadas con
ella.
Hay que destacar que un tipo de relación identificativa no suele tener atributos, puesto que en
las relaciones 1:N siempre es posible poner los atributos en el tipo de entidad débil, es decir, en
la parte con cardinalidad N.
Un tipo de entidad puede ser fuerte en una determinada asociación y, al mismo tiempo, ser débil
en otra asociación.
La figura 26 muestra el tipo de entidad ‘mes del año’ (Month), que es débil respecto a la relación
con el tipo de entidad ‘año’ (Year) y fuerte respecto a la relación con el tipo de entidad ‘día del
mes’ (DayOfTheMonth).
Figura 26. Ejemplo de tipo de entidad fuerte respecto a una relación y, al mismo tiempo, débil respecto a
otra relación
Una clave parcial en un tipo de entidad débil es el conjunto de atributos que permite identificar
de manera única todas las instancias del tipo de entidad débil que están relacionadas con la
misma instancia del tipo de entidad fuerte.
En el peor de los casos, la clave parcial es el conjunto de todos los atributos del tipo de entidad
débil.
Se considera que la clave primaria del tipo de entidad débil está formada por la clave primaria
del tipo de entidad fuerte y la clave parcial del tipo de entidad débil. De este modo se puede
referenciar cada una de las instancias del tipo de entidad débil de manera única.
fuerte (BankAccount)
2.7.Opciones de diseño
En algunas situaciones no es trivial determinar si un concepto debe ser modelizado como un tipo
de entidad, un atributo o un tipo de relación. Hay que tener en cuenta que normalmente no
existe un único diagrama conceptual para un problema concreto, y que puede haber diferentes
conceptualizaciones que den lugar a diferentes diagramas, todos correctos.
A continuación, mencionamos algunos consejos que pueden ser útiles durante el diseño
conceptual de una base de datos:
También puede existir el refinamiento inverso. En este caso, se puede eliminar un tipo
de entidad y representar el concepto como un atributo si solo afecta a un tipo de
entidad (o a muy pocos).
crear el nuevo tipo de entidad Departamento, con un único atributo que indica el nombre del
departamento, y crear tres tipos de relaciones binarias entre Estudiante, Profesor y Curso, y el nuevo
tipo de entidad Departamento.
Los criterios empleados en este texto son una opción, aunque no hay normativa y pueden variar
respecto a otros autores.
Etiquetar los tipos de relaciones utilizando nombres simples en singular, siempre que sea
posible. Si es necesario, se pueden utilizar hasta dos o tres nombres. Hay que
emplear la grafía Pascal para escribir el nombre de los tipos de entidades.
Etiquetar los atributos utilizando nombres simples en singular y evitando que aparezca el
nombre del tipo de entidad. Si es necesario, se pueden utilizar hasta dos o tres
nombres o la combinación de un nombre y uno o dos adjetivos. Hay que emplear la
grafía Camel para escribir el nombre de los atributos.
Etiquetar los tipos de relaciones utilizando verbos en tercera persona del singular. En
caso de requerir etiquetas compuestas, se suele utilizar un verbo seguido de una
preposición y otro verbo. Las etiquetas de los tipos de relaciones siguen la grafía
Pascal.
Las etiquetas para identificar los roles de las entidades en las relaciones siguen la grafía Camel.
Como práctica general, a partir de una descripción funcional de los requisitos de la base de
datos, los nombres que aparecen tienden a ser candidatos de nombres para los tipos de
entidades que se vayan a definir, mientras que los verbos tienden a ser utilizados para los tipos
de relaciones del esquema conceptual. Los nombres de los tipos de relaciones se eligen para que
se puedan leer de izquierda a derecha y de arriba abajo, como criterio general. De este modo se
facilita la lectura de las relaciones. Puede haber excepciones a estas normas, y en estos casos
nos podemos ayudar de los nombres de roles o podemos indicar la dirección del tipo de relación
para facilitar la comprensión de las relaciones y el papel de las entidades en cada una de estas
relaciones. Los atributos suelen ser nombres extraídos de las descripciones de los objetos
definidos como tipos de entidades.
Grafía Pascal: la primera letra del identificador y la primera letra de las siguientes palabras se
2.9.Ejemplo completo
En este apartado hemos visto los elementos básicos del diseño conceptual según el modelo ER.
Antes de continuar con los elementos avanzados en el apartado 3, puede resultar muy ilustrativo
ver una aplicación práctica de los conceptos vistos hasta ahora. Para facilitar el análisis de un
ejemplo más o menos real, plantearemos a continuación una descripción y un conjunto de
requisitos y restricciones que deben permitir implementar un modelo conceptual de una base de
datos destinada a la gestión universitaria. Este modelo es una reducción de un modelo real y no
se quiere adaptar a la gestión real de una universidad. Sólo pretende servir como modelo de
ejemplo para los conceptos vistos hasta ahora.
A continuación enumeramos los diferentes aspectos de los requisitos de los usuarios que hay
que tener en cuenta al realizar el diseño conceptual de la futura base de datos:
1) La universidad está formada por diferentes departamentos. Cada departamento está formado
por un conjunto de profesores y está dirigido por un único profesor. Nos interesa conocer el
nombre de los departamentos y el número de profesores adscrito a cada departamento.
2) De cada profesor nos interesa poder almacenar los datos personales, como, por ejemplo,
nombre, DNI, edad y si es un hombre o una mujer. De los profesores que son directores de
departamento, nos interesa poder identificar la fecha en la que empezaron a ejercer este cargo.
4) Los estudiantes son una parte muy importante de la base de datos, ya que se desea
información sobre sus datos personales (nombre, DNI, edad, sexo) y número de identificación
universitario (conocido como NIU).
5) Cada estudiante puede estar matriculado de más de una asignatura en cada semestre. Y para
cada una de las asignaturas en las que está matriculado cada semestre debemos poder
almacenar su nota final de aquel estudiante.
6) También se quiere dejar constancia de las fechas de inicio y final de cada semestre.
A partir de los requisitos expresados, la figura 28 muestra un diagrama del modelo conceptual.
Como hemos comentado, este modelo no es único, y pueden existir diferentes aproximaciones y
conceptualizaciones válidas para una misma representación del mundo real.
Figura 28. Diagrama del modelo conceptual para la base de datos de gestión universitaria
A continuación comentamos los aspectos más relevantes de este modelo conceptual:
Pero este modelo conceptual también presenta algunas deficiencias, que comentamos a
continuación:
Figura 29. Diagrama del modelo conceptual con las correcciones aplicadas
La figura 29 muestra el modelo conceptual modificado para corregir las deficiencias detectadas.
El tipo de relación ‘imparte’ (Teaches) se ha convertido en un tipo de relación ternaria. De este
modo, podemos indicar qué profesor es responsable de cada asignatura en cada semestre.
3.1.Generalización/especialización
En algunos casos, se pueden encontrar entidades que tengan algunas características propias y
diferenciadas de otras entidades del mismo tipo de entidad, y que interese poder representar
estas diferencias en el modelo conceptual.
Dentro de un entorno universitario podemos modelizar el tipo de entidad ‘persona’, que contiene
atributos como por ejemplo el nombre, los apellidos, el DNI, la fecha de nacimiento, el sexo, el
teléfono o el correo electrónico. Pero dentro de este tipo de entidad podemos encontrar algunas
entidades con características propias que nos interesa modelizar. Las entidades que
corresponden a estudiantes tienen algunas características propias relevantes (número de
identificación universitario, año de primera matrícula, etc.) que hay que incluir en el modelo. Por
otro lado, podemos definir otras entidades que pertenezcan al colectivo de profesores y sobre los
cuales queremos representar otros tipos de atributos (departamento al que pertenecen,
especialidad, etc.) o al colectivo de personal administrativo de la universidad, que tiene otros
requisitos (cargo, sección, etc.). Es decir, todas las entidades tienen un conjunto de
características comunes importante, pero también tienen algunas diferencias entre sí que hay
que poder representar en el modelo de base de datos.
Esta relación permite definir los tipos de entidades en dos niveles: en el primer nivel
encontramos el tipo de entidad general (superclase), que contiene las características comunes a
todas las entidades, y en el segundo nivel encontramos los tipos de entidades que contienen las
características propias de las diferentes especializaciones (subclases).
Cualquier entidad de una subclase debe ser también entidad de la superclase. En sentido
contrario no es imprescindible, es decir, puede haber entidades de la superclase que no
pertenezcan a ninguna subclase.
Modelo de generalización/especialización
Por lo tanto, cualquier entidad de la subclase ‘estudiante’ tiene todos los atributos de la
superclase ‘persona’ y además los atributos específicos o locales.
La figura 31 muestra una posible relación entre las entidades del ejemplo anterior. Podemos ver
que hay cinco entidades de la superclase ‘persona’ (Person), con los
nombres John, Mary, Paul, Fred y Sally, dos de las cuales son estudiantes y pertenecen a la
subclase ‘estudiante’ (Student), una es un profesor (Professor) y otra es administrativo
(Administrative). La entidad Mary no pertenece a ninguna de las subclases y solo pertenece a la
superclase.
Tanto las superclases como las subclases pueden intervenir en relaciones sin ningún tipo de
restricción.
En la figura 32 se puede ver cómo la superclase ‘persona’ (person) participa en la relación ‘vive’
(Lives) con la entidad ‘población’ (City) y la subclase ‘profesor’ (Professor) participa en la
relación ‘dirige’ (Heads) con la entidad ‘departamento’ (Department). Evidentemente no tiene
sentido considerar que cualquier entidad de la superclase ‘persona’ puede dirigir un
departamento y hay que indicar en el modelo conceptual que solo aquellas personas que son
entidades de la subclase ‘profesor’ pueden dirigir un departamento.
1) El primer motivo se debe al hecho de que en determinadas situaciones hay que modelizar
casos en los que algunos atributos sólo son aplicables a algunas de las entidades, pero no a toda
la superclase. Por lo tanto, se define una relación de generalización/especialización que permite
agrupar estas entidades en una subclase y añadirles los atributos necesarios, mientras continúan
formando parte de la superclase y compartiendo el resto de los atributos con todas las entidades
de la superclase. La figura 32 muestra un ejemplo de este caso.
2) La segunda situación se produce cuando hay que modelizar tipos de relaciones que solo se
pueden establecer con algunas entidades de la superclase. Por ejemplo, supongamos que hemos
creado un tipo de entidad ‘trabajador’ (Worker) para modelizar a los trabajadores de una fábrica
y queremos establecer un tipo de relación que indique de qué empresa de trabajo temporal
provienen. Lógicamente, esta relación sólo es aplicable a los trabajadores que sean temporales y
no a los trabajadores fijos de la empresa. Para modelizar esta situación podemos crear una
subclase para identificar a los ‘trabajadores temporales’ (TemporaryWorker) y relacionarlos con
el tipo de entidad de las empresas temporales (EmploymentAgency). De este modo, solo los
trabajadores que pertenezcan a la subclase podrán estar relacionados con la empresa de trabajo
temporal. La figura 33 muestra un esquema que ejemplifica este caso.
por la manera de hacer referencia al concepto. Por ejemplo, un estudiante ‘es una’ persona, un
Supongamos que queremos modelizar una base de datos para mantener información sobre los
vehículos que tiene una empresa. En un momento del diseño aparece el tipo de entidad ‘coche’
(Car), del que queremos almacenar el número de bastidor, la matrícula, la marca, el modelo, la
fecha de matriculación, el número de plazas disponibles y si es un vehículo todoterreno o no.
Más adelante, en la misma fase de diseño, nos aparece el tipo de entidad ‘camión’ (Truck), del
que queremos almacenar el número de bastidor, la matrícula, la marca, el modelo, la fecha de
matriculación, el peso máximo autorizado de carga y el número de ejes del camión. La figura 34
muestra el diseño conceptual de los dos tipos de entidades.
Figura 34. Ejemplo de los tipos de entidad ‘coche’ (Car) y ‘camión’ (Truck)
Pero en este punto el diseñador se da cuenta de que los dos tipos de entidad comparten una
buena parte de los atributos y de que sería interesante generalizar esta parte común para
obtener una nueva superclase que permita identificar un vehículo, sea camión o coche. Por lo
tanto, se crea la superclase ‘vehículo’ (Vehicle), que contiene todos los atributos comunes (el
número de bastidor, la matrícula, la marca, el modelo y la fecha de matriculación), y entonces
se crean dos subclases con los atributos propios de cada una. La figura 35 muestra el diseño
conceptual después del proceso de generalización.
Figura 35. Ejemplo de generalización de los tipos de entidad ‘coche’ (Car) y ‘camión’ (Truck)
Observación
A partir de este punto, denominamos superclase a los tipos de entidad genéricos, y subclase, a los
3.1.1.Restricciones en la generalización/especialización
Hay tres tipos de restricciones básicas en los procesos de generalización/especialización.
En algunos casos la superclase contiene un conjunto de atributos que indican, para cada entidad,
qué subclase pertenece. En estos casos se denominan subclases de predicado
definido o subclases de condición definida.
Continuando con el ejemplo anterior de los vehículos, podemos especificar a qué subclase
pertenece cada entidad a partir de un atributo que define el tipo de vehículo (vehicleType) de la
superclase, que tome valor igual a car en caso de que la entidad tenga que pertenecer a la
subclase Car o que tome valor igual a truck en caso de que tenga que pertenecer a la
subclase Truck.
En caso de que todas las subclases tengan una condición de pertenencia en el mismo atributo de
la superclase, el atributo recibe el nombre de atributo definitorio o discriminador y se dice
que la relación de generalización/especialización es de atributo definido. En caso de que no
exista ningún atributo que permita identificar la pertenencia de las entidades a las diferentes
subclases, se dice que es una generalización/especialización definida por el usuario.
En UML, el atributo discriminador, si lo hay, se indica en la flecha de la relación de
generalización/especialización. La figura 37 muestra un ejemplo de
generalización/especialización de atributo definido.
2) Restricción de exclusividad
En inglés, disjoint.
(3)
Solapada (4) : una entidad puede pertenecer a más de una subclase al mismo tiempo.
Generalización/especialización solapada
3) Restricción de participación
En inglés, overlapping.
(4)
En inglés, complete.
(5)
Parcial (6) : puede haber entidades de la superclase que no pertenezcan a ninguna de las
subclases.
La figura 37 muestra la nomenclatura para identificar los dos casos en UML. En la misma
relación se indica entre llaves {} los conceptos de total o parcial (complete/incomplete) y
disjunta o solapada (disjoint/overlapping).
Las figuras 37 y 38 muestran un esquema similar, con una diferencia importante en el diseño.
En la figura 37 podemos ver la superclase ‘vehículo’ (Vehicle) y las subclases ‘coche’ (Car) y
‘camión’ (Truck) con una herencia disjunta e incompleta. Esto nos indica, en primer lugar, que
una entidad no puede pertenecer a las dos subclases al mismo tiempo, es decir, que no puede
haber un vehículo que sea coche y camión a la vez, y, en segundo lugar, que algunas entidades
puede ser que no pertenezcan a ninguna de las subclases, es decir, que puede haber instancias
de vehículos que no son coches ni camiones.
En la figura 38, en cambio, se presenta una herencia similar, pero en este caso es completa. El
hecho de que sea completa implica que la superclase no podrá contener entidades; por lo tanto,
será un tipo de entidad abstracta. Es decir, que cualquier entidad de ‘vehículo’ deberá ser un
coche o un camión.
Disjunta y total
Disjunta y parcial
Solapada y total
Solapada y parcial
En inglés, incomplete.
(6)
Herencia simple
La figura 39 muestra una relación de herencia simple, en la que a partir de la superclase raíz
‘vehículo’ (Vehicle) y del atributo discriminador ‘tipo de vehículo’ (vehicleType) se refinan dos
subclases según si el vehículo es un coche (Car) o un camión (Truck). Al mismo tiempo, el tipo
de entidad ‘coche’ se especializa en dos subclases, según si es un turismo (Tourism) o un
vehículo todoterreno (SUV). El tipo de entidad ‘coche’ es superclase en esta nueva relación y a la
vez subclase en la relación con el tipo de entidad ‘vehículo’. Hay que señalar, además, que el
tipo de entidad ‘coche’ se convierte en abstracta, puesto que la especialización es completa.
Herencia múltiple
La figura 40 muestra una relación de herencia múltiple. A partir del tipo de entidad base, en este
ejemplo el tipo de entidad ‘vehículo’ (Vehicle), creamos una especialización en la que indicamos
si se trata de un vehículo terrestre (LandVehicle) o acuático (WaterVehicle). Los vehículos
terrestres se pueden especializar en coches (Car), camiones (Truck) o anfibios (Amphibious).
Los vehículos anfibios se pueden desplazar por tierra y por medios acuáticos, y, por lo tanto,
este tipo de entidad también es una especialización del tipo de entidad ‘vehículo acuático’, junto
con los tipos de entidades ‘barco’ (Boat) y ‘submarino’ (Submarine).
Ampliación
El tipo de entidad ‘anfibio’ se denomina subclase compartida, puesto que tiene más de una
superclase o tipo de entidad padre. Hay que señalar que si un atributo o relación que se origina
en una misma superclase es heredado más de una vez por caminos diferentes del entramado,
sólo se puede incluir una sola vez en la subclase compartida. Es decir, los atributos y las
relaciones de la clase ‘vehículo’ sólo pueden aparecer una única vez en la subclase compartida.
Es importante darse cuenta de que la existencia de una única subclase compartida provoca que
la relación sea de herencia múltiple en lugar de simple.
Observación
3.1.3.Clasificación múltiple
Un modelo de clasificación múltiple es aquel que permite que una entidad sea instancia de
dos tipos de entidades, E1 y E2, de modo que E1 no es subclase de E2, E2 no es subclase de E1 y no
hay ningún tipo de entidad E3 que sea subclase de E1 y E2.
Otro tipo de clasificación múltiple se da cuando la superclase tiene dos o más jerarquías de
especialización según diferentes discriminantes. Cada entidad puede pertenecer a diferentes
subclases a la vez.
3.2.Agregación y composición
La agregación es un tipo de relación entre entidades que indica una relación de “parte-todo”
entre las instancias.
En esta asociación se distingue la parte que representa el “todo”, y que recibe el nombre
de compuesto, y las diferentes “partes” que lo componen, y que reciben el nombre
de componentes.
Agregación
La figura 42 muestra un ejemplo de agregación entre un plato (Dish) y los ingredientes con los
que se ha preparado (Ingredient). Como se puede ver en el modelo conceptual, un plato debe
estar compuesto por uno o más ingredientes, mientras que un mismo ingrediente puede estar
incluido en cualquier número de platos.
Figura 42. Ejemplo de agregación
Cada componente puede estar presente en un único compuesto (la multiplicidad del tipo
de entidad compuesta debe ser como máximo 1).
Composición
Podemos pensar en el conjunto de dedos que forman una mano. La figura 43 muestra el modelo
conceptual en el que se representa la composición de una mano (tipo de entidad Hand) como
conjunto de dedos (tipos de entidad Finger) y donde cada dedo solo puede pertenecer a una sola
mano.
Observación
La agregación se marca con un rombo hueco, mientras que la composición se marca con un rombo
negro.
3.3.Restricciones de integridad
3.3.1.Restricciones en los tipos de entidad
La multiplicidad de tipo de entidad establece un rango de posibles cardinalidades para las
entidades de un determinado tipo de entidad. Es decir, indica cuántas instancias de un
determinado tipo de entidad pueden aparecer en la base de datos.
Generalmente, y por defecto, esta restricción toma el valor indefinido, pero algunas veces puede
ser interesante poder determinar un intervalo en el número de ocurrencias de un tipo de
entidad, especialmente en los casos en los que sólo puede haber una entidad.
Tipos de entidad con multiplicidad 1
Supongamos que queremos modelizar una base de datos para gestionar pequeñas o medianas
empresas. Además de toda la información de clientes, proveedores, productos y otras cosas, hay
que almacenar los datos de la empresa (CIF, nombre, dirección, etc.) para poder mostrar esta
información en facturas, listas y otros datos. Una manera de modelizar este requisito es crear un
tipo de entidad que permita almacenar esta información. En este caso, hay que especificar una
multiplicidad de tipo de entidad igual a 1, puesto que sólo debe haber una entidad con los datos
de la empresa. La figura 44 muestra el diagrama UML de este tipo de entidad.
Atributos derivados: son atributos que calculan el valor a partir de otros atributos y
que, por lo tanto, implícitamente son atributos de sólo lectura desde el punto de vista
del usuario o de la aplicación. No obstante, su valor puede cambiar si cambia el valor
de los atributos de los que dependen.
Restricciones de cambiabilidad
‘Congelado’ (frozen o readOnly): indica que una vez que se ha asignado valor al atributo
no se podrá modificar ni eliminar.
‘Solo-añadir’ (addOnly): indica que una vez que se ha asignado valor al atributo no se
podrá modificar ni eliminar. Pero, en caso de ser un atributo multivalor, sí que se
podrán asignar nuevos valores para este atributo.
a) Restricciones de cardinalidad min..max
Además de todas las restricciones referentes a la cardinalidad de las relaciones que hemos visto,
es posible indicar un valor o rango concreto en la cardinalidad de una relación. Para indicar un
rango en UML, se expresa el valor mínimo seguido de dos puntos y el valor máximo (min..max).
Ejemplo
La figura 46 modeliza una situación en la que un empleado (Employee) sólo puede pertenecer a
un único departamento (Department) y cada departamento debe tener entre 10 y 50
empleados.
b) Restricción xor
Esta restricción se puede aplicar cuando hay varias relaciones ligadas a un mismo tipo de
entidad. La restricción indica que una entidad sólo puede participar en uno de los tipos de
relación unidos por esta restricción.
Ejemplo
Un coche puede pertenecer a una persona o a una empresa. Para modelizar esta situación, la
figura 47 muestra cómo los tipos de relaciones que unen los tipos de entidad ‘coche’ (Car) con
los tipos de entidad ‘persona’ (Person) y ‘empresa’ (Enterprise) están relacionados con la
restricción xor, que indica que un coche ha de ser de una persona o de una empresa, pero no de
ambos a la vez.
Esta restricción indica que un tipo de relación es un subconjunto de otro tipo de relación.
Ejemplo de restricción subset
El jefe de un departamento debe pertenecer a este departamento. Para indicar esta restricción,
podemos utilizar el concepto subset tal como se muestra en la figura 48.
d) Restricción ordered
Esta restricción indica que hay una relación de orden en la asociación entre los tipos de
entidades.
Ejemplo de restricción subset
Una receta de cocina está formada por un conjunto de dos o más pasos que deben seguir un
orden determinado. Para indicar esta restricción, podemos utilizar el concepto ordered tal como
se muestra en la figura 49.
e) Restricciones de cambiabilidad
Esta restricción indica si los valores del extremo de una relación pueden cambiar o no.
‘Congelado’ (frozen o readOnly): indica que una vez que la relación ha sido creada no se
podrá modificar ni eliminar. Tampoco se podrán crear nuevas relaciones.
‘Solo-añadir’ (addOnly): indica que una vez que la relación ha sido creada no se podrá
modificar ni eliminar. Pero sí que se podrán crear nuevas relaciones.
Para poder comparar diferentes ejemplos relacionados con la cambiabilidad, la figura 50 nos
muestra tres situaciones diferentes en las que intervienen los mismos tipos de entidades. En la
primera, representamos la ciudad donde vive una persona, que evidentemente puede cambiar.
Por lo tanto, el extremo de la asociación que conecta con el tipo de entidad ‘ciudad’ (City) es
cambiable o no restringida (opción por defecto). En la segunda situación, representamos el lugar
de nacimiento de una persona, y en este caso etiquetamos como congelado el extremo de esta
asociación. Finalmente, si consideramos las ciudades donde ha vivido una persona, etiquetamos
con el atributo ‘Solo-añadir’, puesto que la lista de ciudades donde ha vivido una persona puede
aumentar, pero no modificar o eliminar valores existentes.
3.3.4.Otras restricciones
En el análisis de requisitos muchas veces se pueden encontrar requisitos o restricciones de
carácter semántico. Estas restricciones dependen completamente del problema, y hay que dejar
constancia de ellas. Generalmente, se utilizan notas ligadas a los tipos de entidades, atributos o
tipos de relaciones a los que hacen referencia para dejar constancia de ellas.
La figura 51 muestra tres notas que permiten notaciones de cualquier tipo para clarificar
conceptos del modelo, asociadas a un tipo de entidad, un atributo o un tipo de relación.
Figura 51. Ejemplo de uso de notas para indicar requisitos o restricciones del modelo
3.4.Modelización de datos históricos
Las bases de datos modelizan el estado de algunos aspectos del mundo exterior. Generalmente,
sólo modelizan un estado del mundo real –el estado actual– y no almacenan información sobre
los estados anteriores. Cuando se produce un cambio de estado en el mundo real, la base de
datos se actualiza y se pierde la información sobre los estados anteriores. No obstante, en
algunas aplicaciones es importante poder almacenar y recuperar información sobre los estados
anteriores del sistema.
Básicamente hay dos tipos de requisitos a la hora de modelizar el tiempo asociado a un estado
del mundo real:
1) Instante de tiempo: en algunas acciones sólo hay que señalar en qué instante de tiempo han
ocurrido. Para modelizar este tipo de actividad, se puede añadir una marca de tiempo que
permita identificar en cada instancia el momento de tiempo con el que está asociado. Este
comportamiento se puede modelizar de dos maneras:
Añadiendo un atributo de tipo ‘fecha y hora’. Cada instancia indica el valor de tiempo en
este atributo.
Añadiendo una relación con el tipo de entidad ‘fecha’ (Date), que contiene un atributo de
tipo ‘fecha y hora’.
2) Intervalo de tiempo: otras acciones tienen un tiempo de vida. Es decir, están activas durante
un intervalo de tiempo específico. En estos casos hay que indicar el intervalo de tiempo en el
que es válida cada una de las entidades. Este comportamiento se puede modelizar de dos
maneras:
Si se quiere aplicar este criterio sobre un concepto que está modelizado como un tipo de
entidad, se pueden añadir dos atributos de tipo fecha y hora en la entidad para indicar
el inicio y el final del intervalo.
Si se quiere aplicar este criterio sobre un concepto que está modelizado como una
relación, hay que añadir en la relación un tipo de entidad ‘fecha’ (Date) que
determinará los tiempos inicial y final del intervalo.
En otras situaciones nos interesa definir no un instante de tiempo, sino un intervalo de tiempo.
Por ejemplo, supongamos que una empresa tiene un conjunto de vehículos con diferentes
características y un conjunto de comerciales y personal técnico que los utiliza. Según las tareas
y las visitas de cada día, cada uno de los comerciales y técnicos puede necesitar un vehículo
diferente. Por lo tanto, a esta empresa le interesará saber qué coche ha estado utilizando cada
uno de los comerciales y técnicos en cada momento (por ejemplo, en caso de recibir una sanción
de tráfico). Para modelizar esta situación hay que definir un tipo de relación cuaternaria en la
que intervienen un comercial, un vehículo y dos entidades de tiempo (una que indica el inicio de
la asociación y otra que indica cuándo la asociación deja de ser válida). La figura 52 muestra un
modelo que implementa la situación descrita.
La tabla 2 muestra, a modo de ejemplo, una posible configuración de entidades del ejemplo
anterior en un instante de tiempo concreto.
3.5.Ejemplo completo
A continuación planteamos un ejemplo completo para poder ver un esquema conceptual en el
que aparezcan algunos de los elementos vistos en este apartado. Continuaremos con el ejemplo
del apartado anterior, que se basa en el diseño de una base de datos para la gestión
universitaria.
A continuación enumeramos los diferentes aspectos de los requisitos de los usuarios que hay
que tener en cuenta al realizar el diseño conceptual de la base de datos:
1) La universidad está formada por diferentes departamentos. Cada departamento está formado
por un conjunto de profesores y está dirigido por un único profesor. Nos interesa conocer el
nombre de los departamentos y el número de profesores que trabajan en cada uno, así como su
localización física, la dirección, teniendo en cuenta que una misma dirección puede existir en
más de una ciudad.
2) Para cada profesor nos interesa poder almacenar sus datos personales como, por ejemplo,
nombre, DNI, fecha de nacimiento, sexo, dirección y números de teléfono. Para los profesores
que son directores de departamento, nos interesa poder identificar la fecha en la que empezaron
a ejercer este cargo.
3) En la universidad se imparten un conjunto de asignaturas. Interesa saber, para cada una de
estas asignaturas, el código, el nombre, el número de créditos, la descripción, si tiene
laboratorio asociado y los prerrequisitos, es decir, otras asignaturas que hay que haber cursado
anteriormente. Además, hay que tener en cuenta que una asignatura pertenece a un único
departamento.
5) Los estudiantes son una parte muy importante de la base de datos. Se quiere almacenar
información sobre los datos personales de estos estudiantes (nombre, DNI, fecha de nacimiento,
sexo, dirección y números de teléfono) y su número de identificación universitaria (conocido
como NIU).
6) Cada estudiante puede estar matriculado de varias asignaturas en cada semestre. Y para
cada una de las asignaturas en las que está matriculado cada semestre, tenemos que poder
almacenar una nota final.
7) También se quiere dejar constancia de las fechas de inicio y final de cada semestre.
8) Las asignaturas se agrupan en los diferentes cursos que forman cada uno de los grados que
ofrece la universidad. Por ejemplo, la asignatura de Álgebra pertenece al primer curso del grado
de Matemáticas. Sobre cada uno de los cursos sólo nos interesa almacenar el conjunto de
asignaturas que lo forman. Sobre cada uno de los grados, nos interesa almacenar información
referente a su número de créditos (obligatorios, opcionales y totales) y una descripción.
10) Cuando un estudiante se gradúa, elabora un proyecto de final de carrera sobre el que nos
interesa almacenar información acerca de la fecha en la que se ha presentado, la nota que ha
obtenido y el profesor que lo ha dirigido.
A partir de los requisitos expresados, la figura 53 muestra un diagrama del modelo conceptual.
Como hemos comentado, este modelo no es único, sino que puede haber diversas
aproximaciones e interpretaciones válidas para una misma representación del mundo real.
Figura 53. Diagrama del modelo conceptual para la segunda aproximación de la base de datos de gestión
universitaria
Ampliación
Resumen
En este módulo hemos visto el proceso de diseño conceptual. Este proceso es una de las etapas
del diseño de bases de datos, concretamente, es la segunda etapa, y se realiza después del
análisis de requisitos.
El enfoque de este material nos ha permitido ver las bases del diseño conceptual empleando los
diagramas UML como sistema de notación.
En la primera parte de este material hemos visto una breve introducción en la que hemos
detallado las bases, los objetivos y los requisitos del diseño conceptual y de los diagramas en
lenguaje UML.
En la segunda parte hemos visto los elementos básicos de modelización en el diseño conceptual.
Entre los elementos principales hay que destacar los tipos de entidades, los atributos y los tipos
de relaciones. A pesar de que estos tres elementos forman la base principal del modelo
conceptual, también hemos visto los tipos de entidades asociativas y los tipos de entidades
débiles, que permiten una mayor riqueza en la representación del modelo conceptual.
Finalmente, en la tercera parte de este material hemos visto algunos de los elementos
avanzados en el diseño conceptual. Los elementos vistos en la parte anterior no permiten
representar situaciones que encontramos en el mundo real y que queremos poder representar
en nuestro modelo. Fruto de esta necesidad se amplía el modelo para incluir conceptos como la
generalización/especialización, la agregación o la composición, que permiten una mayor riqueza
en la representación del modelo conceptual. Para finalizar este texto, nos hemos referido
brevemente a las restricciones de integridad básicas y a la modelización de datos históricos.
Glosario
atributo m
Propiedad que interesa representar de un tipo de entidad.
clase f
Nombre que reciben los tipos de entidades en el modelo UML.
conectividad f
Expresión del tipo de correspondencia entre las entidades de una relación.
diseño conceptual m
Etapa del diseño de una base de datos que obtiene una estructura de la información de
la futura base de datos independiente de la tecnología que se quiere emplear.
diseño lógico m
Etapa del diseño de una base de datos que parte del resultado del diseño conceptual y lo
transforma de manera que se adapte al modelo de sistema gestor de bases de datos con
el cual se desea implementar la base de datos.
generalización/especialización f
Construcción que permite reflejar que existe un tipo de entidad general, llamada
superclase, que se puede especializar en diferentes tipos de entidades más específicas,
llamadas subclases.
entidad f
Objeto del mundo real que podemos distinguir del resto de objetos y del cual nos
interesan algunas propiedades.
modelo entidad-interrelación m
Modelo de datos de alto nivel ampliamente utilizado para el diseño conceptual de las
aplicaciones de bases de datos. El objetivo principal del modelo ER es permitir a los
diseñadores reflejar en un modelo conceptual los requisitos del mundo real.
tipo de relación m
Asociación entre entidades.
Bibliografía
Elmasri, Ramez; Navathe, Shamkant, B. (2007). Fundamentos de sistemas de bases de
datos (5.ª ed.). Madrid: Pearson Educación.
Camps, R.; Cassany M. J.; Conesa, J.; Costal, D.; Figuls, D.; Martín, C.; Rius, A.;
Rodríguez, M. E.; Urpí, T. (2011). Uso de bases de datos. FUOC.
Los textos e imágees publicados en esta obra están sujetos –excepto que se indique lo contrario– a
v.3.0. Se puede copiar, distribuir y transmitir la obra públicamente siempre que se cite el autor y la
fuente (Fundació per a la Universitat Oberta de Catalunya), no se haga un uso comercial y ni obra
http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es
Índice
Introducción
Objetivos
o 2.2.Corte
o 2.3.Pérdida de afiliación
o 3.3.Tipo de entidad
3.3.1.Atributos multivaluados
o 3.4.Tipo de relación
3.4.4.Tipos de relaciones n-arias
o 3.5.Tipos de entidades asociativas
o 3.6.Generalizaciones
o 3.7.Restricciones
3.7.1.Multiplicidades
3.7.2.Generalizaciones
3.7.3.Abrazos mortales
o 3.8.Reconsideraciones
4.Normalización
o 4.1.Anomalías
o 4.2.Conceptos previos
o 4.3.Teoría de la normalización
4.3.5.Reglas de Armstrong
4.3.6.Algoritmo de análisis
4.3.7.Algoritmo de síntesis
Resumen
Glosario
Bibliografía
Introducción
El proceso de desarrollo de una base de datos para un sistema de información es un proceso
secuencial formado por un conjunto de diferentes fases que nos acercan al resultado final de
manera progresiva. Después de la etapa de diseño conceptual, que permite obtener una
especificación basada en el esquema conceptual generado a partir de los requisitos y el análisis
del dominio de la aplicación, tenemos que llevar a cabo el diseño lógico.
Empezaremos el estudio de este módulo con algunas reflexiones sobre posibles errores que se
pueden haber cometido en la etapa de diseño conceptual y que conviene repasar antes de
tomarlo como punto de partida del diseño lógico.
A continuación, nos centraremos en la etapa de diseño lógico y estudiaremos las pautas para
llevarla a cabo. El diseño lógico tiene por objetivo conseguir un esquema lógico de la base de
datos a partir del esquema conceptual que hemos obtenido en la fase anterior. Se puede
considerar, pues, como la etapa que permite transformar un modelo conceptual en un modelo
lógico de la futura base de datos.
En este módulo también veremos la teoría de la normalización, que permite asegurar que el
esquema relacional satisface una serie de condiciones que garantizan una mejor calidad de la
base de datos.
Objetivos
El contenido de estos materiales didácticos os permitirá alcanzar los objetivos siguientes:
2. Conocer las trampas de diseño e identificar las situaciones en las que se pueden
producir.
3. Conocer los efectos negativos que puede suponer la existencia de valores nulos.
Existen varias opciones para el lenguaje de modelización conceptual, en el que estará expresada
la información de entrada al diseño lógico, y para el modelo lógico que utilizaremos para
expresar la solución resultante de este diseño. En este material, utilizaremos modelos
conceptuales basados en el lenguaje UML y los transformaremos en modelos lógicos
relacionales.
En este módulo también veremos la teoría de la normalización. Entre otras aplicaciones, esta
teoría permite poner un sello de calidad al diseño obtenido desde el punto de vista de la
ausencia de redundancia, facilidad de mantenimiento de la consistencia y eficiencia en las
operaciones de actualización de la base de datos derivada del diseño lógico. Además, en el
supuesto de que el diseño no satisfaga las propiedades requeridas, la teoría de la normalización
incluye procedimientos de corrección del diseño.
Precisamente por la naturaleza del diseño conceptual, que implica interpretar y modelizar
conceptos del mundo real, surge la posibilidad de cometer errores dependiendo de si la
interpretación que hacemos es del todo correcta o no. Es importante evitar estos errores, puesto
que pueden provocar graves problemas en fases posteriores del desarrollo de la base de datos.
Algunos de estos errores son recurrentes y siguen unos patrones que nos permiten
identificarlos; son lo que denominamos trampas de diseño. A continuación presentaremos
cinco de estas trampas, puesto que si las conocemos nos será más sencillo detectarlas y evitar
caer en ellas.
Reflexión
Hay diferentes tipos de diagramas para representar los modelos conceptuales, pero en este texto
Decimos que hemos caído en la trampa del abanico cuando uno de los tipos de relación es
derivado de los otros dos y, al no querer incorporar el derivado en el esquema conceptual, nos
equivocamos y eliminamos uno de los que no lo es.
Ilustrémoslo con un ejemplo. Imaginemos que intentamos modelizar las grabaciones que hace
una discográfica de música clásica. En la producción de esta compañía, cada obra (work) es
interpretada (play) por una orquesta (orchestra) una sola vez, y cada orquesta está dirigida
siempre por un director (conductor). La situación se puede modelizar como se indica en la figura
1.
Este modelo, a pesar de que contiene los elementos (tipos de entidad y tipos de relaciones)
necesarios, no es del todo correcto, porque falta una restricción: si una orquesta interpreta
alguna obra y un director dirige dicha orquesta, el director dirige la obra. Es decir, el tipo de
relación conductsWork es un tipo derivado a partir de los otros dos.
También puede suceder que caigamos en la trampa directamente, sin ser conscientes de que
incluimos un tipo de relación derivado y, en cambio, no incluyamos en el modelo el tipo de
relación a partir del cual se puede derivar la nueva información.
Reflexión
Cuando hay elementos derivados, podemos decidir eliminarlos del diagrama de clases si pensamos
que de este modo queda más claro y el elemento derivado no es de interés para la base de datos que
diseñamos.
2.2.Corte
Esta otra trampa se presenta en la misma situación que la del abanico: cuando tres tipos de
entidad están relacionados por tres tipos de relaciones binarias (1..*), uno de los cuales es un
tipo derivado de los otros dos.
Decimos que hemos caído en la trampa del corte cuando, al no querer incorporar el tipo de
relación derivado en el esquema conceptual, nos equivocamos y eliminamos uno de los que no lo
es. En este caso, la consecuencia es que la información sobre la relación entre objetos de las
entidades que no han quedado directamente relacionadas queda supeditada a la existencia de
algún objeto de la tercera entidad para hacer de puente.
El modelo de la figura 4 vuelve a ser incorrecto porque incluye un tipo de relación derivado
(conductsWork) y se olvida de uno que no lo es (conductsOrc).
Si observamos las instancias que acompañan al modelo conceptual de la figura 4, no se ven las
consecuencias que tiene caer en esta trampa. A pesar de esto, resulta muy fácil ver que este
modelo no es correcto, si pensamos:
1) cómo podemos indicar quién es el director de una orquesta que todavía no ha interpretado
ninguna obra, o
2) que si eliminamos una obra, perdemos datos del director de la orquesta que la interpretó.
De aquí proviene el nombre de esta trampa: eliminar una obra puede "cortar" la conexión entre
una orquesta y su director.
2.3.Pérdida de afiliación
La tercera trampa que podemos detectar es lo que se conoce como pérdida de afiliación. Se
puede presentar cuando hay un tipo de relación ternaria y tres tipos de relaciones binarias entre
los tipos de entidad que lo constituyen.
Retomemos el ejemplo de los casos anteriores, pero ahora supongamos que una misma
orquesta puede ser dirigida por varios directores y una misma obra puede ser interpretada por
varias orquestas. Esta situación nos puede llevar a un modelo como el de la figura 5.
Aplicamos la misma denominación al caso en el que pretendemos representar esta situación con dos
de los tipos de relaciones binarias. Por ejemplo, si solo modelizamos los tipos de
relación conductsWork y plays.
En este punto, veremos que incorporar un tipo de entidad a un tipo de relación que no le
corresponde también puede ser fuente de errores en el diseño conceptual.
La trampa de aridad de los tipos de relación se puede presentar cuando hay un tipo de
relación de grado mayor que 2 que tiene alguna multiplicidad de valor 1. En este caso, es
posible que la entidad que se encuentra en el lado con multiplicidad igual a 1 en realidad no
deba formar parte del tipo de relación. Decimos que hemos caído en esta trampa cuando hemos
incluido la entidad de manera errónea.
Así pues, cuando nos aparece una multiplicidad igual a 1 en un tipo de relación ternaria (o de
grado más alto), debemos tener mucho cuidado y verificar si el grado del tipo de relación es tal
como lo planteamos o si en realidad se trata de dos o más tipos de relación de grado más bajo.
Pensemos ahora en un contexto en el que se quiere modelizar el hecho de que las obras son
interpretadas por orquestas y que cada obra tiene un compositor, con la restricción de que cada
obra tiene un único compositor. Un posible modelo conceptual para esta descripción se muestra
en la figura 7.
Esto no significa que no pueda haber algún tipo de relación de grado mayor que 2 y con alguna
multiplicidad igual a 1. Como ejemplo correcto de tipo de relación ternaria en el que uno de los
tipos de entidad participa con multiplicidad igual a 1, consideremos el de la figura 9, donde
asumimos que en un momento dado una orquesta solo tiene un director, a pesar de que
permitimos que un director se haga cargo de más de una orquesta de manera simultánea.
Una manera de confirmar o descartar que un atributo se encuentra en un tipo de entidad que le
corresponde es no perder de vista la semántica del tipo de entidad y comprobar si el atributo es
coherente con esta semántica.
Como hemos mencionado, en este módulo nos centraremos en la conversión del esquema
conceptual expresado en lenguaje UML en un esquema lógico para un tipo de base de datos
relacional. En estos casos, el modelo lógico recibe el nombre de modelo lógico relacional o,
simplemente, modelo relacional.
Reflexión
Dado que en este módulo trataremos únicamente el caso de modelos lógicos para bases de datos
Actualmente, existen herramientas CASE (2) que son capaces de hacer este proceso de traducción
de manera automática. Ahora bien, dado que hay situaciones en las cuales parte de un modelo
se puede traducir de varias maneras, los usuarios de estas herramientas deben tener los
conocimientos necesarios para realizar la traducción de forma manual porque, como usuarios de
una herramienta CASE, deben ser capaces de modificar el resultado de la traducción automática
si la herramienta no ha elegido la alternativa que se ajusta mejor a las condiciones de cada caso
concreto. También es necesario tener estos conocimientos para decidir correctamente si la
herramienta, al encontrarse ante alternativas que no puede resolver, pide la intervención del
usuario.
desarrollo de software a partir de especificaciones y definiciones de alto nivel. Uno de los objetivos
principales es liberar a los diseñadores de la base de datos de los procesos rutinarios, con posibilidad
de automatización, no sólo para conseguir una producción más eficiente, sino también para evitar
algunos de los errores que se pueden cometer en estos procesos de desarrollo. En el área de la
modelización conceptual y las bases de datos, algunas de las herramientas más conocidas
El modelo también permite expresar restricciones que limitan los valores o las combinaciones de
valores que pueden tomar los atributos. Las más importantes son:
Ejemplo
En una relación de orquestas en la que cada tupla contiene los datos de una orquesta, el atributo
que corresponde al número de identificación fiscal se puede declarar como clave candidata.
Clave primaria. De entre las claves candidatas, el diseñador elige una que será la que
utilizaremos habitualmente para identificar de manera unívoca una tupla de la
relación. En lenguaje SQL, la restricción PRIMARY KEY sirve para especificar la clave
primaria de una relación.
Clave alternativa. Cada una de las claves candidatas que no ha sido elegida clave
primaria recibe el nombre de clave alternativa. En lenguaje SQL, se usa la
cláusula UNIQUE se utiliza para especificar una clave alternativa en una relación.
Ejemplo
Ejemplo
Valores nulos. Decimos que no admiten valores nulos todos aquellos atributos que
siempre deben estar informados. En lenguaje SQL, un atributo de este tipo se
especifica mediante la restricción NOT NULL aplicada a la columna en cuestión.
Comprobación de una condición. Es una restricción que verifica que el valor de uno o
más atributos satisface una expresión booleana que se especifica en la declaración de
la restricción. En lenguaje SQL, usamos la restricción CHECK seguida de la expresión
que debe satisfacerse.
Ejemplo
Por claridad y concisión, expresaremos un esquema del modelo relacional mediante una notación
simplificada del lenguaje SQL estándar.
El estándar SQL
El estándar SQL es un lenguaje que permite trabajar con bases de datos relacionales. Es muy utilizado
y casi todas las aplicaciones desarrolladas sobre bases de datos relacionales lo utilizan. Los SGBD
relacionales que se eligen de manera habitual para almacenar la información lo implementan, a veces
con pequeñas diferencias. Contiene sentencias tanto para definir bases de datos como para hacer
actualizaciones y consultas. Ha tenido tres versiones principales que han aparecido, respectivamente,
en los años 1989, 1992 y 1999. El lenguaje continúa evolucionando y se le incorporan nuevos
Denotaremos las relaciones a partir del nombre, seguido de la lista de atributos entre
paréntesis y separados por comas.
Denotaremos las claves primarias subrayando con una línea continua los atributos que
las forman.
Denotaremos las claves alternativas subrayando con una línea discontinua los atributos
que las forman.
Denotaremos las claves foráneas como flechas que tienen su origen en el conjunto de
atributos que las forman y su destino en el conjunto de atributos que forman la clave
referenciada. Esta notación es diferente de la notación utilizada en otros textos sobre
diseño de bases de datos, pero resulta interesante, puesto que muestra de manera
gráfica y más comprensible la transformación del esquema conceptual en el modelo
relacional. En caso de tener un gran número de relaciones, puede ser confusa porque
puede implicar un gran número de flechas que se cruzan entre sí. En estas ocasiones
será mejor usar una notación textual que indique en cada relación qué claves foráneas
contiene y qué relación referencia cada clave foránea.
A continuación mostramos cómo expresar un modelo con dos relaciones, una de obras y una de
compositores, en el que las obras se identifican mediante un código de catalogación y contienen
un nombre popular que se puede repetir en compositores diferentes, pero no en obras de un
mismo compositor. Los compositores se identifican por su nombre y es obligatorio asignar valor
al atributo de fecha de nacimiento (fechaN).
Reflexión
Una clave candidata sirve para identificar cada una de las tuplas de manera unívoca dentro de una
relación.
Un mal uso de los valores nulos puede causar problemas, básicamente de dos tipos: de
eficiencia y de construcción de consultas que manipulan atributos que contienen valores nulos.
El problema de eficiencia se deriva del acceso a filas que contienen columnas con valores nulos,
las cuales podrían haberse evitado con un diseño alternativo de la base de datos. El ejemplo
siguiente lo ilustra:
Reflexión
Recordemos que los valores nulos constituyen un mecanismo que soluciona el problema de
Así pues, cuando hay columnas para las cuales una proporción grande de las filas puede tener
valor nulo, hay que analizar si las consultas pueden ser penalizadas y, si procede, cambiar el
diseño para eliminar la presencia de valores nulos.
En cuanto a la corrección de las consultas que involucran atributos que pueden tomar valor nulo,
debemos estar atentos para asegurarnos de que la consulta devuelve el resultado correcto, tanto
en el caso de existir tuplas con valor nulo como en el caso contrario. Consideremos el caso
siguiente, en el que tanto la relación de directores como la de compositores tienen una columna
que indica de qué país es el director o compositor. Si queremos obtener la de los directores que
son de un país donde no ha nacido ningún compositor, podríamos pensar en las dos consultas
que se muestran a continuación:
Las dos consultas devuelven el mismo resultado siempre que la columna pais no tenga valores
nulos. Observad que si un director tiene el valor nulo en la columna pais, la primera consulta no
lo incorpora en el resultado y, en cambio, la segunda sí.
Este es solo un ejemplo para ilustrar el impacto que puede tener la existencia de valores nulos
en las consultas. Será necesario, pues, tenerlo presente en todas las consultas que involucran
los valores nulos en la condición de selección, atributos de agrupación (GROUP BY), funciones de
agregación (MAX, SUM, ...), etc.
Después de los preliminares, pasemos a ver cómo podemos transformar cada uno de los
elementos del modelo conceptual expresados en lenguaje UML en el modelo lógico relacional.
3.3.Tipo de entidad
El primer elemento del modelo conceptual que transformaremos será el concepto de tipo de
entidad.
3.3.1.Atributos multivaluados
La transformación de los atributos multivaluados requiere un análisis más detallado. El modelo
relacional no soporta directamente esta posibilidad, pero hay dos maneras de representar
atributos multivaluados:
2) Por filas. Esta segunda representación consiste en representar cada valor de un atributo
multivaluado como una fila o tupla de una nueva relación en el esquema relacional.
Suponiendo que cada compositor puede tener como máximo cinco ciudades de residencia,
podemos representar este atributo multivaluado mediante dos modelos lógicos posibles:
1) Por columnas:
2) Por filas:
Fijémonos en que, como hemos explicado, para hacer la representación por columnas debemos
conocer el número máximo de ciudades en las que puede haber vivido un compositor, y que
para cada compositor dejaremos con valor nulo los atributos de ciudad que no sean necesarios.
Si conocemos este número máximo y la mayoría de los compositores dejan pocos o ningún valor
nulo, esta puede ser una buena representación. Si este no es el caso, probablemente será mejor
la representación por filas. También hay que tener presente que en esta segunda representación
será preciso efectuar operaciones de combinación (join) para recuperar las ciudades de un
compositor, cosa que no habrá que hacer si se utiliza la primera representación.
3.4.Tipo de relación
Para realizar la transformación de los tipos de relaciones al modelo relacional deberemos fijarnos
en la aridad, o grado, y en las multiplicidades, o conectividad. En lo que respecta al grado,
distinguiremos entre grado 2 o más, y en cuanto a la conectividad, distinguiremos si el mínimo
es 0 o más y si el máximo es 1 o más. También estudiaremos los casos particulares de tipos de
relaciones reflexivas y de composiciones.
Todo tipo de relación se puede representar con una nueva relación, que tiene como clave
primaria la concatenación de claves primarias de las relaciones que representan los tipos de
entidad que participan en el tipo de relación. Además, esta nueva relación tendrá una clave
foránea por cada tipo de entidad relacionado.
Si además tenemos en cuenta que, tal y como especifica el esquema conceptual, toda obra tiene
un compositor, entonces habrá que añadir la restricción NOT NULL sobre la columna composer.
Por lo tanto, el modelo conceptual de la figura 14 se transforma en el siguiente modelo lógico:
Detengámonos y reflexionemos un poco sobre esta representación en el supuesto de que la
multiplicidad mínima del tipo de relación composes fuera igual a 0 en lugar de igual a 1. Si
suponemos que una obra puede no tener asociado ningún compositor –por ejemplo, porque se
desconoce o consta como anónima–, entonces la clave foránea podría tomar valores nulos.
Si queremos evitar la existencia de valores nulos, podemos optar por utilizar la representación
de los tipos de relación mediante una relación.
En el caso particular de un tipo de relación binaria 1..1 entre dos tipos de entidad E1 y E2 que se
transforman en las relaciones R1 y R2 del modelo lógico, podremos representar el tipo de
relación como relación, como clave foránea de R1 que referencia R2 o como clave foránea
de R2 que referencia R1.
En caso de que las multiplicidades mínimas sean igual a 0, la representación por clave foránea
tendrá que admitir valores nulos, tal y como hemos explicado. Si optamos por la representación
por relación, hay que tener presente que ahora la relación no tiene una clave compuesta, sino
dos claves candidatas.
Por ejemplo, si queremos representar el hecho de que un compositor puede tener una obra
preferida (favourite) y que una obra puede ser la preferida de un compositor, entonces tenemos
el esquema conceptual de la figura 15.
Si optamos por una transformación por relación, obtenemos el modelo lógico siguiente:
3.4.2.Tipos de relaciones binarias reflexivas
Otro caso particular que tenemos que estudiar es el de los tipos de relaciones binarias reflexivas.
Se pueden representar igual que en el caso general: mediante claves foráneas o mediante
relaciones.
En el supuesto de que el tipo de relación tenga la multiplicidad máxima mayor que 1, en ambos
extremos se tiene que representar por relación, y en este caso hay que analizar si es simétrica.
En caso afirmativo, podemos optar por ahorrar espacio guardando la mitad de la información y
dejando implícita la otra mitad, que se puede deducir por simetría. También hay que garantizar
que para cada par (o1, o2) de la extensión exista el par (o2, o1):
Un tipo de relación binaria es simétrico si para toda relación del tipo (a ,b) también existe la relación
bien virtualmente, guardando solo la mitad de los pares y con aserciones que eviten la
existencia de pares simétricos y una vista definida sobre la tabla. Esta vista debe
reconstruir la extensión entera a partir de la mitad que tenemos almacenada.
Recordad
Una vista se declara dándole un nombre y definiéndola como una consulta sobre una o más tablas.
Una vez se ha declarado, se le pueden hacer consultas como si fuera una tabla.
Ved también
Las composiciones establecen una relación de dependencia de existencia entre dos tipos de
entidad. Normalmente, esta dependencia hace que la identificación del componente sea solo
válida en el conjunto de componentes de un mismo compuesto.
Imaginemos que queremos representar el conjunto de obras de cada compositor. Cada obra se
identifica por el atributo opus (un número que ordena cronológicamente las obras de un
compositor), pero diferentes obras de distintos compositores pueden tener un mismo opus. En la
figura 17 se representa el esquema conceptual correspondiente.
3.4.4.Tipos de relaciones n-arias
Los tipos de relación de aridad mayor que 2 se representan por relaciones. Lo que es preciso
tener en cuenta son las multiplicidades, puesto que si hay alguna conectividad máxima igual a 1,
aparecen claves alternativas.
Supongamos que queremos registrar los datos históricos referentes a las direcciones de
orquesta con el correspondiente director, tal y como se muestra en la figura 18.
En la figura 19 podemos ver diferentes casos en el mismo contexto, en los que vamos limitando
la multiplicidad máxima de los extremos del tipo de relación conduction.
a) una clave candidata, pero formada solo por dos atributos. El otro se tiene que declarar NOT
NULL:
En un tipo de entidad asociativa, los atributos se pueden representar de dos maneras,
dependiendo de cómo se ha representado el tipo de relación, si como una relación o como una
clave foránea. En el primer caso, los atributos del tipo de relación se convertirán en columnas de
la relación y, en el segundo caso, en columnas de la clave foránea de la relación.
Dado que plays tiene una multiplicidad *..*, se transforma mediante una relación. En cambio,
puesto que composes tiene una multiplicidad 0..1, se puede transformar mediante una clave
foránea. Teniendo en cuenta esto, la traducción al modelo relacional del esquema conceptual es
la siguiente:
Tenemos que prestar atención una vez más a los valores nulos. El atributo comp puede ser nulo
porque el tipo de relación tiene multiplicidad 0..1 y, por lo tanto, el atributo age también lo
puede ser.
Es preciso tener en cuenta que si las claves foráneas que representan un tipo de relación pueden
ser nulas, todos los atributos que tenga el tipo de relación también lo pueden ser.
Un tipo de entidad asociativa puede participar en tipos de relación. Al igual que el resto de los
tipos de entidades participantes de un tipo de relación, también los tipos de entidad asociativa
tendrán que ser referenciados por alguna clave foránea si participan en tipos de relaciones.
Si el tipo de entidad asociativa se ha representado con una relación, la clave primaria será
compuesta y las claves foráneas que la referencien también lo deberán ser. En cambio, si se ha
representado como clave foránea en una relación R, las claves foráneas que tengan que
referenciar el tipo de entidad asociativa deberán referenciar la relación R.
Para ilustrar esta casuística, fijémonos en el modelo conceptual de la figura 21. Este modelo
relaciona cada obra con su compositor y las orquestas que la han interpretado. Además, se
incluye en qué ciudades residía el compositor durante la composición de la obra y qué directores
dirigían la orquesta en las interpretaciones de la obra.
Figura 21. Ejemplo de tipos de entidades asociativas que participan en otros tipos de relaciones
3.6.Generalizaciones
La última estructura del modelo conceptual de la cual veremos su tranformación en el modelo
relacional es la generalización/especialización o, simplemente, generalización.
1) Una única relación, cuyas columnas son la unión de los atributos de todos los tipos de entidad
(superclase y subclases).
2) Una relación para cada subclase, pero ninguna relación para la superclase. Cada relación
tendrá las columnas que corresponden a los atributos de su subclase y, además, los de la
superclase.
3) Una relación para cada tipo de entidad. Cada relación contendrá las columnas de los atributos
correspondientes a su tipo de entidad. En el caso de las relaciones que representan las
subclases, además, tendremos el identificador con una restricción de clave foránea que
referenciará la relación padre o superclase.
Consideremos el esquema conceptual de la figura 22, que representa diferentes tipos de obra.
Están las obras de música antigua (early) de las cuales queremos información sobre la partitura
original (original sheet), las de música clásica (classical) y las de música moderna (modern).
Para elegir entre las tres representaciones posibles de una generalización, tenemos que
considerar una serie de circunstancias:
1. Una primera cuestión que hay que tener en cuenta es cuáles de las posibles estructuras
pueden almacenar toda la información de todas las posibles instancias.
3. También hay que decir que algunas de las opciones pueden implicar redundancia cuando la
generalización es solapada. Por ejemplo, en la segunda opción, una instancia que pertenezca a
dos subclases repetirá dos veces los valores de los atributos provenientes de la superclase.
c) Si elegimos la opción 3, en el caso de una generalización solapada, los atributos comunes de
la superclase se repetirán para cada instancia de la relación tantas veces como el número de
subclases a las que pertenece la instancia.
Hay que elegir la alternativa que permita almacenar todas las instancias y que no genere valores
nulos (o que genere un número mínimo de estos) ni redundancia, excepto cuando haya razones
de rendimiento que exijan una opción diferente.
A continuación, podemos ver otro ejemplo en el que la superclase forma parte de un tipo de
relación. La figura 23 muestra un modelo en el cual se define que cada compositor tiene una
obra representativa y que las obras pueden ser de diferentes tipos.
La regla de transformación de generalizaciones se debe considerar como una guía general, pero
además hay que tener en cuenta el resto del esquema conceptual en el que participa la
generalización. Por ejemplo, si hay referencias de otras relaciones (surgidas de la traducción de
otra parte del esquema), algunas de las opciones dejan de ser válidas: en el esquema de la
figura 23, si decidimos convertir el tipo de relación representative en una clave foránea que
referencia Work, la opción 2 no es válida porque necesitamos una relación para la clase
genérica.
Recordad
conjunto de subclases (o tipos de entidades específicas). Además, es posible que estas subclases sean
disjuntas o solapadas, por un lado, y que la especialización sea total o parcial, por el otro.
3.7.Restricciones
Finalmente, nos falta analizar la manera en que las restricciones que forman parte del modelo
conceptual se transforman en el modelo lógico relacional.
En este subapartado, nos centraremos en las restricciones estructurales del diagrama de clases.
Algunas restricciones quedan incorporadas en el modelo relacional si se han aplicado de manera
correcta las transformaciones que hemos visto hasta ahora. Hay, no obstante, otras restricciones
que habrá que añadir al modelo lógico relacional de manera más explícita.
2) Multiplicidad de los tipos de relación. Hay que garantizar la conectividad entre las
instancias de relaciones, respetando los máximos y mínimos de estas multiplicidades. Ya hemos
tenido en cuenta algunas de estas restricciones, pero quedan otras que aún no hemos tratado.
3) Tipología de las generalizaciones. Se tiene que procurar que queden reflejadas las
restricciones de pertenencia a superclases y a las subclases teniendo en cuenta su tipología
(declaración de disjunto/solapado y total/parcial).
Los mecanismos de los que disponemos para mantener y controlar las restricciones son los
siguientes:
En este módulo ya hemos tratado las restricciones de identidad. A continuación, veremos cómo
podemos tratar los otros dos tipos de restricciones estructurales y los problemas con los que nos
podemos encontrar.
En inglés, triggers.
(3)
3.7.1.Multiplicidades
En lo que respecta a las multiplicidades, será necesario analizar los diferentes tipos de relación.
Empecemos por los tipos de relaciones binarias que se representan mediante alguna clave
foránea, es decir, tipos de relaciones entre dos relaciones A y B de manera que una de estas
tiene una o más columnas que referencian las tuplas de la otra relación.
Figura 24. Conjunto de posibles multiplicidades de un tipo de relación binaria que se puede transformar en
clave foránea
Si es 0..1, tenemos que declarar que fk es UNIQUE, asegurando así que no puede haber
más de un elemento de B asociado con el mismo elemento de A.
Si es 1, tenemos que asegurar que toda tupla de A es referenciada por una tupla de B.
Podemos expresar de varias maneras que toda fila de A es referenciada por una fila
de B. Por ejemplo, como una aserción o una clave foránea de A hacia B. Esta clave
foránea sería el atributo pk de A que haría referencia a fk de B, que habremos
definido como UNIQUE. Además, será necesario controlar que si la tupla b de B hace
referencia a la tupla a de A, la tupla a hace referencia a la tupla b. Esta comprobación
se podría hacer, por ejemplo, empleando un disparador.
Si es 1..*, tenemos que asegurar mediante una aserción que toda fila de A es
referenciada por una o más filas de B.
A continuación, analizamos otro tipo de relación binaria.
Las multiplicidades posibles de este tipo de relación son las que se muestran en la figura 25.
Figura 25. Posibles multiplicidades de un tipo de relación binaria que se puede transformar en relación
En función del número máximo de las multiplicidades de los tipos de entidades A y B en el tipo
de relación C (si es igual a 1 o mayor que 1), fk1 y fk2 serán claves por sí mismas o no:
si un máximo es igual a 1 pero el otro es mayor que 1, habrá una sola clave formada por
una sola columna.
si ambos máximos son mayores que 1, habrá una clave formada por las dos columnas.
Ved también
Podéis ver las multiplicidades y los diferentes tipos de relación en el subapartado 3.4 de este módulo
didáctico.
Pensemos ahora en las multiplicidades mínimas, que se tratarán cada una de manera
independiente: si el mínimo es igual a 0, no hay que añadir más controles. Si la multiplicidad a
la izquierda de la figura 25 es igual a 1, tenemos que asegurar que todas las tuplas de la
relación B aparezcan una y solo una vez en la relación C. Y si la multiplicidad es 1..* tendremos
que asegurar que aparezcan una o más veces. Será preciso establecer los controles simétricos si
el mínimo de la derecha de la figura 25 es igual a 1.
Reflexión
Encontramos situaciones análogas a las que hemos tratado en el caso de representación por clave
Para acabar el estudio de restricciones provenientes de tipos de relación, veremos ahora los
tipos de relación de aridad superior a 2. Como ya hemos explicitado, en función del máximo de
las multiplicidades (si es igual a 1 o mayor que 1), la clave de la relación del tipo de relación
estará formada por todas las claves foráneas o solo por una parte de las mismas. También
puede pasar, como ya hemos visto, que aparezcan claves alternativas.
Ved también
Podéis ver los tipos de relaciones n-arias en el subapartado 3.4.4 de este módulo didáctico.
3.7.2.Generalizaciones
En este subapartado nos ocuparemos de las restricciones correspondientes a las características
de las generalizaciones. Según cuál sea la opción elegida de las tres presentadas, la que se
utilice para transformar la generalización del modelo conceptual al modelo lógico, deberemos
incorporar un tipo de restricciones u otro:
a) Una única relación para todos los tipos de entidad de la jerarquía. Es útil en casos muy
particulares de generalizaciones solapadas y parciales, como ya se ha comentado. En función de
cómo se indique a qué clases o subclases puede pertenecer una instancia en el modelo
conceptual, será necesario diseñar alguna aserción para comprobar que cada instancia pertenece
a alguna subclase.
b) Una relación para cada tipo de entidad específica. Se ajusta bien a los casos en que la
jerarquía es disjunta y total. En este caso, será necesario controlar que una misma instancia no
pertenezca a más de una subclase. Esta comprobación se puede realizar mediante el uso de
disparadores incorporados en la inserción y la modificación.
c) Una relación para la entidad genérica. Es la opción más flexible y permite representar
cualquier combinación disjunta/solapada y total/parcial. En este caso será necesario añadir los
controles de disjunta (como acabamos de explicar) y/o total (que podemos implementar con una
aserción) según proceda.
Ved también
3.7.3.Abrazos mortales
Finalizaremos este subapartado de restricciones comentando un problema que puede aparecer
en el proceso de incorporación de las restricciones en el modelo relacional, o también durante el
paso del esquema conceptual al modelo relacional en determinadas situaciones. Nos referimos a
los abrazos mortales, referencias cíclicas entre relaciones del modelo.
Supongamos que queremos modelizar una situación en la cual una obra sea representativa de
un compositor y que un compositor tenga o no una obra de referencia. El modelo conceptual
para esta situación sería el que se describe en la figura 26.
Figura 26. Un tipo de relación binaria que se puede transformar en dos claves foráneas cíclicas
Una vez superada la dificultad de la creación de tablas con referencias cíclicas, nos podemos
encontrar con una situación similar a la hora de insertar filas en las tablas vacías: no podemos
insertar una obra si no está antes el compositor, pero tampoco podemos insertar el compositor
hasta que no tengamos su obra representativa.
Cuando en un esquema relacional no podemos insertar las tuplas que darían lugar a un
contenido que no viola ninguna restricción porque hay un ciclo de claves foráneas que impide
insertar las tuplas de una en una sin violar la integridad referencial, decimos que se ha
producido un abrazo mortal de carga.
Una primera solución del abrazo mortal de carga consiste en eliminar las restricciones que la
provocan o delegarlas a algún otro nivel. Podemos, sin embargo, mantener el control de estas
restricciones en el ámbito del SGBD difiriendo su comprobación.
Los SGBD, por medio del mecanismo de transacciones, nos ofrecen la posibilidad de diferir la
comprobación de restricciones en lugar de hacer la comprobación inmediatamente después de
cada operación elemental. De este modo, después del primer INSERT se estará violando la
restricción, pero el segundo INSERT nos llevará a un nuevo estado en el cual se satisface la
restricción. En medio de las dos sentencias de inserción de filas, la SGBD impedirá los accesos a
estas tablas que son, provisionalmente, inconsistentes. Una vez completadas las dos sentencias
de inserción, el SGBD comprobará las restricciones y volverá a permitir el acceso a las tablas.
3.8.Reconsideraciones
Una vez finalizada la transformación de un esquema conceptual en un modelo relacional, quedan
detalles que debemos refinar en el esquema relacional obtenido.
En este subapartado, presentamos dos situaciones que pueden ayudar a ajustar el esquema
lógico.
Consideremos el caso de la figura 27, que representa obras, orquestas y qué obras ha
interpretado cada orquesta.
A partir del modelo conceptual de la figura 27, obtenemos el esquema lógico siguiente:
Si Work y Orchestra no tienen más atributos que el identificador, nos podemos preguntar si es
mejor eliminar estas relaciones y quedarnos sólo con la relación Plays, en la que ya aparecen
estos identificadores. Debemos valorar, no obstante, que Orchestra y Work nos permiten estar
seguros de que siempre que aparece una obra o una orquesta se trata de una obra u orquesta
que existe y que siempre lo hace con el mismo nombre o denominación.
Si nos encontramos en una situación (que es poco frecuente) en la cual la integridad referencial
nos viene garantizada por algún otro sistema (por ejemplo, no es necesaria una tabla de fechas
porque la SGBD ya no permite la existencia de valores de fecha incorrectos), podremos eliminar
la tabla.
Otra opción de simplificación consiste en fusionar dos tipos de entidad conectados por un tipo de
relación 1..1 en un único tipo de entidad. Tomaremos la decisión sobre si es mejor fusionar o no
en función del espacio ocupado y del tiempo requerido para las operaciones más frecuentes (si
es más frecuente consultar atributos de un solo tipo de entidad o, por el contrario, consultar
información que incluye atributos de los dos tipos de entidades). La fusión consiste en
representar el esquema conceptual, no con dos relaciones vinculadas con claves foráneas, sino
con una única relación que incluya los atributos de los dos tipos de entidad.
Si nos decidimos a llevar a cabo la fusión, la relación resultante tendrá dos claves alternativas y
deberemos elegir cuál debe ser la primaria. El criterio de elección más adecuado suele ser el de
mínima frecuencia de cambio.
Figura 28. Dos tipos de entidad susceptibles de ser transformados en una única relación
Si fusionamos ambos tipos de entidad, la relación resultante tendrá dos claves alternativas (la
de Conductor y la de Orchestra). En este caso, seguramente es mejor que la clave primaria sea
el identificador de orquesta, que prácticamente no cambia nunca; en cambio, el director de una
orquesta puede cambiar con mayor frecuencia.
4.Normalización
Durante el proceso de diseño se han tomado diferentes decisiones que determinan un diseño
concreto, entre las distintas alternativas posibles, para resolver una misma necesidad. Por
ejemplo, un mismo concepto del mundo real puede dar lugar a esquemas conceptuales
ligeramente diferentes, o la transformación del modelo conceptual en el modelo lógico se puede
llevar a cabo con diferentes alternativas o matices.
En los apartados anteriores, hemos visto algunos criterios para elegir o descartar determinadas
opciones (por ejemplo, favorecer determinadas operaciones por encima de otras o evitar la
existencia de valores nulos). En este apartado veremos las condiciones de normalización, que
son las condiciones que garantizan que la base de datos está diseñada de manera que no se
mezclen conceptos diferentes en una misma relación. Esta característica es positiva porque
facilita la comprensión del diseño y evita redundancias innecesarias.
En primer lugar, veremos las anomalías que se pueden producir cuando una base de datos no
está normalizada. Estas anomalías implican ineficiencia y complejidad en el mantenimiento de la
coherencia de los datos. En segundo lugar, después de un repaso previo de conceptos del
modelo relacional y del álgebra de conjuntos, presentaremos la teoría de normalización y
veremos cómo la podemos aplicar a los esquemas lógicos. Veremos que esta aplicación elimina
las anomalías de la base de datos.
4.1.Anomalías
Un diseño lógico no normalizado tiene como consecuencias negativas la falta de separación de
conceptos y la existencia de redundancias que provocan la aparición de las
denominadas anomalías de actualización. Decimos que hay anomalías cuando es preciso
actualizar muchas tuplas para reflejar un cambio elemental que con un diseño normalizado
implicaría un volumen de tuplas mucho menor.
Anomalías de inserción
Ejemplo
Imaginemos que queremos almacenar información de las obras que tenemos disponibles en
nuestra discoteca y de los compositores que son sus autores. Con este objetivo, creamos la
relación siguiente:
Sin embargo, no podemos porque el atributo work es la clave primaria y ésta no puede tener
valor nulo. Nos encontramos, pues, con que no podemos insertar información de un compositor
independientemente de sus obras.
Anomalías de supresión
Ejemplo
Supongamos ahora que queremos suprimir el Tercer concierto para piano de Mozart. Después de
la supresión, nuestra relación tendrá la extensión que muestra la figura 30.
Observad que, de manera involuntaria, hemos perdido la información que teníamos del
compositor Mozart.
Anomalías de modificación
Ejemplo
Si ahora queremos anotar que el grado de digitalización de las obras de Mahler ha pasado a ser
del 73%, tendremos que actualizar la relación tal y como se muestra en la figura 31.
Observad que tendremos que modificar tantas tuplas como obras de Mahler tengamos en la
relación.
La solución del caso utilizado como ejemplo vendría dada por la separación de los datos de obras
y de compositores, lo que daría lugar al modelo normalizado siguiente:
4.2.Conceptos previos
La teoría de la normalización se basa en el concepto de dependencia funcional, el cual a su vez
se define en términos del álgebra relacional y de conceptos de la teoría de conjuntos. En este
subapartado, se presentan estos elementos que permitirán abordar la teoría de la normalización.
Para empezar, repasaremos algunos conceptos de álgebra de conjuntos. Estos conceptos nos
servirán después para razonar sobre los valores que toman los atributos de las relaciones.
Concretamente, queremos definir el producto cartesiano, la correspondencia y la función:
Decimos que una función es inyectiva cuando cada elemento del conjunto imagen está
relacionado, como mucho, con un elemento del conjunto origen. En la figura 36,
podemos ver un ejemplo de función inyectiva.
Como ya hemos visto, las relaciones se ajustan a un esquema que define sus atributos y tienen
una extensión formada por tuplas que dan valores a los atributos.
Cada tupla de la extensión de una relación tiene la información de una entidad del mundo real.
Podemos usar el concepto de función para representar los valores que toma un atributo en cada
tupla y, por lo tanto, para cada entidad.
Los valores que toma un atributo en la extensión de una relación se pueden considerar una
función que tiene como origen el conjunto de las entidades del mundo real y como imagen, el
dominio del atributo.
Podemos observar que la función correspondiente a cName es inyectiva; fijémonos en que esta
es una propiedad que cumplirán por definición todas las funciones que correspondan a atributos
identificadores (observad que ya habíamos indicado que este atributo es una clave de la
relación).
Dependencias funcionales
Observemos que un caso particular de dependencias funcionales son las claves de una relación:
en este caso, los atributos que forman la clave determinan todos los demás. Esto es
consecuencia de la no repetición de valores de la clave: puesto que sólo puede haber una tupla
con un valor concreto de la clave, todas las tuplas con aquel valor (es decir, como máximo una)
tienen el mismo valor para todos los demás atributos de la relación.
Para acabar de presentar este concepto, lo ilustraremos con un ejemplo. Analicemos la relación
siguiente para identificar dependencias funcionales:
Para denotar las dependencias que hay en una relación, utilizaremos una notación basada en
flechas, tal y como muestra el ejemplo siguiente:
Para finalizar, notemos que puede haber dependencias en las que podemos prescindir de
algunos de los atributos del determinante.
Decimos que una dependencia funcional X → Y es completa cuando no hay ninguna otra
dependencia X' → Y, siendo X' un subconjunto propio de X.
Ved también
Podéis ver los conceptos previos del modelo relacional en el subapartado 3.1 de este módulo
didáctico.
Por ejemplo, podemos afirmar que {work, composer} → {yearComp}, pero en esta dependencia
podemos prescindir de composer porque {work} → {yearComp} también es verdad. La primera
de las dependencias anteriores no es completa, porque está la segunda y se verifica que {work}
es un subconjunto propio de {work, composer}.
Reflexión
Observad que si en una dependencia funcional X → Y el conjunto X solo tiene un atributo, la
4.3.Teoría de la normalización
El objetivo de la teoría de la normalización es fijar unas condiciones que nos garanticen la
separación de conceptos y la ausencia de redundancia para evitar las anomalías de actualización.
Estas condiciones se basan en gran medida en el concepto de dependencia funcional plena que
acabamos de presentar en el subapartado anterior.
Las anomalías presentes en una relación tienen el origen en dependencias existentes entre los
atributos de la relación. La teoría de la normalización define una serie de niveles
denominados formas normales que eliminan progresivamente determinadas dependencias que
son causantes de diferentes anomalías. Estas formas normales son inclusivas; es decir, si una
relación cumple las condiciones de un determinado nivel, también cumple las condiciones de
todos los niveles anteriores. Cuanto más alto es el grado de normalización, más redundancias se
eliminan y, por lo tanto, menos anomalías se pueden producir.
La teoría de la normalización establece las bases para modificar una relación que no está en una
determinada forma normal con el objetivo de que lo esté. Este proceso de modificación se
denomina normalización. Tal como iremos viendo, una misma relación no normalizada se puede
modificar de varias maneras hasta convertirse en una relación normalizada; es decir, el proceso
de normalización puede tener diversos resultados.
En un primer bloque trataremos las cuatro primeras formas normales, y después presentaremos
un par de algoritmos capaces de normalizar hasta este nivel. Finalmente, veremos las dos
últimas formas normales.
Para ilustrar este concepto, fijémonos en la figura 38, en la que tenemos una relación que
permite incluir información de los compositores.
Debe observarse que la clave primaria de la relación normalizada cambia: tenemos que buscar
la nueva clave a partir de la superclave formada por la composición de la que teníamos antes
(en nuestro caso, composer) con la clave de la subrelación que formaban los atributos no
atómicos (en nuestro caso, work y yearComp que tiene como clave work).
Hay que tener presente que el modelo relacional y los SGBD relacionales ya garantizan esta
primera forma normal en cualquier relación que podamos definir.
Aplanar un atributo no atómico de una relación consiste en sustituir cada tupla por tantas como
Observad que toda relación en primera forma normal que tenga las claves candidatas formadas
por un solo atributo está de manera automática en segunda forma normal: por definición de
clave, todo atributo depende de las claves candidatas y, en el caso de ser de un solo atributo,
seguro que la dependencia es completa.
Como ejemplo de esta problemática, consideremos la relación siguiente, que almacena las obras
que contiene en cada una de las grabaciones (discos, cintas, archivos Mp3, etc.) que tenemos.
Una misma obra (work) puede estar repetida en varias grabaciones (recordings) y una grabación
puede contener varias obras. También se desea guardar el compositor de cada obra (composer)
y los minutos que dura cada obra (durWorkRecord) en una grabación determinada.
Esta relación, que tiene como clave primaria {work, record}, no está en segunda forma normal
porque composer no depende completamente de la clave, puesto que existe la dependencia
{work} → {composer}. El ejemplo nos permite ver con claridad cuál es el objetivo de la segunda
forma normal: impedir que se mezclen dos hechos elementales que comparten parte de la clave
(las grabaciones de las obras que tenemos, por un lado, y los compositores de las obras, por
otro) en una misma relación. De este modo, evitaremos redundancias como la de tener replicado
el compositor de una obra tantas veces como el número de grabaciones que contienen la obra.
Para normalizar una relación a 2FN debemos separar los hechos mezclados que violan la
condición de 2FN en dos relaciones. En el ejemplo que estamos viendo, hay que transformar la
relación Recordings en dos nuevas relaciones:
Como se puede observar, las dos relaciones resultantes se deben relacionar mediante una clave
foránea por medio de la parte de la clave compartida por ambos hechos. Es preciso no confundir
las flechas que representan dependencias con la que representa esta clave foránea.
Esta relación, cuya clave es work, está en 2FN, pero no está en 3FN porque, dada la
dependencia {composer} → {bCentury}, ninguno de estos atributos forma parte de alguna clave
candidata. Con la tercera forma normal evitamos, pues, que se mezclen hechos (quién es el
compositor de una obra y cuándo nació un compositor, en el ejemplo) aunque compartan
atributos que son clave en un hecho (composer, en el ejemplo) y otros que no lo son. De este
modo, evitaremos redundancias, como la repetición del siglo de nacimiento de un compositor
tantas veces como obras del compositor aparezcan en la relación. Para normalizar a 3FN, como
antes, debemos separar el hecho que corresponde a la dependencia que viola la condición de
3FN. Aplicado al ejemplo anterior, obtendremos:
Se trata de una relación similar a la del ejemplo anterior, a la que hemos añadido una nueva
manera de identificar las obras. Ahora lo podemos hacer con un nombre y un código. La relación
presenta redundancia porque repetimos tanto el nombre como el código de cada obra tantas
veces como grabaciones tenga la obra. Cuando se definió la 3FN no se previó una situación
como esta, en la que hay dos claves candidatas compuestas, solapadas y con dependencias
entre partes de estas claves.
Tal y como hemos constatado gráficamente, existen cuatro dependencias en esta relación:
{workCode} → {workName}
{workName} → {workCode}
{workCode, record} → {durWorkRecord}
{workName, record} → {durWorkRecord}
Los determinantes de las dos últimas son claves candidatas de la relación, pero los
determinantes de las dos primeras, no. Por lo tanto, la relación no está en FNBC. La figura 40
muestra una posible extensión de la relación.
Observad que, efectivamente, se pueden producir anomalías. Por ejemplo, si queremos cambiar
el nombre de la Sinfonía 5, tendremos que modificar tres tuplas.
Para normalizar en la FNBC tenemos que eliminar las dependencias cuyo determinante no
constituye una clave candidata. Puesto que hay dos, podemos hacerlo de dos maneras:
Esta forma normal se tuvo que definir (lo hicieron Boyce y Codd en 1974) para corregir algunas
carencias de la 3FN que, cuando Codd la enunció en 1970, pensaba que bastaba para evitar las
anomalías de actualización.
4.3.5.Reglas de Armstrong
Tal y como hemos comentado, vistas las cuatro primeras formas normales, presentaremos dos
algoritmos capaces de normalizar un esquema relacional hasta FNBC. Estos algoritmos se basan
en una serie de propiedades que tienen las dependencias funcionales, que nos permiten deducir
propiedades nuevas a partir de las que ya conocemos. Pongamos por ejemplo la relación que
hemos utilizado para presentar las dependencias funcionales:
Compositions(work, composer, yearComp, bCentury, digitDegree)
Antes hemos mencionado que work es su clave, pero también podríamos haberlo deducido así:
Reflexividad: X → X
Reflexión
Hay que aclarar que este no es un conjunto mínimo de reglas, puesto que algunas se pueden deducir
a partir de las otras. En todo caso, tampoco hay un conjunto mínimo único, sino que podemos elegir
varios conjuntos como axiomas y demostrar las otras reglas a partir de estos axiomas.
Encontrar todas las claves candidatas de las relaciones. Si queremos normalizar hasta
FNBC, esta información es imprescindible.
Confirmar o descartar que dos esquemas lógicos son equivalentes. A partir de las
dependencias conocidas de D1 y D2, se puede decir que D1 y D2 son equivalentes si se
verifica que D 1 + = D 2 + .
Tomando como base algunas o todas estas reglas, se han definido algoritmos de normalización.
A continuación, presentamos dos algoritmos que se pueden ver como una aproximación a la
generación automática de un esquema lógico a partir de los atributos y las dependencias de un
dominio que surgen de una actividad previa equivalente al diseño conceptual de la BD. El primer
algoritmo sigue un enfoque descendente, de descomposición de una relación potencialmente
muy grande que representa toda la información del dominio, mientras que el segundo está
planteado desde un punto de vista ascendente, de agrupación de pequeñas informaciones
elementales.
Reflexión
La normalización hasta FNBC es el grado de normalización mínimo que se requiere si no queremos que
4.3.6.Algoritmo de análisis
La idea del algoritmo de análisis parte de una única relación, denominada relación universal, que
contiene todos los atributos identificados. Utilizando las dependencias que también se deben
haber identificado previamente, el algoritmo secciona repetidamente la relación universal hasta
obtener un conjunto de relaciones normalizado. En cada paso de la partición, se comprueba si
hay alguna relación que no está en la FNBC. Si no se encuentra ninguna, es que hemos
conseguido un esquema normalizado; de lo contrario, se elige una de las relaciones que no
están en la FNBC y se divide en dos usando la dependencia (o una cualquiera, si hay varias) que
viola la FNBC en aquella relación. Este proceso se repite hasta que llegamos a la normalización.
De hecho, el proceso es el que seguimos intuitivamente cuando normalizamos un esquema, con
la diferencia de que habitualmente no partimos de una relación universal sino de un conjunto de
relaciones resultantes de un diseño previo.
4.3.7.Algoritmo de síntesis
En este otro algoritmo, se sigue un enfoque ascendente. Partiendo de múltiples relaciones
pequeñas, el algoritmo las fusiona para encontrar un conjunto de relaciones normalizado y tan
compacto como sea posible. Estas relaciones iniciales provienen de lo que se
denomina recubrimiento mínimo de las dependencias funcionales, que se define como un
conjunto de dependencias más simple a partir del cual se pueden deducir las dependencias
iniciales. El recubrimiento mínimo se genera en tres fases:
1) Desdoblar las dependencias de manera que sólo haya un atributo en la parte derecha.
2) Simplificar los determinantes eliminando atributos superfluos. Podremos eliminar los atributos
que vienen determinados por otros atributos del mismo determinante en virtud de las
dependencias.
Cada una de las dependencias del recubrimiento mínimo da lugar a una de las múltiples
relaciones iniciales; y estas relaciones se van fusionando, agrupando las que comparten una
clave candidata.
{codigoObra, nombreObra} → {compositor, sigloNac}
{compositor} → {sigloNac}
{codigoObra, grab} → {duracionObraGrab}
obtenemos un recubrimiento mínimo siguiendo los pasos que hemos descrito:
2) Los determinantes de las dos relaciones obtenidas se pueden simplificar. El resultado, entre
otros posibles, es {codigoObra} → {compositor} y {codigoObra} → {sigloNac}
Veamos todo esto con un ejemplo: queremos saber qué orquestas y qué obras ha dirigido cada
director. Se trata de dos hechos multivaluados (un director puede haber dirigido muchas
orquestas y puede haber dirigido muchas obras). Si nos imaginamos una relación que admite
atributos no atómicos, podemos pensar en una situación como la que describe la figura 41.
Puesto que sabemos que esto lo podemos imaginar pero no lo podemos definir en un SGBD
relacional, aplanamos la relación para obtener la relación que describe la figura 42. Esta relación
no tiene ninguna dependencia, aparte de la dependencia trivial reflexiva
{conductor, works, orchestras} → {conductor, works, orchestras} y similares.
La relación está, pues, en la FNBC. Está claro, sin embargo, que esconde redundancias que
provocan anomalías. Por ejemplo, si queremos registrar que Claudio Abbado ha dirigido la
Filarmónica de Berlín, tendremos que añadir dos tuplas:
El problema, como en los casos presentados en las formas normales anteriores, es que en una
única relación estamos mezclando dos hechos: las orquestas dirigidas y las obras dirigidas. La
condición que revela esta mezcla de hechos es lo que denominamos dependencia multivaluada
independiente, que definimos formalmente a continuación.
Reflexión
Los hechos multivaluados aparecen con naturalidad en un esquema conceptual como tipo de relación
con multiplicidad *, pero no se pueden representar como atributos multivaluados en el esquema lógico
Reflexión
Observemos que las dependencias funcionales son un caso particular de las multivaluadas en el que
un mismo valor de X solo puede aparecer con un solo valor de Y. Es decir, si {X} → {Y} entonces {X}
→→ {Y}.
Una relación está en cuarta forma normal (4FN) si, y solo si, está en la FNBC y no presenta
dependencias multivaluadas independientes.
Si recapitulamos el proceso que nos ha llevado hasta aquí, recordaremos que todo ha empezado
con unos atributos multivaluados que hemos representado en una sola relación.
Si hubiéramos hecho una traducción sistemática del esquema conceptual, habríamos obtenido
directamente el esquema lógico correcto.
Figura 44. Los tipos de relaciones binarias de donde provienen las relaciones
La traducción de los tipos de relación conductsWork y conductsOrc lleva directamente a las
relaciones normalizadas de la figura 43. La relación no normalizada de la figura 42 podría ser el
resultado de traducir un esquema conceptual diferente, que presentamos en la figura 45.
Sin embargo, entonces no existirían las dependencias multivaluadas porque ahora lo que
queremos es registrar un único hecho ternario: qué obras ha dirigido cada director y con qué
orquesta ha dirigido cada obra. En este caso, la relación Conductions, al no presentar las
dependencias multivaluadas, estaría en 4FN. Y ahora podría tener una extensión como la que se
muestra en la figura 46, que antes no era válida de acuerdo con las dependencias.
Esta relación no presenta anomalías, porque ahora no tiene sentido decir que queremos añadir,
por ejemplo, que Claudio Abbado ha dirigido la Filarmónica de Berlín. Ahora el hecho básico es
que Claudio Abbado ha dirigido la Filarmónica de Berlín interpretando una obra concreta.
Reflexión
Observad que por la definición de dependencia multivaluada independiente, una relación con solo uno
Esto es así porque H. von Karajan ha dirigido la Sinfonía 9 (según la tercera tupla), la OCB ha
interpretado la Sinfonía 9 (según la primera tupla) y H. von Karajan ha dirigido la OCB (según la
cuarta tupla). Por otro lado, añadir esta nueva tupla no implica que la relación deje de estar en
4FN.
En casos así, la relación vuelve a presentar anomalías. Por ejemplo, si un director pasa a dirigir
una nueva obra, por la ley de simetría tenemos que añadir tantas tuplas como orquestas que
han interpretado la obra dirigida por el director. Si intentamos eliminar las anomalías
descomponiendo la relación en dos, tenemos tres opciones de descomposición. Observemos que
ninguna de las opciones es válida:
a) La descomposición siguiente no es válida porque no permite saber qué orquestas han dirigido
los directores (podríamos pensar que Claudio Abbado ha dirigido la Filarmónica de Berlín).
b) La descomposición siguiente no es válida porque no permite saber qué obras ha interpretado
cada orquesta (podríamos pensar que la Sinfónica de Londres ha interpretado la sinfonía 9).
c) La descomposición siguiente no es válida porque no permite saber qué obras han dirigido los
directores (podríamos pensar que Claudio Abbado ha dirigido el concierto para piano 1).
Observemos, pues, que no podemos representar tres hechos con dos relaciones. Sin embargo,
¿qué sucede si tomamos las tres relaciones CondWork, WorkOrc y CondOrc?
Una relación está en quinta forma normal (5FN) si, y solo si, está en 4FN y no presenta
dependencias de proyección-combinación.
De este modo, para saber si una relación que está en 4FN también está en 5FN tenemos que
proyectar y combinar las proyecciones, y a continuación comprobar si obtenemos la misma
relación original. En caso contrario, podemos asegurar que no hay dependencia de proyección-
combinación y que la relación está en 5FN. De lo contrario, tenemos que estudiar si existe una
ley de simetría que suponga que para toda extensión de la relación original, el proceso de
proyección y combinación nos volverá a dar la relación original o si esto solo sucede en algunos
casos.
Si retomamos el caso desde el comienzo, veremos que, si partimos del esquema conceptual
correcto y lo traducimos de manera correcta al modelo relacional, obtendremos directamente el
esquema lógico normalizado.
Cuando no se da la ley de dependencia, estamos ante un tipo de relación ternaria (la que se
muestra en la figura 45), que por tanto, se convierte en una única relación normalizada. Cuando
añadimos la ley de simetría, estamos introduciendo tres tipos de relaciones binarias y una
ternaria que se deriva de las tres binarias, como se muestra en la figura 47.
A partir de este esquema conceptual, debemos traducir, no el tipo de relación derivado (que
daría lugar a la relación que no está en 5FN), sino las tres binarias (que producen las tres
relaciones que sí están en 5FN).
Figura 47. Los tipos de relaciones binarias de donde provienen las relaciones normalizadas y el tipo de
Reflexión
A la vista de la definición, podemos afirmar que una relación con solo uno o dos atributos no puede
4.4.Práctica de la normalización
El proceso de normalización tiene en general efectos beneficiosos para la base de datos y
preserva la semántica del esquema de partida. El proceso siempre es factible y existen
algoritmos que normalizan hasta la FNBC. Un mismo esquema de partida se puede normalizar en
general de más de una manera (tanto si lo hacemos manualmente como si usamos algún
algoritmo), y es trabajo del diseñador elegir la alternativa que más interesa en cada caso.
Los efectos beneficiosos de aplicar las formas normales son la eliminación de redundancias y
anomalías y la clarificación del esquema, al separar los hechos diferentes que quizá se
encuentran mezclados en el esquema inicial.
En general, sin embargo, podemos asumir esta desventaja a cambio de eliminar las anomalías y
facilitar la integridad de la base de datos. Hay, sin embargo, casos o partes de las bases de
datos en los que las actualizaciones son poco frecuentes. En estos casos, el equilibrio entre
ventajas e inconvenientes puede llevarnos a decantarnos por la opción de no normalizar.
Hay que tener presente que este proceso penaliza las actualizaciones de la base de datos y
requiere un diseño muy cuidadoso de las restricciones para garantizar que la base de datos se
mantiene consistente. Se requiere, por lo tanto, un análisis cuidadoso de ventajas e
inconvenientes de la desnormalización en cada caso. Un caso en el que la desnormalización sale
más a cuenta es el de las bases de datos dedicadas solo a consultar datos históricos agregados
por diferentes conceptos.
Resumen
En este módulo hemos estudiado el proceso de diseño lógico como una de las etapas del
desarrollo de una base de datos para un sistema de información. Este proceso parte del
esquema conceptual que hemos obtenido en la fase de especificación y genera como resultado el
esquema lógico de la base de datos.
Hemos empezado el estudio identificando las trampas de diseño, posibles errores que pueden
haberse cometido durante el diseño conceptual y que conviene repasar antes de tomarlo como
punto de partida del diseño lógico.
Glosario
abrazo mortal de carga f
Imposibilidad de insertar tuplas en ninguna tabla de un conjunto de tablas porque las
claves foráneas que contienen forman un ciclo.
anomalía de actualización f
Necesidad de actualizar muchas tuplas para reflejar un cambio elemental.
dependencia funcional f
En una relación, decimos que un conjunto de atributos Y depende de un conjunto de
atributos X (X → Y) si siempre que dos tuplas tienen los mismos valores en los atributos
de X, también tienen los mismos valores en los atributos de Y.
dependencia proyección-combinación f
Decimos que una relación con tres atributos presenta una dependencia de proyección-
combinación si para cualquier extensión correcta de la relación se verifica que, como
resultado de descomponerla en otras tres relaciones de dos atributos (haciendo las
correspondientes proyecciones) y combinar estas tres relaciones a continuación,
obtenemos nuevamente la relación original.
desnormalización f
Proceso consistente en deshacer la normalización agrupando datos lógicamente
independientes o añadiendo redundancia a la base de datos, con el objetivo de hacer
más eficientes las consultas.
determinante m
Conjunto de atributos X de una dependencia funcional X → Y.
diseño lógico m
Proceso de transformación de un esquema conceptual en un esquema lógico de base de
datos.
forma normal f
Decimos que una relación está en una determinada forma normal si satisface las
condiciones fijadas por aquella forma normal. Las formas normales son inclusivas: la
condición de una forma normal de nivel superior implica la condición de cada uno de los
niveles inferiores y, por lo tanto, si una relación está en una forma normal también está
en todas las formas normales de nivel inferior.
normalización f
Proceso por el cual, a partir de un conjunto de relaciones, se obtiene un conjunto de
relaciones equivalente que satisface la condición de la forma normal deseada.
trampa de diseño m
Patrón del esquema conceptual que puede inducir a cometer errores en la interpretación
del mundo real.
recubrimiento mínimo m
Conjunto más simple de otro conjunto a partir del cual se pueden deducir las
dependencias del conjunto original.
reglas de Armstrong f pl
Conjunto de reglas de deducción que permiten demostrar si una dependencia es
consecuencia de otras.
restricción f
Condición que limita las extensiones válidas de una relación.
Bibliografía
Camps, R.; Cassany M. J.; Conesa, J.; Costal, D.; Figuls, D.; Martín, C.; Rius, A.;
Rodríguez, M. E.; Urpí, T. (2011). Uso de bases de datos. FUOC.
Los textos e imágenes publicados en esta obra están sujetos –excepto que se indique lo contrario– a
v.3.0. Se puede copiar, distribuir y transmitir la obra públicamente siempre que se cite el autor y la
fuente (Fundació per a la Universitat Oberta de Catalunya), no se haga un uso comercial y ni obra
http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es
Índice
Introducción
Objetivos
1.Conceptos previos
3.1.3.Estructura de un campo
3.1.4.Gestión de la página
o 3.3.El fichero
4.3.1.Direccionamiento en un SGBD
5.Transformación del modelo lógico en el modelo físico
o 5.1.Tabla
5.1.2.Índice
5.1.3.Restricciones
o 5.2.Espacio para tablas
o 5.3.Base de datos
6.1.1.Los datos
6.3.3.Árboles B+
6.3.4.Dispersión
6.3.5.Índices agrupados
o 6.4.Implementación de los accesos por varios valores
Glosario
Bibliografía
Introducción
El diseño físico de bases de datos constituye la cuarta etapa en el proceso de diseño de una base
de datos. En las etapas anteriores se ha llevado a cabo el análisis de requisitos, el diseño
conceptual y, finalmente, el diseño lógico de la base de datos. En este módulo veremos el
proceso de transformación del modelo lógico, obtenido en la etapa anterior, hacia un modelo
físico que nos permita obtener una implementación sobre un sistema de gestión de bases de
datos (SGBD).
Antes de iniciar esta etapa, hay que seleccionar el SGBD concreto sobre el cual se quiere
implementar la base de datos. En este módulo nos centraremos en las bases de datos
relacionales; por lo tanto, el objetivo es ver el proceso de transformación de un modelo lógico
relacional hacia un modelo físico y concretar un SGBD relacional.
1) En la primera parte veremos cómo hay que estructurar y almacenar la información de la base
de datos en un soporte físico no volátil para que pueda ser recuperada. Presentaremos los
niveles lógico, físico y virtual de las bases de datos (apartados 1, 2, 3 y 4).
2) En la segunda parte de este módulo veremos el proceso de transformación del modelo lógico
relacional hacia el modelo físico, que nos permitirá una implementación sobre un SGBD concreto
de la base de datos (apartado 5).
Objetivos
En los materiales didácticos de este módulo, encontraremos las herramientas indispensables
para alcanzar los objetivos siguientes:
1. Conocer la estructura física que utiliza la base de datos para almacenar los datos de
manera no volátil.
4. Definir los índices necesarios y convenientes en cada tabla para que las aplicaciones
tengan un buen rendimiento cuando accedan a la base de datos.
1.Conceptos previos
La manera más sencilla de explicar una base de datos (BD) es decir que se trata de un conjunto
de datos persistentes relacionados entre sí. La característica de persistencia implica que los
datos no han de desaparecer entre ejecuciones sucesivas de programas, aunque entre estas
ejecuciones transcurra un intervalo de tiempo largo. Este requisito obliga a su vez a tener los
datos entre ejecución y ejecución almacenados en un medio no volátil, normalmente en un disco
magnético.
Para comprender qué relación hay entre los datos tal como los ve el programador o el usuario
final y tal y como están almacenados en el soporte no volátil, utilizaremos una arquitectura de
tres niveles, que denominaremos arquitectura de los componentes de almacenamiento,
representada en la figura 1.
1) El nivel lógico corresponde a todos los componentes que, de una manera más o menos
directa, son conocidos y manipulados por el programador o por el usuario final. Estos
componentes forman la interfaz externa o de usuario del sistema de gestión de la base de datos
(SGBD). De manera muy simplificada, podemos considerar que en el nivel lógico hay un
conjunto de datos estructurados en tablas. De hecho, todos los demás componentes lógicos
giran en torno a las tablas.
2) Las tablas deben ser persistentes; por este motivo se almacenan en un soporte no volátil y
utilizan unas estructuras determinadas, que son los componentes que constituyen el nivel
físico.
Una arquitectura, como cualquier otra manera de esquematizar la realidad, es una herramienta
sencilla y potente ideada para abstraer y entender los rasgos fundamentales de los sistemas más
complejos.
3) Entre los niveles físico y lógico existe un tercero que denominaremos nivel virtual. Este nivel
proporciona al SGBD (1) una visión simplificada del nivel físico, como ya veremos.
Ya conocéis los componentes del nivel lógico. En este módulo presentamos los componentes de
los otros dos niveles, el virtual y el físico, que denominamos conjuntamente componentes de
almacenamiento porque controlan la disposición física de los datos en el soporte no volátil.
Abreviamos sistema gestor de bases de datos con la sigla SGBD.
(1)
Terminología
interaccionan con la base de datos, normalmente mediante sentencias de SQL, y usuario final, a la
persona que interacciona con los datos directamente por medio de una interfaz gráfica.
Ved también
Podéis ver los componentes del nivel lógico en el módulo “Diseño lógico de bases de datos” de esta
asignatura.
2.1.Componentes lógicos
En la figura 1 podemos ver que el componente lógico más importante es la tabla y, para
reflejarlo, la hemos representado con un tramado. El conjunto de tablas es el núcleo
fundamental de la base de datos por dos motivos: es el conjunto de datos disponibles para el
usuario, y es también el conjunto más importante y voluminoso de datos almacenados en los
soportes físicos.
El usuario puede acceder directamente a las tablas o bien puede acceder a estas de manera
indirecta por medio de las vistas; por este motivo, tablas y vistas están agrupadas como el
conjunto de componentes de datos.
Una base de datos tiene, aun así, otros componentes que no son las tablas y las vistas, pero que
están estrechamente relacionados con éstas. Se trata, entre otros, de las restricciones (2) , que
definen ciertas reglas que tienen que cumplir los datos, o los disparadores (3) , los cuales indican
acciones que se tienen que ejecutar si se cumplen ciertas condiciones. Denominamos todos
estos otros componentes conjunto de componentes de control, puesto que en cierto modo
permiten controlar los datos dinámicamente.
También se puede considerar que los índices pertenecen al conjunto de componentes de control,
aunque con un matiz ligeramente diferente, dado que su función fundamental es de
rendimiento: facilitan el acceso a los datos en un tiempo razonable.
En inglés, constraints.
(2)
En inglés, triggers.
(3)
En inglés, files.
(4)
En inglés, extent.
(5)
En inglés, page.
(6)
3.1.La página
Para entender qué es una página de una BD (7) o de un SGBD, no partiremos de una definición,
sino de una descripción de lo que es una página en una BD desde dos puntos de vista diferentes,
aunque complementarios:
Los datos se almacenan en dispositivos externos pero, por otro lado, sabemos que para
efectuar cualquier operación tienen que estar presentes en la memoria principal del
ordenador. Debe haber, pues, un transporte de datos entre la memoria externa (que
normalmente es un disco) y la memoria interna (o memoria principal). Este transporte
se hace empleando una unidad discreta de transporte de datos que en los SO (8) se
denomina bloque y en los SGBD recibe el nombre de página.
Concretando, diremos que la página es la unidad mínima de acceso y transporte del sistema de
entrada/salida (E/S) de un SGBD, lo cual la hace ideal para ser a su vez la unidad de
organización más importante de los datos almacenados.
Observad que en la definición anterior hemos definido la página como “unidad mínima de acceso
y transporte”. La razón es que, del mismo modo que nunca se accede a menos de una página, sí
que se puede acceder al mismo tiempo a un número entero de páginas consecutivas. Esta
cuestión, que veremos más adelante, no invalida la explicación que hemos dado hasta ahora de
la página ni su importancia dentro de la arquitectura de componentes. Se trata sólo de una
opción de rendimiento del sistema.
Que la página sea la unidad de organización del nivel físico no significa que no tenga su propia
estructura interna. De hecho, en una página hay diferentes componentes. A estos componentes
que hay en el interior de la página sólo pueden acceder las rutinas del SGBD, una vez la página
ya está en la memoria principal del ordenador. En cambio, a la página como unidad accede (para
leer y escribir) el subsistema de E/S (9) del SO de la máquina.
Abreviamos la expresión entrada/salida con la sigla E/S.
(9)
Un símil artístico
Imaginad que la página es un cuadro. El SGBD sería entonces el pintor; es quien ve el interior del
cuadro y lo llena (lo pinta). Una vez listo, lo envuelve y llama a su mozo (el sistema operativo), que
La página es de longitud fija. Hay SGBD que permiten elegir el tamaño de la página entre un
pequeño repertorio. Otros solo tienen un tamaño único. La estructura de la página, que se
muestra en la figura 2, es muy similar en todos los SGBD.
Una página consta de los elementos siguientes, enumerados desde la dirección más baja de la
página hasta la más alta:
b) Un cierto número de registros, que aquí denominaremos filas porque corresponden a las filas
de las tablas del nivel lógico. Este número puede variar con el tiempo, y en un momento
concreto puede ser igual a cero.
c) Un espacio libre.
Los valores más corrientes del tamaño de una página actualmente son 2 kB, 4 kB y 8 kB.
d) Un vector de direcciones de fila (VDF), que tiene tantos elementos como filas hay en la
página. Cada elemento del VDF (10) contiene la dirección de una fila dentro de la página (apunta a
la fila). El elemento que ocupa la posición de dirección más alta en el VDF apunta a la fila que
ocupa la dirección más baja en la página, tal y como podéis ver en la figura 2. La fila siguiente
(a continuación de la primera) está apuntada por el elemento del VDF a la izquierda del primer
elemento.
Así pues, las filas se van colocando de izquierda a derecha en el orden creciente de las
direcciones dentro de la página, mientras que los elementos del VDF se van colocando de
derecha a izquierda desde la posición más alta y siguiendo en el orden decreciente de las
direcciones. De este modo, el espacio libre siempre queda hacia la mitad de la página.
Así pues, en cuanto a filas y campos, la correspondencia entre el nivel lógico y el físico es muy
directa.
Es posible que el SGBD necesite guardar alguna información de control en lo que respecta a la
fila y, por este motivo, antes de la secuencia de campos encontramos una cabecera de fila.
Podéis ver la estructura de la fila en la figura 3.
Normalmente, las filas de una tabla son de longitud inferior al tamaño de las páginas y por este
motivo caben en las mismas perfectamente. De todos modos, si la longitud de la fila es superior
a la de la página, los SGBD parten la fila en trozos. Cada trozo se almacena en una página
diferente y apunta al trozo siguiente, como podéis observar en la figura 4.
3.1.3.Estructura de un campo
Hemos visto que una página está formada por filas y que una fila está formada por campos. Un
campo de una fila de una tabla (nivel lógico) se almacena como uno de los campos de la fila
dentro de la página (nivel físico).
Un campo normalmente está formado por una cabecera y un contenido, tal como indicamos en
la figura 5.
Figura 5. Estructura de un campo
La cabecera del campo permite guardar ciertas características del campo, como por ejemplo:
b) La longitud del campo, también en un momento concreto. Esta información es necesaria
cuando el campo se ha definido con un tipo de dato de longitud variable, como por ejemplo el
tipo CHARACTER VARYING.
El contenido del campo es el resultado de almacenar el valor del campo según las normas de
codificación de cada SGBD en cada arquitectura de máquina concreta. A continuación,
encontraréis el formato de almacenamiento de los tipos de datos más comunes en los diferentes
SGBD:
CHARACTER VARYING
CHARACTER VARYING es el nombre del estándar SQL:1999 para el tipo de dato “cadena de caracteres
Bytes codificados en código ASCII o bien en el código que utilice la máquina donde funciona el
(11)
SGBD.
Los SGBD intentan ahorrar espacio en el disco y tiempo de proceso siempre que sea posible. Por esto,
si el campo no admite nulos y es de longitud fija (por ejemplo, CHAR(3)), entonces esta información
no es necesaria y podemos prescindir de la cabecera. En este caso, el campo ocupa solo el espacio
3.1.4.Gestión de la página
Después de ver cómo se organiza el espacio de una página y cuáles son sus contenidos,
describiremos brevemente las principales operaciones que un SGBD hace de este espacio y estos
contenidos. Son las siguientes:
1) Formateo de una página. Cuando el SGBD necesita más espacio dentro de un fichero para
almacenar datos, adquiere una nueva extensión. Las páginas de esta extensión se formatean, es
decir, se inicializan de una manera adecuada para que posteriormente las utilice el SGBD.
La inicialización consiste fundamentalmente en escribir la cabecera y dejar el resto de la
página como espacio libre.
2) Carga inicial de filas. Si la extensión inicializada se utiliza para una carga inicial o masiva
de filas de tablas, el SGBD empieza a usar el espacio libre de la página de la manera siguiente:
La primera fila se coloca detrás de la cabecera, se crea un elemento del VDF que apunta
a esta fila y se coloca al final de todo de la página.
De este modo el espacio libre va disminuyendo, pero siempre ocupa un lugar en torno al centro
de la página. El administrador de la base de datos (DBA (12) ) normalmente habrá fijado un tanto
por ciento de espacio libre mínimo que el SGBD tiene que respetar en una carga masiva de filas.
Esto significa que, cuando el proceso de carga detecta que el espacio que queda libre en una
página es precisamente este espacio libre mínimo, ya no coloca más filas y empieza a hacerlo en
la página siguiente.
La finalidad de esta limitación es dejar un cierto espacio libre en todas las páginas para que sea
aprovechado para las operaciones que veremos a continuación.
administrator.
Administrador de la BD
3) Alta posterior de una nueva fila. Para añadir una fila a una tabla de la BD, el SGBD en el
nivel físico localiza primero la página donde tiene que añadir la fila. Esta página se
denomina página candidata. Una vez el SGBD sabe cuál es la página candidata, utiliza el espacio
libre disponible en la página para colocar la fila y dejarla apuntada por un nuevo elemento del
VDF. La fila y el elemento del VDF se colocan según el criterio explicado anteriormente.
Puede llegar un momento en el que ya no quede espacio libre suficiente en la página candidata
para colocar la fila. Entonces, la fila se coloca en otra página según algoritmos propios de cada
SGBD.
4) Baja de una fila. La baja de una fila consiste en liberar el espacio ocupado por la fila y el
elemento del VDF. En este momento, o más adelante, el SGBD reorganiza la página para que el
espacio liberado por la baja se una al resto del espacio libre de la página. Habrá un
desplazamiento de filas y de elementos del VDF para que la estructura de la página continúe
siendo tal y como hemos descrito anteriormente.
5) Cambio de longitud de una fila. Un cambio de longitud de una fila puede afectar de tres
maneras a la reorganización del espacio de la página:
a) Si el cambio tiene como resultado una disminución de la longitud de la fila, el espacio liberado
se unirá al espacio libre según el mecanismo que acabamos de explicar.
b) Si, por el contrario, da lugar a un aumento de la longitud y el espacio extra requerido está
disponible en forma de espacio libre dentro de la página, la fila quedará en su lugar ocupando
más espacio y las filas que la siguen se desplazarán hacia la derecha (hacia direcciones más
altas).
c) En caso de que la necesidad de espacio no se pueda servir a partir del espacio libre de la
página, esta fila se traslada hacia otra página que disponga de espacio suficiente. En la página
original y en la posición original se crea una dirección que apunta hacia la nueva posición de la
fila, como se indica en la figura 6.
Como en el caso de las filas que ocupan más de una página, no os preocupéis tampoco si no
acabáis de entender, a partir de la figura, la manera como se apunta a la fila que se ha
trasladado de la página original a la nueva. Lo veréis más adelante.
Reflexión
Las diferentes formas de localizar una página quedan fuera del alcance de este módulo.
En efecto, dejando los índices aparte, todos los demás componentes (vistas, restricciones,
disparadores, etc.) son definiciones que alguien ha proporcionado al SGBD mediante el lenguaje
SQL. Estas definiciones, como explicamos más adelante, se guardan en unas tablas diseñadas
especialmente para contenerlas, pero que a todos los efectos que aquí nos interesan son tablas
como las que contienen los otros datos. Así pues, una vez en el nivel físico, todo lo que hemos
visto hasta ahora es válido para las tablas que contienen estos componentes.
Los índices son un caso ligeramente distinto, y también lo son las tablas con datos del tipo
objeto grande. La estructura del bloque que utilizan es similar, pero varía su contenido.
Reflexión
Queda fuera del alcance de este módulo el estudio en profundidad de los diferentes tipos de páginas.
3.2.La extensión
Una extensión es un número entero de páginas, en principio consecutivas, que el sistema
operativo adquiere a petición del SGBD cuando éste detecta que necesita más espacio para
almacenar datos. Esta adquisición es automática (sin intervención humana explícita).
Es importante notar que cuando a petición del SGBD, el SO gestiona los datos en el soporte no
volátil de los periféricos, lo hace siempre dentro del marco de un fichero. Así, la adquisición de
una extensión también tiene lugar dentro de este marco. Esto significa que cuando se detecta
que falta espacio en un fichero, se adquiere una extensión para este fichero. La extensión está,
pues, asociada a un fichero, es parte de él. Y el fichero es, entre otras cosas, un conjunto de
extensiones.
Las páginas de una extensión deben ser físicamente consecutivas. Si el SO no las puede asignar
porque físicamente no están en el dispositivo, seguirá estrategias diferentes.
La razón principal por la cual las páginas en una extensión deben ser contiguas es que, de este
modo, los componentes que son lógicamente consecutivos (por ejemplo, las filas de una tabla)
se pueden almacenar de manera consecutiva y se pueden recuperar del mismo modo, y así se
favorecen los tratamientos que impliquen la recuperación consecutiva de todos los componentes
(tratamientos que son frecuentes en las BD relacionales).
Por otro lado, los mecanismos más avanzados de mejora de rendimiento que encontraréis
esbozados en el subapartado que nos da una visión general de la E/S en un SGBD, tienen
sentido sólo si las páginas sobre las que actúan son consecutivas.
Algunas de las estrategias que utiliza el SO cuando no puede asignar páginas físicamente consecutivas
son, por ejemplo, partir la extensión en trozos o devolver un aviso que indique que no hay suficiente
espacio.
3.3.El fichero
El fichero es la unidad que usan los SO para gestionar el espacio en los dispositivos periféricos.
También es un conjunto de extensiones.
De todos modos, los ficheros están siempre presentes en el almacenamiento: los distintos datos
de las BD están en las páginas; éstas se agrupan en extensiones, y estas últimas, en ficheros.
En resumen, podemos decir que el fichero es para el SGBD un conjunto de páginas que se han
ido creando de extensión en extensión.
Extensiones de un fichero
Normalmente, los SGBD permiten definir dos tipos de extensiones. Una se denomina extensión
primaria y la otra, extensión secundaria. Estas dos extensiones pueden ser –y normalmente
lo son– de longitud diferente, pero ambas son un múltiplo de la página.
Cuando un fichero necesita espacio por primera vez, se adquiere el número de páginas
correspondientes a la extensión primaria. A partir de este momento, las extensiones sucesivas
que se vayan necesitando en este fichero adquirirán el número de páginas de la extensión
secundaria. Para un fichero solo hay una extensión primaria (la primera), pero hay varias
secundarias (las siguientes). El número máximo de extensiones secundarias lo fija el sistema
operativo o el SGBD, y suele ser una potencia de dos (16, 128, 256, etc.).
Para leer datos, por ejemplo, el SO desencadena una operación de E/S para llevar hacia la
memoria principal el bloque que contiene los datos que se necesitan. Este bloque es una unidad
físicamente delimitada y direccionable en el conjunto de los datos grabados en el soporte no
volátil (el disco magnético). Después, el bloque viaja por el canal que une el periférico con la
unidad central del ordenador y, finalmente, el bloque se coloca en la memoria principal y puede
ser tratado por los programas.
En el caso de los SGBD, este mecanismo, aunque básicamente es el mismo, es algo más
elaborado. Tiene unas características propias que muestra la figura 8 y que describimos a
continuación:
b) La optimización del tiempo de E/S, que permite ofrecer tiempos razonables de procesamiento
cuando se tratan cantidades importantes de datos, es otra característica de los SGBD. Los
diferentes SGBD han elaborado distintos mecanismos, algunos bastante sofisticados.
Mencionamos brevemente algunos:
Aprovechar la operación física de E/S para leer y llevar a la memoria más de una página
consecutiva a la vez, lo cual ahorra tiempo de transporte por unidad leída (página).
Recordad
Cuando hemos definido la página habéis visto que, a pesar de que normalmente es la unidad de E/S,
muchas veces, por razones de rendimiento, el SGBD puede leer o escribir un número entero de
c) Las técnicas de transmisión simultánea de varias páginas en una sola operación de E/S
implican la necesidad de dedicar una parte de la memoria principal del ordenador a recibir,
gestionar y almacenar páginas de las BD. Esta memoria, gestionada por las rutinas adecuadas
del SGBD, se denomina memoria intermedia (13) y está estructurada como un conjunto
de unidades de memoria intermedia (14) .
Cada unidad de memoria intermedia es un trozo de memoria que actúa como marco para
contener una página. El conjunto de todas estas unidades puede ser bastante grande, y
dimensionarlas correctamente es uno de los principales factores de refinamiento del rendimiento
de una instalación con SGBD.
Finalmente, para ilustrar las funciones propias de el SGBD y las del sistema operativo a la
entrada/salida, pasamos a comentar la figura 9.
Observamos que el SGBD se sirve del SO para ciertas funciones. Cuando el SGBD detecta la
necesidad de tratar una página que no tiene en la memoria intermedia, hace una petición a las
rutinas de gestión de E/S del sistema operativo para obtenerla. Estas rutinas son las que
gestionan la lectura física de la página y la sitúan en una unidad libre del conjunto de las
unidades de memoria intermedia. A continuación, el SGBD trata la página, puesto que es quien
conoce su organización y sus contenidos.
En inglés, buffer pool.
(13)
En inglés, buffers.
(14)
a) Hay tablas muy grandes que nos interesará fragmentar y almacenar cada fragmento en un
dispositivo diferente con el fin de mejorar el acceso a los mismos.
b) Por el contrario, podemos encontrar un conjunto de tablas muy pequeñas y que convenga
guardarlas todas en un mismo fichero para no consumir tantos recursos del sistema.
c) Cada vez más se usan tablas que, además de campos con datos de tipo tradicional
(cantidades numéricas, cadenas de caracteres que representan nombres y direcciones, fechas,
etc.), tienen otros que almacenan tipos de datos diferentes, como por ejemplo gráficos,
imágenes o algunos minutos de audio o de vídeo. Estos datos, que necesitan muchos más bytes
para ser almacenados, son los objetos grandes y que interesa almacenar en ficheros diferentes
de los que se emplean para los datos tradicionales, para mejorar los tiempos de acceso.
d) A pesar de que hasta ahora sólo hemos mencionado las tablas, todos sabéis que hay otros
componentes, como por ejemplo índices, definiciones de disparadores, etc. Al igual que en el
punto anterior, seguramente interesará almacenar cada componente en ficheros estructurados
de manera distinta, para obtener el máximo rendimiento de ellos.
Todos estos ejemplos tienen que advertirnos de que resulta bastante útil disponer de un nivel
intermedio. Nos proporciona un grado elevado de flexibilidad (o independencia) para asignar
componentes lógicos a los componentes físicos, puesto que no hay que hacerlo de una manera
estrictamente biunívoca (una tabla, un fichero). Concretamente, nos permite decidir dónde se
almacenará cada tabla o fragmento. De este modo, elegimos en qué máquina, disco o trozo de
disco tendremos los diferentes datos de la base de datos.
Recursos limitados
El interés por no querer consumir más recursos de los imprescindibles reside en el hecho de que hay
Los diferentes SGBD comerciales otorgan distintos nombres a este componente, entre los cuales
los más empleados son dbspace y tablespace. También cabe decir que la funcionalidad que
veremos implementada para el espacio virtual es una simplificación de la realidad de muchos
SGBD comerciales, los cuales utilizan una estructura algo más compleja en este nivel virtual.
Aun así, la idea del nivel virtual es simple y se puede explicar correctamente a partir de un único
componente, el espacio virtual, que describimos a continuación.
Normalmente, en todos los SGBD una tabla se asocia a un único EV. Por el contrario, un EV
puede estar asociado a una o más tablas. Por otro lado, la asociación entre EV y fichero suele
ser de muchos a muchos: un EV se asocia a uno o más ficheros y un fichero se corresponde uno
o más EV.
La asociación entre tabla y EV se hace en tiempo de definición de la tabla. Junto con otros
atributos, se indica con qué EV la asociamos. El espacio virtual también se debe definir y, al
definirlo, se mencionan el fichero o los ficheros con los cuales lo asociamos.
La figura 10 muestra una base de datos de ciudadanos (Citizens). En este ejemplo podemos ver
la asociación entre el nivel lógico (con dos tablas: Persons y Cities) y el nivel físico (con tres
ficheros: Persons1, Persons2 y Cities1) por medio de dos espacios virtuales
(EV_Persons y EV_Cities).
El espacio virtual de agrupación es un tipo de espacio virtual al que se asocian dos o más tablas y que
se corresponde con un único fichero. Este tipo de espacio virtual permite tener los datos de tablas
relacionadas en un mismo fichero, así como tener la combinación (operación de JOIN) preconstruida
en el disco. Este tipo de espacio virtual tiene sentido si el acceso a las tablas se hace siempre
Las únicas páginas que realmente existen son las del nivel físico, agrupadas en extensiones y
almacenadas en ficheros. Ahora bien, estas páginas no deben estar necesariamente ordenadas
en el soporte físico. Incluso páginas que contienen elementos que en el nivel lógico son
consecutivos (por ejemplo, las filas de una tabla) pueden estar separadas unas de otras en el
nivel físico (por ejemplo, ocupando extensiones diferentes); en algunos casos, el resultado de la
combinación de varias tablas se puede almacenar en un espacio virtual, si conviene tenerlo
precalculado.
La estructura de un espacio virtual es similar a la de otros mecanismos que ya conocéis, como por
ejemplo:
a) La correspondencia que hay en un ordenador entre memoria virtual y memoria real.
b) Las vistas del modelo relacional. Los datos de una vista son los que realmente existen en una o
más tablas, pero dispuestos de otro modo, sin que esto represente una duplicación de estos datos.
Como veremos enseguida, es conveniente que las páginas estén ordenadas ocupando posiciones
consecutivas. Dado que esto físicamente no siempre es posible, los SGBD implementan una
ficción, que es lo que denominan espacio virtual.
El espacio virtual está constituido por las imágenes de las páginas reales (imágenes que
denominaremos páginas virtuales) ordenadas secuencialmente y situadas de manera contingua
(sin saltos en medio).
Así pues, podemos definir el espacio virtual como una secuencia de páginas virtuales que se
corresponden una por una con páginas reales del nivel físico.
Observad que las distintas páginas que contienen, por ejemplo, las filas de una tabla, están
distribuidas entre extensiones diferentes de ficheros distintos. El EV es una ficción para ver y
tratar todas estas páginas como si estuvieran ordenadas de manera consecutiva.
En la figura 12 representamos con más detalle y mediante un ejemplo la relación que hay entre
los tres niveles de la arquitectura que hemos visto hasta ahora.
En el nivel lógico, tenemos la tabla Student con sus filas. Esta tabla se almacena en páginas de
datos en el nivel físico. Por la manera como se ha ido creando la tabla y por la disponibilidad de
espacio libre en el disco, puede haber sucedido que no todas las filas de la tabla hayan quedado
en páginas consecutivas. Observamos que las páginas que contienen estas filas pertenecen a
dos extensiones diferentes, separadas por otra extensión que puede ser de otro fichero y,
evidentemente, puede contener otros datos.
4.3.1.Direccionamiento en un SGBD
Ahora estamos en condiciones de analizar cómo es el direccionamiento en un SGBD.
En el nivel lógico, el usuario manipula tablas, filas y campos. Estos componentes están
almacenados en ficheros. ¿Cómo encuentra el SGBD uno de estos componentes en el nivel
físico? ¿Cómo lo direcciona? Responderemos a esta pregunta en dos pasos, puesto que en
realidad hay un direccionamiento doble, que se corresponde con la arquitectura que hemos
estado viendo y que se ilustra en la figura 13.
Puesto que la unidad más pequeña que dirige de manera explícita un SGBD es la fila, lo que
hace realmente el SGBD es encontrar las filas dentro del espacio virtual. El direccionamiento del
SGBD es, pues, del nivel lógico al nivel virtual.
Una vez la fila está en la memoria, el SGBD, dado que conoce su estructura, puede localizar todos sus
Para localizar las filas en el EV, los SGBD utilizan una dirección que
denominaremos identificador de fila (RID). El RID, como podemos ver en la figura 14, tiene
dos partes diferenciadas:
el número de la página que contiene la fila dentro del espacio virtual asociado a la tabla
a la cual pertenece la fila,
a) Una fila, una vez dada de alta en una página, no puede cambiar de página mientras esté
viva, puesto que su dirección también cambiaría. Dado que esta dirección puede estar guardada
en más de un lugar de la base de datos, interesa no hacer este cambio para evitar el
mantenimiento inútil y costoso de otras estructuras de datos (por ejemplo, en los índices que se
hayan construido sobre esta tabla).
b) En cambio, una fila se puede desplazar dentro de su página original. Cambiando solo el
contenido del elemento de VDF correspondiente (que indica el desplazamiento dentro de la
página donde empieza la fila), tendremos siempre la fila correctamente direccionada, y esto sin
ningún cambio en su RID. Por esto, es posible una gestión del espacio libre de una página sin
cambios en los RID de las filas de esta página. La gestión de espacio libre, como ya habéis visto,
tiende a agrupar todo el espacio libre de una página y, para ello debe desplazar filas dentro de la
página.
c) Por el mismo motivo que mencionábamos en el punto a, si una fila aumenta su longitud de
manera que no cabe en su página original y se tiene que colocar en otra página, ya hemos visto
que en la página original se mantiene una dirección, que es un RID, el cual desde la página
original apunta a la nueva página. Así pues, los RID almacenados en otras estructuras, como los
índices que apuntaban a la fila, la continúan encontrando sin que se hayan tenido que modificar.
Ahora ya habréis podido comprender que las direcciones o apuntadores que hemos mencionado
en puntos anteriores de este módulo son en realidad RID. Es el caso de las filas demasiado
largas que no cabían en una página (que se han partido en trozos y cada trozo apunta al
siguiente) o bien el de las filas que crecen de longitud (que se tienen que trasladar a otra página
y se les apunta desde la página original).
De este modo, el SGBD pide al SO que le lea/guarde una página concreta y este lo hace
empleando una dirección muy diferente del RID. Por lo tanto, en este paso hay una
transformación de direcciones: del RID a una dirección física que depende de la arquitectura del
dispositivo.
Antes de acabar el tema del direccionamiento, podemos reflexionar sobre la utilidad del
direccionamiento propio de los SGBD, el RID.
Al prescindir de muchos de los detalles del nivel físico, un direccionamiento como el RID permite
que el SGBD pueda emplear más de un tipo diferente de dispositivos de almacenamiento, puesto
que las diferencias son gestionadas en otro nivel y por otro componente (normalmente, el
sistema operativo). Este mecanismo simplifica los SGBD y aumenta su potencia, puesto que les
proporciona la independencia de los dispositivos físicos concretos.
Y finalmente, no debemos olvidar que el nivel virtual es el que posibilita, por medio del EV, el
direccionamiento de tipo RID.
según las implementaciones de cada SGBD. Por ejemplo, en el caso de Oracle recibe el nombre
de ROWID.
El estándar SQL incorpora la definición de todos los componentes del diseño lógico de la base de
datos. En cambio, no incorpora ningún elemento del diseño físico.
En la transformación del modelo lógico en el modelo físico, seguiremos los pasos siguientes:
1) Transformar las tablas con las correspondientes claves primarias, claves foráneas y claves
alternativas, a partir del diseño lógico de la base de datos que hemos obtenido en el paso
anterior.
2) A continuación relacionamos cada tabla con un espacio para tablas, y cada índice con un
espacio para índice. Es el nivel virtual.
3) Para terminar, relacionamos cada espacio virtual con un fichero físico y definimos sus
características. Esto constituye el diseño físico de la base de datos.
De manera adicional es preciso completar esta definición con los índices necesarios para
garantizar un acceso correcto a los datos, además de las restricciones necesarias sobre los datos
(valores nulos, valores únicos de los campos, etc.).
5.1.Tabla
La tabla es un componente del diseño lógico de la base de datos y, como tal, está definida en el
estándar SQL. Ahora bien, es importante remarcar que la parte que afecta al nivel virtual y físico
no está incluida en el estándar y, por lo tanto, cada SGBD implementa estas funciones de
manera diferente.
La sentencia CREATE TABLE de todos los SGBD incorpora las cláusulas del estándar SQL y,
además, el enlace con los elementos físicos propios de cada uno.
1. CREATE TABLE table_name
2. ( column_definition )
3. <unique_constraint>
4. <referential_constraint>
5. <check_constraint>
6. <extent_specs>
7. TABLESPACE table_space_name
A continuación, veremos con más detalle las definiciones relativas a clave primaria y clave
alternativa, índice y algunas de las restricciones más relevantes.
Como ya sabemos, la clave primaria tiene que ser obligatoriamente una clave única y que no
admita valores nulos. La teoría del modelo de bases de datos relacionales sugiere que cada tabla
debería tener una clave primaria que identificara de manera unívoca la entidad que describe. A
pesar de esto, el estándar SQL no obliga a la existencia de una clave primaria en cada tabla,
sino que es opcional. Lógicamente, sin embargo, cada tabla puede tener como máximo una
clave primaria.
El resto de las claves únicas y que no admiten valores nulos son claves alternativas a la clave
primaria. Esto tampoco está legislado en el estándar SQL.
5.1.2.Índice
Los índices son unos elementos del diseño físico de la base de datos que tienen como finalidad
mejorar el rendimiento de las aplicaciones cuando acceden a las tablas. Los índices no forman
parte del diseño lógico de la base de datos y, por lo tanto, no están incluidos en el estándar SQL.
Aun así, la sentencia CREATE INDEX está presente en todos los SGBD con opciones muy
similares. A continuación, veremos el detalle de esta sentencia sobre el SGBD Oracle. Además,
incorpora cláusulas para definir el espacio para índices y cláusulas de enlace con los elementos
físicos propios (los ficheros de índices).
Donde:
5.1.3.Restricciones
A continuación, veremos algunas de las principales restricciones que podemos definir sobre los
atributos de las tablas y cómo se implementan en el SGBD de Oracle.
Estas restricciones nos permiten definir una lógica que nos ayude a validar los datos de nuestro
modelo, de manera que cumplan determinadas condiciones.
Algunos ejemplos típicos que podemos resolver mediante estas restricciones son:
Por ejemplo, podemos definir una tabla con información sobre trabajadores, que contenga como
atributos el nombre y el sueldo. Evidentemente, el sueldo debe ser positivo. Para indicarlo, en la
creación de la tabla utilizamos la restricción CHECK.
b) Not null
Esta restricción permite definir atributos que deben contener información obligatoriamente, es
decir, que deben contener datos. Indicamos esta restricción en el SGBD por medio del
parámetro NOT NULL.
c) Unique
Esta restricción posibilita validar que no existen valores duplicados en un determinado atributo.
Permite definir las claves candidatas.
Continuando con el ejemplo anterior, esta restricción nos permite definir que cada trabajador
debe tener un identificador único (por ejemplo, el DNI en el caso de España), el cual debe ser
único para cada persona.
Esta restricción permite crear claves foráneas que referencian atributos de otras tablas.
Por ejemplo, si queremos crear una tabla que contenga los departamentos de la empresa
(Department) e indicar a qué departamento pertenece cada trabajador (Employees), será
preciso crear la nueva tabla y añadir un atributo que referencie la nueva tabla para cada registro
de la tabla Employees.
Donde:
table_space_name es el nombre del espacio para tablas, que se define con esta
sentencia y que está relacionada con la cláusula TABLESPACE de la sentencia CREATE
TABLE.
Cada espacio para tablas se asocia a uno o más ficheros físicos <filespec>.
La definición del fichero físico viene dada por su nombre externo file_name, su ubicación
en disco y su tamaño, size.
5.3.Base de datos
Como en el caso del espacio para tablas, la base de datos no pertenece al diseño lógico de la
base de datos y, por lo tanto, tampoco está incluida en el estándar SQL.
Donde:
Los ficheros físicos que contienen los espacios para tablas se relacionan en la
cláusula DATAFILE < filespec >.
La cláusula LOGFILE <filespec> especifica el nombre de los diarios que se definen para
que el gestor registre todas las actualizaciones de las tablas de esta base de datos y
posibilitar, así, su recuperación en caso necesario.
En el siguiente ejemplo crearemos una base de datos para una universidad, con unos diarios
(logfiles) de 10 MB cada uno y con unos límites de 5 logfiles y 100 datafiles.
Inicialmente, veremos de manera breve los diferentes métodos de acceso a los datos. A
continuación, profundizaremos en el estudio de los métodos de acceso por posición, por valor y
por varios valores. Finalmente, veremos cómo implementa estas funciones el SGBD Oracle.
Reflexión
modificación.
6.1.1.Los datos
En este subapartado, para presentar los métodos de acceso a los datos de manera
comprensible, supondremos siempre que los datos a los que hay que acceder se perciben según
la visión que proporciona el nivel virtual, y no según la del nivel físico. Así pues, casi siempre
que en este módulo se emplea la palabra página tenemos que interpretar que nos referimos a
páginas virtuales; si nos referimos a páginas reales, lo mencionaremos de manera explícita.
Con objeto de simplificar, también supondremos que todos los accesos se hacen a datos
almacenados en una sola tabla, situada en un único EV. Así pues, no consideramos los casos en
que es necesario combinar datos de tablas (y espacios) diferentes para obtener los datos a los
que queremos acceder.
Estos tipos de acceso simples son suficientes para casos en los que solo haya que efectuar
consultas y actualizaciones muy sencillas en la BD.
Esta actualización se puede efectuar fácilmente. El SGBD tiene grabado el número de la primera
página del espacio con capacidad de absorber nuevas filas. Entonces, se usa el acceso directo
por posición para insertar el empleado en la página mencionada (añadiendo la fila
correspondiente al empleado nuevo).
En la base de datos anterior podríamos realizar una consulta para recuperar los datos de todos
los empleados, como por ejemplo la siguiente:
Para resolver esta consulta, el SGBD puede utilizar el acceso secuencial por posición, mediante
el cual el SGBD va obteniendo todas las páginas que contienen las filas de los empleados. De
este modo, puede proporcionar los empleados en el mismo orden en que los obtiene. Observad
que la consulta no requiere ninguna ordenación particular de los empleados y, entonces, el
SGBD los puede proporcionar en el mismo orden en el que están almacenados.
Los accesos por posición son viejos conocidos. El acceso secuencial y el acceso directo por posición se
utilizan también en la tecnología de los ficheros. En concreto, el fichero secuencial ofrece el acceso
secuencial por posición y el fichero relativo ofrece tanto el acceso directo por posición como el acceso
El acceso directo por valor consiste en obtener todas las filas que contienen un valor
determinado por un atributo.
El acceso secuencial por valor consiste en obtener varias filas por el orden de los valores de
un atributo.
Sentencia 1:
Sentencia 3:
Observad que en los tres ejemplos hay que buscar las filas de los empleados que tienen un
número de despacho (officeNum) determinado, para mostrarlos, modificarlos o borrarlos,
respectivamente. Es decir, en los tres casos hay que hacer búsquedas de un valor por un
atributo determinado.
De estos ejemplos, se deduce que el acceso directo por valor es necesario para ejecutar
consultas y actualizaciones sobre filas que contienen un determinado valor de un atributo.
Sentencia 1:
Sentencia 2:
Sentencia 3:
Sentencia 4:
En todos estos ejemplos, es necesario conseguir algunas filas de la tabla de empleados en una
secuencia ordenada por el atributo officeNum.
En la primera de las sentencias hay que obtener los empleados ordenados por el número de
despacho, debido a la cláusula ORDER BY officeNum. Para ejecutar las tres sentencias restantes
también debe disponer del acceso secuencial por valor, aunque la causa es quizá menos
evidente. La cláusula WHERE officeNum >= 100 AND officeNum <= 300 implica que sea
necesario localizar todos los empleados que tienen un número de despacho entre el 100 y el 300
para consultar los datos, modificarlos o borrarlos, respectivamente. Una manera de localizar
todos los empleados es disponer de algún mecanismo de acceso a cada uno de ellos por orden
de número de despacho a partir del valor 100 y hasta el 300. Este mecanismo es el acceso
secuencial por valor.
De los ejemplos anteriores, se desprende que el acceso secuencial por valor se utiliza para
ejecutar consultas en las que el resultado debe estar ordenado por un atributo y para consultas
o actualizaciones que afecten a un conjunto de filas que contienen el valor de un atributo que se
encuentra dentro de un rango determinado de valores.
Sentencia 1:
1. SELECT *
2. FROM Employees
3. WHERE officeNum = 150 AND salary = 2000;
Sentencia 2:
1. SELECT *
2. FROM Employees
3. ORDER BY officeNum, salary;
Sentencia 3:
1. DELETE *
2. FROM Employees
3. WHERE officeNum >= 100 AND salary >= 1800;
En estos ejemplos, se accede a los datos según los valores de dos atributos: el
atributo officeNum y el atributo salary. La primera sentencia corresponde a un acceso directo por
varios valores y las dos siguientes, a un acceso secuencial por varios valores.
También puede ocurrir, sin embargo, que los accesos por varios valores sean mixtos.
Los accesos mixtos por varios valores son accesos en los que se combina el acceso directo por
valores de algunos atributos y el acceso secuencial por valores de otros atributos.
Ejemplos de accesos mixtos por varios valores
Sentencia 1:
1. SELECT *
2. FROM Employees
3. WHERE officeNum = 150 AND salary >= 2000;
Sentencia 2:
1. SELECT *
2. FROM Employees
3. WHERE salary = 2000
4. ORDER BY officeNum;
Sentencia 3:
1. DELETE *
2. FROM Employees
3. WHERE officeNum >= 100 AND officeNum <= 300 AND salary = 2000;
La primera de las sentencias combina un acceso directo por valor del atributo officeNum con un
acceso secuencial por valor del atributo salary. Las dos siguientes combinan un acceso
secuencial por valor del atributo officeNum con un acceso directo por valor del atributo salary.
Los accesos por varios valores no tienen su correspondiente en tecnología de los ficheros, a diferencia
En el caso del acceso directo por posición, sólo es preciso que el SGBD transforme los
números de posición de las páginas virtuales en direcciones de páginas reales almacenadas al
disco.
Si el SGBD necesita realizar un acceso secuencial por posición, el mismo procedimiento que
hemos explicado para el acceso directo por posición sirve para ir accediendo a todas las páginas,
de la primera a la última.
6.3.Implementación de los accesos por valor
La implementación de los accesos por valor es más compleja que la de los accesos por posición.
La dificultad proviene del hecho de que si el SGBD se basara únicamente en el SO para
implementarlos, no siempre obtendría un buen rendimiento. Será necesario, por lo tanto, que el
SGBD disponga de mecanismos propios especializados que los implementen de manera eficiente.
En este apartado veremos que para implementar de una manera eficiente el acceso directo y el
acceso secuencial por valor, los SGBD usan unas estructuras de datos auxiliares que se
denominan índices. Para la implementación de los accesos por valor con índices, partiremos del
hecho de que ya disponemos de los accesos por posición que hemos explicado. Los SGBD
utilizan los accesos por posición para implementar los accesos por valor.
Consideremos la sentencia siguiente, que requiere un acceso directo por valor del
atributo officeNum:
Hay que tener en cuenta que las filas de la tabla EMPLEADOS se encuentran en un espacio
virtual. Por lo tanto, ya que disponemos del acceso secuencial por posición a las páginas del
espacio virtual, el SGBD puede emplear este acceso para obtener todas las páginas una a una,
comprobando para cada una, qué filas contienen el valor buscado.
El inconveniente de la solución anterior es que requerirá un gran número de E/S, sobre todo si
hay muchos empleados en la BD. Habrá que consultar todas las páginas de la BD que tienen filas
de empleados para conseguir únicamente los empleados del despacho 150, que pueden ser muy
pocos.
Ahora analizamos otro ejemplo que requiere un acceso secuencial por valor; podéis observar la
sentencia siguiente:
Para obtener los empleados por orden de número de despacho, convendría que estuvieran
almacenados según este mismo criterio. Entonces, utilizando el acceso secuencial por posición
que nos facilita el SO, se conseguirían los empleados en el orden deseado.
El problema de esta solución es que la ordenación de los empleados por número de despacho iría
muy bien para la consulta anterior, pero muy mal si también se quisiera ejecutar, por ejemplo,
la sentencia siguiente:
Puesto que en una BD tienen que convivir habitualmente consultas y actualizaciones que
requieren ordenaciones diferentes de unos mismos datos, la solución que hemos presentado no
es satisfactoria para todas las sentencias que será necesario ejecutar de manera eficiente.
Las soluciones que hemos analizado para implementar los accesos por valor no nos permiten
conseguir un rendimiento lo suficientemente aceptable en muchos casos. A continuación,
analizaremos la manera como los índices nos permitirán mejorar esta situación.
El índice de un libro
Este módulo tiene un índice al principio. Si queremos localizar con rapidez el subapartado
dedicado a los árboles B+, lo que debemos hacer es consultar el índice. Allí encontraremos
fácilmente el número de página donde está situado el subapartado de los árboles B +, porque el
índice no es muy largo y no tardaremos en leerlo. Una vez conocido el número de página, solo
debemos localizar la página que lleva aquel número.
Los índices que emplean los SGBD son unas estructuras de datos auxiliares que, como los
índices de los libros, facilitan las búsquedas sobre unos determinados datos.
Uno de los motivos por los cuales las búsquedas pueden ser más rápidas si se realizan mediante
un índice en lugar de acceder directamente a los datos, es que los índices suelen ocupar menos
espacio que los datos.
Las filas que contienen los datos generalmente son voluminosas porque almacenan muchos
atributos. Los índices, en cambio, normalmente contienen sólo una colección de parejas,
denominadas entradas, formadas por un valor y un RID.
Las filas de una tabla de empleados podrían registrar el número de empleado, su nombre, DNI,
dirección, teléfono, sueldo, número de despacho, departamento donde está asignado, etc. En
cambio, si queremos tener un índice para acceder a los empleados según su número de
empleado, las entradas del índice tendrán que estar formadas sólo por un número de empleado
y un RID.
Una búsqueda mediante un índice consiste en localizar primero los valores en el índice para
conocer el RID. Una vez se dispone del RID, se emplea un acceso directo por posición para
conseguir la página que contiene la fila de los datos que buscábamos.
Un índice tiene que estar organizado de alguna manera que facilite las búsquedas de los valores
que contiene. Hay varias maneras de organizar los índices: los árboles B +, las funciones de
dispersión, etc. Algunos de estos tipos de índice sólo facilitan el acceso directo por valor (por
ejemplo, las funciones de dispersión); otros sirven tanto para el acceso directo como para el
acceso secuencial por valor (por ejemplo, los árboles B+).
Una característica muy útil de la mayoría de los tipos de índice es que permiten la posibilidad de
tener varios índices sobre unos mismos datos.
Las peculiaridades de los índices sugieren que es mejor gestionarlos de manera separada de los
datos de las tablas. Por este motivo, hay un tipo de espacio virtual para contenerlos,
denominado espacio de índices.
Ejemplo
Sobre una tabla que contiene datos de empleados podemos tener un índice que facilite el acceso por
número de empleado, otro que facilite el acceso por nombre, otro que facilite el acceso por número de
despacho, etc.
Más adelante, estudiamos los tipos de índices que utilizan más a menudo los SGBD para
implementar los accesos por valor: los estructurados como árboles B + y los estructurados según
funciones de dispersión. Cada SGBD tiene sus particularidades propias en la implementación de
un tipo de índice determinado. Dado que sería impracticable intentar explicar exhaustivamente y
con todos los detalles las implementaciones que hay, solo estudiamos los principios comunes a
la mayoría de las implementaciones de índices estructurados como árboles B + y los de los índices
estructurados mediante funciones de dispersión. Estos principios nos facilitan la comprensión de
las implementaciones particulares que proporcionan los SGBD del mercado.
El cálculo del coste de ejecución de los accesos a los datos mediante la utilización de índices es
un aspecto que deberemos considerar de ahora en adelante para evaluar la bondad de los
diferentes tipos de índice. Para este cálculo, tomamos las convenciones siguientes:
Observación
Observad que los índices también se pueden usar para implementar los accesos que requieren los
1) Consideramos sólo el coste de las E/S y no otros componentes del coste, como por ejemplo el
que corresponde a los cálculos de la UCP (16) . El motivo es que el coste de las E/S es
normalmente el componente dominante en el coste de las operaciones que se llevan a cabo en
las BD y nos proporciona una buena aproximación a los costes reales.
6.3.3.Árboles B+
En los subapartados siguientes, presentamos un tipo de índice que sirve para facilitar el acceso
directo y el secuencial por valor de un atributo: los árboles B +.
Los árboles B+ son un tipo particular de árbol de búsqueda. El objetivo primordial de la
estructura de los árboles B+ es el de conseguir que las búsquedas se efectúen con un número
pequeño de E/S.
Es importante tener en cuenta que, a diferencia otros tipos de árboles, los árboles B + que
estudiamos aquí están orientados a realizar búsquedas en el disco.
El estudio de los árboles B+ es muy interesante porque la mayoría de los sistemas comerciales
(como por ejemplo Oracle, PostgreSQL, Informix, DB2, etc.) los implementan.
Ejemplo
En un árbol B+, los nodos internos y los nodos hoja tienen una estructura diferente. Las causas
de esta diferencia estructural son tres:
1) Los nodos hoja son los que contienen todas las entradas del índice (es decir, las parejas de
valor y RID).
2) Los nodos internos tienen como objetivo dirigir la búsqueda de la hoja que tiene la entrada
correspondiente a un valor determinado. El acceso directo por valor consistirá, pues, en hacer un
recorrido del árbol que empezará en la raíz e irá bajando por los nodos del árbol hasta llegar a la
hoja adecuada (la que contiene, si existe, la entrada correspondiente al valor buscado).
3) Los nodos hoja están conectados por apuntadores, que sirven para facilitar el acceso
secuencial por valor (el recorrido de las hojas siguiendo los apuntadores proporciona las
entradas ordenadas por valor).
La figura 18 muestra un índice de árbol B+ de orden d = 1 que sirve para acceder a datos de
empleados según el valor del atributo “número de empleado”. Observad que los RID que
apuntan a los datos están sólo en los nodos hoja, que los nodos internos sirven para buscar los
valores de las hojas y que el hecho de que las hojas estén conectadas entre sí facilita el acceso
secuencial por valor.
Un nodo interno contiene valores y apuntadores hacia sus nodos hijos (una manera de
implementar un árbol es tener en cada nodo apuntadores hacia todos sus nodos hijos).
La estructura de un nodo interno que contiene n valores (donde n es menor o igual que 2d) es la
que muestra la figura 19.
Figura 19. Estructura de un nodo interno
Tal como indica la figura 19, se cumple que el subárbol del nodo apuntado por fi contiene
valores v tales que:
v ≥ vn, si i = n.
Ejemplo de estructura de un nodo interno
La figura 20 muestra varios nodos de un índice de árbol B + de orden 2 por el atributo número de
empleado.
Considerad el nodo raíz: tiene tres apuntadores que apuntan a sus nodos hijos. Observad que el
subárbol apuntado por el primero de estos apuntadores contiene valores menores que 10. El
subárbol apuntado por el segundo contiene valores mayores o iguales que 10 y menores que 45.
Finalmente, el subárbol apuntado por el tercero contiene valores mayores o iguales que 45.
Los nodos hoja de los árboles B+ contienen entradas formadas por los valores a los cuales se
tiene que acceder y el RID que apunta a los datos, un apuntador al nodo hoja anterior y un
apuntador al nodo hoja siguiente.
La estructura de un nodo hoja que contiene n valores (donde n es menor o igual que 2d) es la
que muestra la figura 21. En la figura, cada vi corresponde a la entrada del valor vi (por
tanto, vi y su RID), aa indica el apuntador al nodo hoja anterior y as indica el apuntador al
siguiente.
Todos los valores de un nodo hoja son menores que los valores del nodo hoja siguiente.
Todos los valores de algún nodo interno del árbol están repetidos en alguna hoja del
árbol (así, las hojas contienen todos los valores del árbol).
La figura 22 muestra varios nodos de un índice de árbol B + de orden 2 por el atributo número de
empleado.
Considerad, por ejemplo, el nodo hoja que está situado más a la izquierda. Contiene las
entradas del empleado número 2 y del empleado número 3. También tiene los apuntadores en la
hoja anterior y en la siguiente del árbol (en este caso concreto, no existe hoja anterior).
Observad que todos los valores del nodo considerado (los valores 2 y 3) son menores que los
valores de la hoja siguiente (6 y 8). Finalmente, observad que el valor 6 de la segunda hoja está
repetido en un nodo interno. El motivo es que en un árbol B + las hojas deben contener todos los
valores del árbol.
Accedemos primero al nodo raíz. Después, seguimos el primer apuntador porque 8 < 20. A
continuación, seguimos el segundo apuntador, dado que 6 ≤ 8 < 12, y localizamos el nodo hoja
que contiene la entrada del valor deseado.
La localización ordenada de las entradas del árbol es sencilla. Conviene recordar que las hojas
contienen todos los valores del árbol, que cada hoja tiene un apuntador a la hoja siguiente y que
los valores de un nodo hoja son menores que los valores del nodo hoja siguiente. Entonces, solo
hay que acceder primero a la hoja situada más a la izquierda y, después, ir accediendo cada vez
a la hoja siguiente hasta que se acabe la cadena de hojas.
Observación
Si seguimos el procedimiento de acceso secuencial por valor explicado en este subapartado con el
árbol de la figura 21, iremos obteniendo todas las entradas del árbol de manera ordenada.
Una propiedad de los árboles B+ destinada a reducir el nivel de las hojas es que todos los nodos
del árbol (excepto la raíz) tienen que estar llenos, como mínimo, hasta un 50% de su capacidad.
Esta norma equivale a exigir que en un árbol de orden d todos los nodos excepto la raíz
contengan, al menos, d valores.
Esta norma evita tener árboles B+ donde muchos de los nodos estén prácticamente vacíos. Si
conseguimos que los nodos de un árbol no estén demasiado vacíos, el árbol tendrá menos nodos
y también menos niveles.
Con el objetivo de mejorar el rendimiento de un índice, suele ser deseable que el número de
nodos que haya que recorrer sea siempre más o menos el mismo, independientemente de cuál
sea el valor al que se quiere acceder.
Por el motivo anterior, los árboles B+ cumplen una segunda propiedad: ser equilibrados. Un árbol
es equilibrado si todas sus hojas están en el mismo nivel.
Observación
El hecho de que los nodos sean del tamaño de una página (que almacena normalmente 4 kB)
permite tener típicamente árboles de órdenes entre 50 y 100.
a) Supongamos que disponemos de páginas de 4 kB y los valores por indexar ocupan 20 bytes.
Consideremos también que el tamaño del RID es de 4 bytes y los apuntadores a páginas del
árbol ocupan 3 bytes. Según estos datos, en los nodos internos caben 177 valores y 178
apuntadores a otros nodos del árbol; en los nodos hoja caben 170 entradas (parejas de valor y
RID) y los 2 apuntadores a las hojas anterior y siguiente. Puesto que la capacidad en valores
debe ser la misma en todos los nodos, la restringiremos a 170 (el peor caso). El orden del árbol
será, pues, la mitad de 170, es decir, d = 85. Observad que hemos obtenido un orden que se
encuentra entre 50 y 100.
b) Consideremos ahora un árbol de orden d = 50, de altura h = 3 y donde todos los nodos
tienen una ocupación del 69%. Si d = 50, la capacidad máxima de los nodos es de 100 y una
ocupación del 69% supone tener 69 valores en cada nodo. En este árbol, tendremos el número
de valores siguiente en cada nivel:
De este ejemplo se desprende que con órdenes d = 50 y una altura de h = 3 se puede indexar
una cantidad de datos considerable.
Reflexión
Si pensamos que el árbol B+ se construye sobre el número de empleado, y suponiendo que este
número es la clave primaria de la relación de empleados, nuestra relación podrá contener hasta
Inserciones y supresiones
Las inserciones y supresiones se tienen que hacer de manera que el árbol resultante satisfaga
todas las propiedades de los árboles B+. Esto implica en algunos casos realizar una
reestructuración del árbol.
A) Inserciones
Describimos un algoritmo que, dada una entrada, localiza el nodo hoja que le corresponde y, si
este nodo tiene espacio libre, se la inserta. En el supuesto de que este nodo hoja no tenga
espacio libre para la nueva entrada, reestructura el árbol para encontrarle un lugar.
Comentaremos algunos ejemplos que nos ayudarán a entender con más exactitud qué debe
hacer este algoritmo de inserción, cuya descripción detallada queda fuera del alcance de este
módulo.
A partir de este árbol, consideraremos los casos de inserción que exponemos a continuación:
a) Supongamos que se quiere insertar en este árbol la entrada 45*. El 45 tiene que pertenecer a
la hoja situada más a la derecha. Dado que esta hoja tiene espacio libre, la entrada 45* se
puede colocar en la hoja que le corresponde y no hay que hacer ninguna reestructuración del
árbol. Se obtiene el árbol que muestra la figura 24.
b) Ahora consideramos que se quiere insertar la entrada 52* en el árbol que acabamos de
obtener. Le corresponde la hoja situada más a la derecha, pero no tiene espacio libre. Para
insertar la nueva entrada, hay que dividir la hoja en dos. Las dos hojas resultantes de la división
se muestran en la figura 25.
Cuando se divide un nodo, hay que insertar en su nodo padre un valor y un apuntador al nuevo
hijo. En nuestro ejemplo, este valor es el 40, porque es el valor más pequeño del segundo nodo
hoja que ha resultado de la división. Es necesario, pues, insertar el 40 y el apuntador en el nodo
padre. El nodo padre no tiene espacio y habrá que dividirlo.
Cuando se divide un nodo no-hoja, sus primeros d valores se dejan en el nodo (el 6 y el 12),
los d valores más grandes se colocan en un nuevo nodo (el 34 y el 40) y el valor del medio se
inserta en el nodo padre (el 27), junto con un apuntador hacia el nuevo nodo. La figura 26 nos
muestra esta división de un nodo no-hoja.
Figura 26. División de un nodo no-hoja
Observad las diferencias que hay entre esta división y la división de un nodo hoja.
Puesto que acabamos de dividir el nodo raíz del árbol, hay que crear un nuevo nodo raíz en el
que se colocan el valor 27, el apuntador al nuevo nodo y también un apuntador a la raíz antigua.
El árbol que se obtiene finalmente es el que podéis ver en la figura 27.
B) Supresiones
Describiremos un algoritmo que, partiendo de una entrada, localiza el nodo hoja que le
corresponde, lo borra y, si hace falta, reestructura el árbol para que todos los nodos del árbol
(excepto la raíz) tengan, por lo menos, d valores.
Comentaremos algunos ejemplos para entender de manera más precisa cómo funciona el
algoritmo, cuya descripción detallada queda fuera del alcance de este módulo.
a) Supongamos que queremos borrar el valor 45 del árbol. La hoja que contiene la entrada del
valor 45 es la que está situada más a la derecha. Después de borrar 45*, la hoja todavía
contiene dos valores y, por lo tanto, no hay que hacer ninguna reestructuración. El árbol
obtenido es el que muestra la figura 28.
En nuestro ejemplo, puesto que el nodo hermano de la derecha tiene tres entradas, se hace una
redistribución de entradas entre los dos nodos hoja. La figura 29 ilustra esta redistribución.
Observad que la redistribución afecta al contenido del nodo padre de los dos nodos
participantes. El valor 12 del nodo padre se cambia por el 15. El árbol que se obtiene finalmente
es el que se muestra en la figura 30.
c) Consideremos ahora el caso del borrado del 35 del árbol que acabamos de obtener. La
entrada del 35 está situada en la penúltima hoja. Después de borrarla, la hoja se queda con
menos de dos entradas, de modo que hay que llevar a cabo una reestructuración. En este caso,
su nodo hermano de la derecha tiene solo dos entradas y, por lo tanto, no se hará una
redistribución como en el caso anterior (el nodo hermano no tiene entradas sobrantes para
redistribuir), sino que se hará una fusión de los dos nodos hoja en un único nodo.
Observad que cuando se fusionan dos nodos, su nodo padre pierde un valor. Debido a esta
pérdida, el nodo padre de nuestro ejemplo nos ha quedado con menos de dos valores. En este
caso, será preciso hacer todavía otra reestructuración del árbol para corregirlo. El nodo padre no
tiene ningún hermano a la derecha; por lo tanto, usaremos el de la izquierda para reestructurar
el árbol.
El hermano de la izquierda tiene solo dos valores, por lo que se hará una fusión de ambos
nodos. La figura 32 nos ilustra esta fusión de dos nodos no-hoja.
Después de esta última fusión, nos ha quedado un árbol con la raíz vacía. En estos casos hay
que descartar la raíz antigua y construir la raíz nueva con el nodo resultante de la fusión.
Finalmente, se obtiene el árbol que muestra la figura 33.
d) Para el último ejemplo de supresión, elegimos el árbol B + de partida que muestra la figura 34.
Consideremos el borrado del valor 25 del árbol. La entrada del 25 está en la tercera hoja.
Después de borrarlo, la hoja se queda con menos de dos entradas. Esta hoja no tiene ninguna
hoja hermana a la derecha y hay que fusionarla con la de la izquierda, como muestra la figura
35.
Después de la fusión, el nodo padre se ha quedado con menos de dos valores. Será necesario
hacer una redistribución con su nodo hermano derecho (que tiene más de dos valores). La figura
36 muestra esta redistribución de valores entre nodos no-hoja.
Hemos analizado un procedimiento de borrado de los valores de un árbol B + que sólo aparecen
en un nodo hoja del árbol. Como ya sabemos, un árbol B + puede tener valores que figuran en
dos lugares: en un nodo hoja y en un nodo no-hoja (nodo interno). Para borrar los valores que
tienen una copia en nodos internos, podemos utilizar el mismo procedimiento si hacemos
previamente una sustitución del valor copiado en el nodo interno por el valor del árbol que le
sigue según el orden de los valores. Una vez hecho esto, podremos emplear el procedimiento de
supresión anterior para eliminar el valor de la hoja.
Borramos el valor 53 de la figura 34, que tiene la entrada en la penúltima hoja del árbol y una
copia en el nodo padre de la hoja mencionada. Sustituimos la copia del 53 por el valor que le
sigue, que es el 56. Una vez hecho esto, borramos el 53 de la hoja. El árbol que nos queda se
muestra en la figura 38.
Figura 38. Supresión de valores que tienen una copia en nodos internos
Ampliación
Nodos hermanos
Valores repetidos
En las búsquedas, inserciones y supresiones de los árboles B + que acabamos de explicar no
hemos considerado la posibilidad de que pudiera haber valores repetidos en los datos; hemos
considerado que indexábamos los valores de atributos identificadores.
Existen varias soluciones para el tratamiento de los valores repetidos en los árboles B +;
comentaremos dos brevemente:
2) Otra posibilidad es tener una sola entrada que contenga varios RID (uno para cada aparición
del valor). Esta posibilidad provoca que el tamaño de las entradas sea variable y que su gestión
resulte más compleja. Por el contrario, se ahorra espacio porque el valor en entradas diferentes
no se repite, y, en consecuencia, se ahorran operaciones de E/S.
6.3.4.Dispersión
Otros tipos de índices sirven para facilitar el acceso directo por valor, pero no el acceso
secuencial por valor: son los índices basados en la dispersión (17) .
En inglés, hashing.
(17)
en los árboles B+. Otros, como por ejemplo el sistema PostgreSQL, proporcionan ambos tipos de
índices.
Introducción a la dispersión
La característica fundamental de los índices basados en la dispersión es que las entradas se
colocan en las páginas según una función de dispersión h.
Queremos indexar unos datos por el valor de un atributo que representa nombres de pila.
Supongamos que h(Juan) = 3, h(Marta) = 1 y h(Rosa) = 4. Entonces, las entradas de estos
valores quedarán colocadas en las páginas del índice tal y como se muestra en la figura 39.
Observad que el número de valores posibles puede ser muy grande, mientras que el número de
páginas que puede ocupar el índice en el disco suele ser mucho más limitado. Esto hace que el
número de valores v posibles sea mucho mayor que el número N de páginas posibles. La función
de dispersión h transforma valores de un intervalo muy grande en posiciones de un intervalo
menor (el intervalo [1, ..., N]).
Por este motivo, es posible que para dos valores diferentes, vi y vj, suceda que h(vi) = h(vj), es
decir, que la función devuelva la misma página para los dos valores, como se aprecia en la
figura 40.
Ejemplo
Pensad en valores de un atributo que representa un DNI. Los valores posibles del atributo se
encuentran entre 0 y 99.999.999. En cambio, el número de páginas que puede ocupar el índice en el
Gestión de excedentes
La política de gestión de excedentes que estudiamos se basa en que el índice lo forman dos tipos
disjuntos de páginas:
Páginas primarias: páginas donde colocaremos todas las entradas que no son
excedentes (habrá N).
Esta página de excedentes e se utilizará solo para contener los posibles excedentes de la página
primaria p que se inserten posteriormente. Si la página e también se llena, se le encadenará una
nueva página de excedentes e’ donde se podrán colocar más excedentes de la página primaria p,
y así sucesivamente.
De este modo, para cada página primaria con excedentes, se construye una cadena de páginas
de excedentes. El primer apuntador de la cadena está situado en la página primaria que lo ha
originado.
Puesto que hay una cadena separada de páginas de excedentes para cada página primaria, esta
política de gestión de excedentes a veces se denomina encadenamiento separado (18) .
Las supresiones de los valores del índice pueden hacerse de varias maneras. Una posibilidad es
marcar el valor con una señal especial que indique que está borrado, sin reorganizar nada. Otra
posibilidad es aprovechar estas supresiones de valores para reducir la longitud de las cadenas de
excedentes.
Supongamos que tenemos un índice con cinco páginas primarias (N = 5), que todas las páginas
tienen una capacidad de tres entradas (L = 3) y que la función de dispersión es h(x) =
(x mod 5) + 1. Si insertamos los valores: 22, 23, 12, 57, 33, 38, 32, 67, 62, 43, 2, 3, el índice
quedará como muestra la figura 42.
En inglés, separate chaining.
(18)
Es fácil darse cuenta de que el coste de localizar una entrada en el índice almacenado en las
páginas de un espacio de índices varía bastante según si esa entrada es excedente o no:
Para las entradas excedentes, en cambio, siempre será necesario hacer más de una E/S.
En consecuencia, para conseguir un buen rendimiento del índice interesa que el índice tenga
pocas entradas de excedentes. Una manera de reducir el número de entradas de excedentes es
disponer de más espacio del que se requiere para las páginas primarias; es decir, conseguir que
las páginas primarias estén poco cargadas de entradas.
C = M / (N × L)
Cuanto más bajo sea el factor de carga, menos excedentes habrá y menos E/S serán necesarias.
En contrapartida, si el factor de carga es muy bajo, se utiliza más espacio.
Si disponemos de páginas de 4 kB, los valores indexados ocupan 40 bytes, los RID, 4 y los
apuntadores a páginas, 3. Entonces, el número L de entradas será 93, dado que se tiene que
cumplir que 4 kB = (40 + 4)L + 3 (la página debe contener hasta L entradas formadas por el
valor y un RID cada una, así como el apuntador a la primera página de excedentes).
Una solución es crear un nuevo índice con un número N’ de páginas primarias mayor que N,
cambiar de función de dispersión para que devuelva valores de [0, ..., N’ – 1] en lugar de
valores de [0, ..., N – 1], y reinsertar todas las entradas en el nuevo índice empleando la nueva
función de dispersión. Sin embargo, esta solución es muy costosa.
Lectura complementaria
6.3.5.Índices agrupados
Los índices que permiten implementar los accesos secuenciales por valor (como por ejemplo los
árboles B+) pueden ser índices agrupados (19) o índices no agrupados (20) .
Un índice agrupado es aquel en el que los datos que indexa están ordenados físicamente
según el acceso secuencial por valor que proporciona el índice. En cambio, un índice no
agrupado es un índice en el que los datos indexados están colocados de manera aleatoria.
La figura 43 ilustra las diferencias entre los índices agrupados y los no agrupados.
En inglés, clustered.
(19)
En inglés, unclustered.
(20)
El coste de un acceso secuencial por valor varía mucho según si el índice que nos
proporciona el acceso es agrupado o no:
En índices no agrupados puede pasar que la mayoría de los RID consecutivos apunten a
filas de páginas diferentes. Esta situación puede llegar a suponer tantas E/S como
filas a las cuales haya que acceder.
Un aspecto que hay que tener en cuenta en los índices agrupados es que la ordenación física de
sus datos es difícil de mantener cuando se producen inserciones y supresiones. En la práctica,
esta dificultad se resuelve de la manera siguiente:
1) Inicialmente, se deja espacio libre en las páginas que contienen los datos para absorber
inserciones futuras.
2) Si el espacio libre de una página se agota, las inserciones futuras a la página se realizan en
páginas de excedentes que se le encadenan.
3) Si hay muchas páginas de excedentes, los datos se reorganizan para mejorar el rendimiento.
Reflexión
Aunque podemos tener varios índices sobre unos datos, solo uno puede ser agrupado, porque los
Supongamos que se quiere ejecutar la sentencia siguiente, que requiere un acceso directo por
varios valores, concretamente por los valores de salary y de officeNum:
1. SELECT *
2. FROM Employees
3. WHERE officeNum = 150 AND salary = 1200;
Una buena estrategia para procesar la consulta anterior es la que presentamos a continuación:
1) Usar el índice del atributo officeNum para obtener todos los RID de las filas de empleados que
tiene el despacho 150.
2) Usar el índice del atributo salary para encontrar todos los RID de filas de empleados que
tienen el sueldo 1.200.
3) Realizar la intersección entre los dos conjuntos de RID. Los RID de la intersección
corresponden a los empleados que tienen al mismo tiempo el despacho 150 y un sueldo de
1.200.
Esta es una buena estrategia porque aprovecha el hecho de tener dos índices para los datos de
los empleados. Aun así, en algunos casos concretos puede tener un mal rendimiento.
Por ejemplo, si hay muchos empleados en el despacho 150, muchos empleados con un sueldo de
1.200 y muy pocos empleados que cumplan las dos condiciones a la vez, habrá que examinar
muchos RID para localizar pocos empleados. Una solución más eficiente para este caso es definir
un único índice –en lugar de dos, como en el caso anterior– que utilice valores compuestos de
los atributos officeNum y salary.
Un índice de valores compuestos por los atributos [A1, ..., Ai, ..., An] tiene la misma
estructura que los otros índices. La única diferencia es que los valores del índice serán, de
hecho, listas de elementos [v1, ..., vi, ..., vn] donde vi es un valor del atributo Ai.
La gestión del índice implica necesariamente establecer una relación de orden entre los valores
compuestos del índice. Se ordenan según el primer elemento de la lista y, si el primer elemento
coincide, se ordenan de acuerdo con el segundo; si este también coincide, se ordenan según el
tercero, etc.
El índice de valores compuestos por los atributos [officeNum, salary] tiene valores como por
ejemplo [150, 1.200], [150, 1.500], etc.
Para establecer una relación de orden entre los valores compuestos del índice hay que deducir
para los dos valores anteriores [150, 1.200], [150, 1.500] cuál es el más grande. Aquí, puesto
que el primer elemento de la lista coincide, se utiliza el segundo para ordenar. Se obtiene que
[150, 1.200] < [150, 1.500].
En general, el orden entre dos valores compuestos v = [v1, ..., vi, ..., vn] y w =
[w1, ..., wi, ..., wn] se establece de la manera siguiente:
Si v1 > w1, entonces v > w; y si v1 < w1, entonces v < w.
Si v1 = w1 y v2> w2, entonces v > w; y si v1= w1 y v2< w2, entonces v < w.
Si v1 = w1, ..., vi–1 = wi–1 y vi > wi, entonces v > w; y si v1 = w1, ..., vi–1 = wi–1 y vi < wi,
entonces v < w.
Sentencia 1:
1. SELECT *
2. FROM Employees
3. ORDER BY officeNum, salary;
Esta sentencia corresponde a un acceso secuencial por varios valores. El orden de presentación
de los empleados que requiere esta sentencia coincide con el orden de los valores compuestos
del índice por [officeNum, salary]. Así pues, el índice nos permitirá procesar la sentencia de
manera eficiente.
Sentencia 2:
1. SELECT *
2. FROM Employees
3. WHERE officeNum = 100 AND salary > 960;
Esta sentencia corresponde a un acceso mixto por varios valores. Observad que el orden de los
valores compuestos del índice por [officeNum, salary] concuerda con el orden en el que nos
interesa obtener los empleados para procesar la consulta. De este modo, el índice nos permite
también procesar la consulta de manera eficiente.
Sentencia 3:
1. SELECT *
2. FROM Employees
3. ORDER BY salary, officeNum;
Sentencia 4:
1. SELECT *
2. FROM Employees
3. WHERE salary = 1200 AND officeNum > 100;
Con un solo índice multidimensional por los atributos salary y officeNum podríamos procesar todas las
Se han propuesto varios tipos de índices multidimensionales: los árboles R, los archivos en
retícula, etc. Se utilizan sobre todo en SGBD destinados a almacenar información geográfica,
pero pocos sistemas relacionales los incorporan.
Lectura complementaria
Podéis encontrar la descripción de los árboles R y de los archivos en retícula en la obra siguiente:
A. Silberschatz; H. F. Korth; S. Sudarshan (2010). Fundamentos de bases de datos (3.ª ed.).
Madrid: McGraw-Hill.
Documentación Oracle
Para obtener los detalles de la implementación, así como una guía de la sintaxis y ejemplos de uso, se
Si se desea que el acceso secuencial sea por orden descendente, debe declararse de manera
explícita (porque, por defecto, el orden se considera ascendente):
Finalmente, si se desea que el índice no admita valores repetidos, habrá que declarar:
Resumen
En la primera parte de este módulo didáctico, hemos presentado los componentes que usan los
SGBD en el almacenamiento de los datos que gestionan. Hemos visto el nivel físico de la
arquitectura de una base de datos, en el que los SGBD utilizan los ficheros que ya conocíais de
otras asignaturas para almacenar los datos en dispositivos no volátiles, normalmente discos
magnéticos, y el nivel virtual, que es un nivel propio de los SGBD que permite simplificar la
visión que tienen de los datos almacenados.
En la segunda parte de este módulo, hemos tratado la manera de implementar el diseño físico
de la base de datos.
Finalmente, en la tercera y última parte de este módulo didáctico hemos identificado métodos de
acceso que son necesarios para llevar a cabo diferentes tipos de consultas y actualizaciones en
las BD. Estos métodos de acceso son los accesos directos y secuenciales por posición, los
accesos directos y secuenciales por valor y, finalmente, los accesos por varios valores, que
pueden ser directos, secuenciales o mixtos.
Hemos explicado que la implementación de los accesos por posición se fundamenta casi
completamente en los servicios proporcionados por el SO y que, en cambio, la implementación
eficiente de los accesos por uno o varios valores es más compleja y requiere que el SGBD
disponga de estructuras propias especializadas.
Hemos descrito algunas de las estructuras que los SGBD utilizan para implementar los accesos
por uno o varios valores: índices del tipo árbol B +, índices estructurados según funciones de
dispersión, índices agrupados e índices de valores compuestos. Hemos mostrado el impacto que
pueden tener estas estructuras en el número de E/S necesario para implementar los accesos a
los datos.
Glosario
acceso directo por posición m
Método de acceso que consiste en obtener una página que tiene un número de página
determinado dentro de un espacio.
árbol B+ m
Estructura de datos que se emplea para organizar índices que permiten implementar el
acceso directo y el acceso secuencial por valor.
bloque m
Unidad de transferencia de datos entre la memoria del ordenador y los dispositivos o
ficheros externos. El sistema operativo de la máquina, concretamente la parte
especializada en la E/S, es quien lleva a cabo esta transferencia.
catálogo m
Conjunto de tablas que contienen los metadatos de la base de datos.
dispersión f
Manera de organizar valores que se puede utilizar en índices que implementan el acceso
directo por valor.
entrada f
Elemento de un índice que consiste en una pareja formada por un valor y un RID.
espacio virtual m
Secuencia de páginas virtuales. Proporciona una visión ordenada y contigua de las
páginas físicas. Según su funcionalidad específica tiene características ligeramente
diferentes, en función de las cuales puede ser un espacio para tablas, fragmentado, de
agrupación, de objetos grandes, de índices, temporal, etc.
sigla EV
EV m
Podéis ver espacio virtual
extensión f
Unidad de asignación de espacio en un dispositivo periférico. Cada extensión es un
número entero de páginas consecutivas y está contenida dentro de un fichero.
Normalmente existe una extensión primaria, que se adquiere la primera vez que el
fichero se extiende, y una extensión secundaria, que corresponde a las extensiones
siguientes.
fichero m
Unidad de gestión del espacio en los dispositivos periféricos. Normalmente, el sistema
operativo gestiona los ficheros en lugar del SGBD.
identificador de fila m
Dirección uniforme que utilizan los SGBD para grabar las referencias internas de sus
estructuras de datos. Otros nombres equivalentes son ROWID y, últimamente, OID (en
la medida en que los SGBD relacionales se convierten en los denominados object-
relational).
sigla RID
índice m
Estructura de datos auxiliar que los SGBD usan para facilitar las búsquedas necesarias
para implementar los accesos por uno o varios valores.
índice agrupado m
Índice que proporciona el acceso secuencial por valor (y también el acceso directo por
valor) y que indexa datos que están ordenados físicamente según el orden del acceso
secuencial por valor proporcionado.
memoria intermedia f
Espacio de la memoria principal del ordenador, normalmente bastante grande, dedicado
a contener todas las unidades de memoria intermedia que gestiona el SGBD.
método de acceso m
Tipo de acceso a los datos almacenados por un SGBD.
nivel físico m
Nivel que engloba los componentes físicos (fichero, extensión y página) dentro de la
arquitectura de componentes de almacenamiento.
nivel lógico m
Nivel que engloba los componentes lógicos (base de datos, tablas, vistas, restricciones,
etc.) dentro de la arquitectura de componentes de almacenamiento.
nivel virtual m
Nivel que engloba el componente virtual (el espacio virtual) dentro de la arquitectura de
componentes de almacenamiento.
página f
Unidad de transferencia de datos entre la memoria del ordenador y los ficheros de una
BD. El SO de la máquina es lo que lleva a cabo esta transferencia y pasa la página al
SGBD para que este le gestione la información que contiene, puesto que el SGBD es lo
que entiende la estructura interior de la página. La página también es la unidad principal
de grabación de los datos de una base de datos en los dispositivos periféricos. En este
módulo, a veces la denominamos página física o página real para distinguirla de la
página virtual.
página virtual f
Imagen de la página real o visión que desde el nivel virtual se tiene de la página real sin
materializarla físicamente. Hay una relación biunívoca entre página real y página virtual.
RID m
Podéis ver identificador de fila
SGBD m
Sigla de sistema de gestión de bases de datos
SO m
Sigla de sistema operativo
VDF m
Podéis ver vector de direcciones de fila
Bibliografía
Elmasri, Ramez; Navathe, Shamkant, B. (2007). Fundamentos de sistemas de bases de
datos (5.ª ed.). Madrid: Pearson Educación.
Teorey, T. J. (2011). Database Modeling & Design (5.ª ed.). San Francisco: Morgan Kaufmann
Publishers, Inc.
Procesamiento de consultas y
vistas
Seguridad en bases de datos
Joan Anton Pérez Braña
Los textos e imágenes publicados en esta obra están sujetos –excepto que se indique lo contrario– a
v.3.0. Se puede copiar, distribuir y transmitir la obra públicamente siempre que se cite el autor y la
fuente (Fundació per a la Universitat Oberta de Catalunya), no se haga un uso comercial y ni obra
http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es
Índice
Introducción
Objetivos
1.Procesamiento de consultas
o 1.1.Descomposición de consultas
1.1.2.Normalización de la consulta
1.1.3.Análisis semántico
1.1.4.Simplificación
o 1.2.Optimización semántica
o 1.3.Optimización sintáctica
1.3.1.Reglas de equivalencia
1.4.2.Operación de selección
1.4.3.Operación de ordenación
1.4.4.Operación de proyección
1.4.5.Operación de combinación
1.4.7.Agregación
o 1.5.Optimización física
1.5.1.Optimización heurística
o 2.2.Actualización de vistas
o 2.5.Tablas temporales
3.La seguridad
o 3.1.Identificación y autenticación
o 3.2.Control de acceso
o 3.4.Auditoría
4.3.1.Gestión de usuarios
4.3.2.Definición de perfiles
4.3.3.Identificación de usuarios
4.3.4.Gestión de los privilegios
4.3.5.Roles
Resumen
Glosario
Bibliografía
Introducción
El lenguaje SQL es un lenguaje declarativo. Como tal, las consultas realizadas con este lenguaje
especifican qué se quiere obtener en lugar de indicar cómo se quiere conseguir. En el presente
módulo se explica la forma en que los sistemas gestores de bases de datos (SGBD) relacionales
evalúan sistemáticamente las posibles estrategias alternativas que se pueden presentar, de
acuerdo con las necesidades de los usuarios y las aplicaciones, con el objetivo de escoger la
estrategia que se considera óptima.
También veremos que las vistas proporcionan mecanismos de seguridad y permiten al diseñador
de la base de datos personalizar el modelo lógico al modelo de los usuarios. Se estudiará en qué
casos una vista es actualizable y qué mecanismos incorporan los SGBD para permitir que las
vistas sean actualizables.
Por último, estudiaremos las técnicas empleadas para proteger la base de datos contra accesos
no autorizados y los mecanismos para otorgar/revocar privilegios a los diferentes usuarios según
el modelo de negocio implícito en el sistema de información. También trataremos las
obligaciones legales derivadas del hecho de estar en posesión de determinados datos
especialmente protegidos.
Objetivos
Los materiales didácticos asociados a este módulo os permitirán lograr los siguientes objetivos:
4. Presentar las vistas como elementos de diseño externo que permiten la actualización
de datos.
5. Conocer nuevas aplicaciones de las vistas para mejorar el diseño de la base de datos.
1.Procesamiento de consultas
Una de las principales críticas a los primeros sistemas gestores de bases de datos (SGBD (1) )
relacionales fue el bajo rendimiento en el procesamiento de consultas. En los lenguajes no
procedimentales, como es el caso del SQL, el usuario especifica los datos que quiere obtener en
lugar de indicar cómo quiere conseguirlos.
El procesamiento de consultas hace referencia al conjunto de actividades que el SGBD lleva a
cabo para extraer información de una base datos con el objetivo de lograr la estrategia más
eficiente y que le permita tener un mayor control sobre las prestaciones del sistema.
En la figura 1 podéis observar gráficamente las cuatro etapas que componen el procesamiento
de consultas:
1) descomposición de la consulta,
2) optimización de la consulta,
3) generación de código, y
4) ejecución de la consulta.
Relaciones R, S La lista de atributos de cada relación se define según el esquema siguiente: R =
(A1, A2, ..., An).
combinación.
Selección σp(R) Operación que devuelve las tuplas de la relación R que satisfacen la evaluación del
predicado p.
Unión (R) ∪ (S) Se obtiene una relación nueva que incluye las tuplas de la relación R y S menos las
repeticiones.
Intersección (R) ∩ (S) Se obtiene una relación nueva que incluye las tuplas que pertenecen a las dos
relaciones, R y S .
Diferencia (R) – (S) Se obtiene una relación nueva que incluye las tuplas que pertenecen a la relación R pero
Producto cartesiano (R) × (S) Se obtiene una relación nueva formada por todas las tuplas que resultan de concatenar
Combinación Theta (R) ⋈ p (S) Se obtiene una relación nueva que incluye los atributos de los pares de tuplas
A partir del primer árbol de consulta lógico, que representa la expresión relacional, empieza el
proceso de optimización de la consulta.
Jobs(jobId,jobName)
Locs(locId,streetAddress,postalCode,stateProvince,city,countryId)
Emp(empId,firstName,lastName,jobId,deptId,hireDate,
salary,manager)
{jobId} REFERENCES Jobs(jobId),
{manager} REFERENCES Emp(empId),
{deptId} REFERENCES Dept(deptId)
Dept(deptId, deptName, managerId, locId),
{locId} REFERENCES Locs(locId),
{managerId} REFERENCES Emp(empId)
1. SELECT *
2. FROM Emp e, Dept d
3. WHERE e.dept Id = d.dept Id
4. AND (e.hireDate > ';01-SEP-07';
5. AND d.deptName LIKE ';IT';) ;
A partir de esta consulta, podemos obtener tres expresiones de álgebra relacional equivalentes
distintas:
σ(deptName=′IT’)∧(hireDate>′01-SEP-07’)∧(Emp:deptId=Dept:deptId)(Emp × Dept)
σ(deptName=’IT’)∧ (hireDate>′01-SEP-07’)(Emp ⋈ (Emp:deptId=Dept:deptId) Dept)
(σ(deptName=′IT’) Dept) ⋈ (Emp:deptId=Dept:deptId) (σ(hireDate>′01-SEP-07’)(Emp))
Reflexión
Prestad atención al hecho de que la serie de operaciones de álgebra relacional es diferente en cada
caso.
3) Optimización física, que permite escoger, de entre los distintos planes de evaluación, cada
uno con costes diferentes, el que resulte más eficiente. Para determinar el coste más eficiente
de cada consulta, es preciso conocer el coste de la secuencia de operaciones del álgebra que la
forman y, por lo tanto, de cada operación, lo cual a menudo depende de diferentes parámetros.
Así pues, para especificar completamente cómo se evaluará la consulta, hay que determinar qué
algoritmos se utilizarán para cada operación y cuáles serán los índices empleados. Estas
especificaciones se denominan primitivas de evaluación, y la secuencia de estas primitivas se
denomina plan de ejecución de una consulta.
El plan de ejecución es la secuencia de pasos que realizará el SGBD para ejecutar una
sentencia SQL.
El SGBD construye un plan de ejecución que minimiza el uso de recursos. Así, trata de reducir
en la medida de lo posible el tiempo de ejecución de la consulta, ya sea minimizando el tiempo
de cada operación o maximizando el número de operaciones paralelas. Por último, el motor de
ejecución será el que ejecutará el plan trazado y obtendrá el resultado de la consulta a partir
de los datos almacenados.
Reflexión
Antes del estudio de la optimización física, se ofrecerá una visión de la estimación de costes para las
1.1.Descomposición de consultas
Esta es la primera fase del procesamiento de una consulta. Se comprueba que la consulta sea
sintáctica y semánticamente correcta y, si es el caso, se transforma la consulta expresada en
lenguaje SQL en un conjunto de operaciones de álgebra relacional.
2) normalización de la consulta,
3) análisis semántico, y
4) simplificación.
Se accede al diccionario de datos y se comprueba que todas las tablas y atributos que se
mencionan en la consulta realmente existen. También se comprueba que el usuario tiene los
derechos de acceso correspondientes y que las operaciones realizadas son adecuadas para aquel
tipo de objeto.
1. SELECT emplId
2. FROM Emp
3. WHERE deptId LIKE ';10';;
2) Por cada operación intermedia producida por una operación de álgebra relacional se crea un
nodo no hoja.
∏firstName;lastName((σ(hireDate>′01-SEP-07’)(Emp)) ⋈ (Emp:deptId=Dept:deptId) (σ(deptName=′IT’)(Dept)))
Ved también
Los derechos de acceso se estudian en el apartado 3 de este módulo didáctico.
1.1.2.Normalización de la consulta
Se evalúa el predicado de la cláusula WHERE, que a menudo suele ser lo bastante complejo
como para convertir la consulta en una de estas formas normalizadas:
Ejemplo
Ejemplo
1.1.3.Análisis semántico
En esta etapa se lleva a cabo un análisis semántico con el objetivo de rechazar las consultas
normalizadas que sean contradictorias o que no estén bien formuladas.
Una consulta incorrecta es aquella cuyos componentes, una vez formulada, no permiten la
generación de resultado, lo que puede suceder si falta alguna especificación de combinación.
Esta consulta se considera incorrecta porque las conexiones entre relaciones no están
completas, ya que se ha omitido la condición de combinación d.locId=l.locId.
Ejemplo de simplificación
1.2.Optimización semántica
La optimización semántica utiliza una técnica que emplea las restricciones especificadas en el
catálogo de la base de datos para reducir el espacio de búsqueda.
Suponiendo una restricción que indica que el salario debe ser superior a 500 euros, la consulta
que presentamos a continuación:
1. SELECT e.deptId
2. FROM Emp e, Dept d
3. WHERE e.deptId = d.deptId;
Dado que todos los valores de e.deptId deben ser valores de d.deptId, la consulta que
presentamos a continuación es equivalente a la anterior:
1. SELECT e.deptId
2. FROM Emp e;
1.3.Optimización sintáctica
Mediante la aplicación de diferentes reglas de transformación, el optimizador puede convertir
una expresión de álgebra relacional en otra expresión equivalente pero más eficiente. Para llevar
a cabo este proceso, se aplican las reglas de equivalencia entre las operaciones de álgebra
relacional, con el objetivo de encontrar una expresión equivalente.
1.3.1.Reglas de equivalencia
Las reglas de equivalencia y las estrategias de procesamiento heurístico que se utilizan para
reestructurar el árbol de operaciones de álgebra relacional son las siguientes:
3) En una secuencia de operaciones de proyección, solo hace falta la última proyección de la
secuencia.
Podéis consultar varios ejemplos de reglas de equivalencia en los anexos del apartado 4.
Combinaciones Theta
1) Realizar las operaciones de selección lo antes posible. Debido a que estas operaciones
reducen la cardinalidad de la relación resultante, utilizaremos la regla 1 para “conectar en
cascada” todas las operaciones de selección. Después aplicaremos las reglas 2, 4, 6 y 9,
definidas anteriormente, referentes a la conmutatividad de la selección con operaciones unarias
y binarias. Las operaciones de selección aparecerán cerca de los nodos hoja del árbol indicando
que son las primeras en realizarse. Se mantendrán juntos los predicados referentes a la misma
relación.
3) Emplear la asociatividad de las operaciones binarias para reordenar los nodos hoja. El
objetivo es que las operaciones de selección más restrictivas se ejecuten primero.
Ved también
En los grandes SGBD, el coste más importante corresponde al acceso a disco, puesto que es el
dispositivo más lento. Así pues, para comparar las diferentes estrategias de manera relativa solo
se utilizará el número de páginas de disco a las que se accede (por operaciones de
lectura/escritura) en el peor de los casos.
Para tener una idea de los parámetros asociados a los accesos a disco, podemos suponer que tT = 0,1
3) nBlocks(R): número de bloques requeridos para guardar todas las tuplas de R, donde:
nBlocks(R) = nTuples(R)/blockFactor(R)
4) CSA(R): cardinalidad de la selección del atributo. Es el número medio de filas que cumplen
una condición sobre el atributo A.
CSA(R) = 1
b) Si los valores están distribuidos de forma uniforme:
CSA(R) = nTuples(R)/nDistinctA(R)
c) Para A ⊂ (a1, ... , an), donde n es el número de elementos del conjunto (a1, ... , an):
e) Para la conjunción, A ∧ B:
Otro dato importante es el número de páginas de memoria, M, que se pueden utilizar como
memoria intermedia.
1.4.2.Operación de selección
Hay muchos algoritmos para la selección de valores en una tabla. A continuación, hacemos un
repaso de los más importantes e indicamos su coste:
1) Búsqueda lineal sobre ficheros no ordenados: con este algoritmo se exploran todas las
páginas que forman la tabla y se comprueba cada una de las filas para ver si contiene el valor
adecuado del atributo:
CE = nBlocks(R)
CE = nBlocks(R)/2
4) Igualdad de clave primaria con un índice B+ tree: si la búsqueda se hace con respecto a
la igualdad de una clave primaria sobre la cual se ha definido un índice con estructura de árbol
B+, el número de páginas leídas será igual al número de niveles del árbol más la página de los
datos, es decir:
CE = nLevelsA(I) + 1
6) Igualdad con un índice secundario: si se trata de un índice que no representa una clave
candidata y, por lo tanto, pueden existir diferentes valores que cumplen la igualdad, se deberán
leer todas las páginas que los contengan y el coste será:
CE = nLevelsA(I) + CSA(R)/blockFactor(R))
Para lograr el propósito de este ejemplo, se dan los siguientes supuestos referentes a la
relación Emp descrita anteriormente en el esquema de la base de datos COMPANY.
nDistinctjobId(Emp) = 50) ⇒ CSjobId(Emp) = 60
nDistinctfirstName(Emp) = 3000) ⇒ CSfirstName(Emp) = 1
nDistinctsalary(Emp) = 500) ⇒ CSsalary(Emp) = 6
minsalary(Emp) = 10.000
maxsalary(Emp) = 50.000
nLevelsjobId(I) = 2
nLevelssalary(I) = 2
nLfBlockssalary(I) = 50
CSempId(Emp) = 1
3) σ(jobId=′prog′)(Emp): el atributo del predicado es una clave externa con un índice de clustering, por
lo tanto el coste será CE = 2 + [60/30] = 4 bloques. La cardinalidad estimada será:
CSdeptIp(Emp) = 60
4) σ(salary>20.000)(Emp). El predicado implica una búsqueda dentro del rango del atributo salary que
tiene un índice árbol B+, por lo que para calcular el coste estimado se realizará el cálculo CE = 2
+ [50/2] + [3.000/2] = 1.527. La cardinalidad estimada será:
CE=nLevelsA(I) + SCA(R)
Considerando una distribución uniforme, se puede estimar un acceso a la mitad de los bloques y
a la mitad de las tuplas, el coste estimado sería:
B+ tree
Un árbol B+ es un tipo de estructura de datos en forma de árbol donde toda la información se guarda
en las hojas, ya que los nodos internos solo contienen claves y punteros. De este modo, se pueden
crear índices multinivel y dinámicos, con un límite máximo y mínimo en el número de claves por nodo.
1.4.3.Operación de ordenación
Muchas veces resulta necesario ordenar los datos de una tabla, ya sea porque se desea el
resultado ordenado o porque se utiliza para implementar una operación de combinación de
forma más eficiente.
En la primera fase, el algoritmo divide la relación en N = [nBlocks(R)/M] partes, las carga
sucesivamente en la memoria para ordenar cada una de ellas y crear un archivo de
secuencias Si.
1) En el primer bloque de cada archivo de secuencia, se lee la primera tupla de cada bloque,
para proceder a la fusión ordenada de los primeros bloques de cada secuencia.
2) En caso de que el contenido del bloque se haya agotado, se lee el siguiente bloque del mismo
archivo de secuencias hasta agotar todos los bloques de cada secuencia, lo cual implicará que se
ha obtenido la ordenación.
3) En el caso de que el número de secuencias N todavía sea superior a M, se fusionan las M – 1
primeras secuencias para formar otra secuencia ordenada. En este punto, se ha reducido el
número de secuencias en M – 1.
4) En caso de que el número de secuencias sea menor que M, entonces se puede proceder a la
fusión definitiva. En caso contrario, se repite el procedimiento con otras M – 1 secuencias hasta
obtener un número de secuencias menor que M.
CE = 2[nBlocks(R)/nBlocks(S)] +
+ [nBlocks(R)/nBlocks(S)](2[logM–1[(nBlocks(R)/M] – 1])
Marcos de página
1.4.4.Operación de proyección
Una proyección implica dos operaciones: eliminar los atributos no deseados y eliminar, si es
preciso, las tuplas repetidas que se han generado con la cláusula DISTINCT.
Se puede implementar fácilmente la eliminación de duplicados empleando la ordenación de las
tuplas y utilizando como clave de ordenación los atributos resultantes de la proyección. Las
tuplas idénticas aparecen contiguas durante la operación de ordenación y, por lo tanto, se
pueden eliminar todas menos una. El coste estimado en el peor de los casos es el mismo que el
coste estimado en el peor de los casos en la operación de ordenación.
Observación
Si dentro de la lista de atributos de la proyección se incluyen todos los que forman la clave primaria,
no se producirán duplicados.
1.4.5.Operación de combinación
Las operaciones de combinación, aparte de las del producto cartesiano, suelen ser las que
consumen más tiempo durante el procesamiento de consultas, por lo que marcarán de manera
importante la eficiencia global del SGBD.
Los algoritmos más importantes son: la combinación de ciclo anidado, la combinación de ciclo
anidado indexado, la combinación por ordenación por fusión, la combinación por función
resumen y la combinación por agrupación (clúster).
Podemos apreciar claramente que, para reducir el coste, es preciso que la primera relación que
se utiliza en el bucle externo ocupe el menor número posible de bloques.
Una mejora consiste en leer tantos bloques como sea posible de la relación más pequeña, y
reservar un bloque para la relación interna y otro para la relación resultante. Si la memoria
intermedia (3) permite almacenar un número de bloques, nBuffer, entonces se leen (nBuffer – 2)
bloques de R y un bloque de S cada vez. Con esta técnica, la estimación del coste sería:
CE = nBlocks(R) + nBlocks(S)
En inglés, buffer.
(3)
Si se tiene un índice árbol B+ sobre el atributo A, para encontrar el coste de la consulta, será
necesario conocer: nLevelsA(I), el número de niveles del árbol B+ del índice I sobre el atributo A;
y CSA(R), la cardinalidad de selección del atributo A de la tabla R y del número de filas que caben
en una página blockFactor(R). Si se trata de un índice sobre una clave candidata de R, el coste
será:
En inglés, hash function.
(5)
CE = nBlocks(R) + nBlocks(S)
Si es necesario ordenar una de las relaciones, entonces hay que añadir el coste de ordenación:
En inglés, sort-merge join.
(6)
Para lograr el propósito de este ejemplo, se dan los siguientes supuestos referentes a las
relaciones Emp y Jobs.
nTuples(Emp) = 3.000
blockFactor(Emp) = 30) ⇒ nBlocks(Emp) = 100
nTuples(Jobs) = 50
blockFactor(Jobs) = 10) ⇒ nBlocks(Jobs) = 5
(Emp ⋈ Emp.jobId=Jobs.jobIdJobs)
Tuplas desordenadas:
Tuplas ordenadas:
En inglés, hash join.
(7)
Funciones resumen
Una función resumen es un algoritmo u operación que permite obtener un sumario o resumen a partir
de un conjunto de datos. Este sumario o resumen está asociado a los datos originales, y cualquier
Cuando se realiza la unión de R y S (R ∪ S), se realiza una lectura concurrente de las
tuplas de las dos relaciones, y si se detecta la misma tupla en ambas, se elimina el
duplicado.
1.4.7.Agregación
Cualquier operación de agrupación se puede implementar de una manera parecida a la
eliminación de duplicados, pero en lugar de eliminar las tuplas que tienen el mismo valor, se
reúnen por grupos y se aplica la operación correspondiente para obtener el resultado.
Operaciones de agrupación
1.5.Optimización física
El optimizador físico de consultas es el componente del SGBD que prepara los planes de
ejecución de las consultas para que se lleven a cabo en el mínimo tiempo. Hay varias
posibilidades para conseguirlo:
otras posibilidades.
Los algoritmos de optimización física se pueden clasificar en dos grandes familias:
combinación se puedan hacer completamente en la memoria. Habrán cambiado todos los tiempos de
1.5.1.Optimización heurística
Para poder realizar una optimización heurística, es preciso que el SGBD tenga definido un orden
de eficiencia para las diferentes operaciones lógicas y pueda escoger aquel que suele tener un
coste más bajo.
Como la mayoría de las opciones de diseño, la optimización heurística tiene virtudes y defectos:
su principal virtud es que no hay que efectuar ningún tipo de cálculo, la obtención de un buen
plan de ejecución se realiza de manera inmediata; y el principal defecto es que a veces los
planes propuestos pueden diferir mucho de los óptimos.
En una base de datos compleja, una consulta puede involucrar varias tablas, cada una con
varios índices y condiciones de selección complejas. Esta complejidad significa que podría haber
una gran cantidad de opciones resultantes, y el sencillo conjunto de reglas utilizadas por el
optimizador basado en reglas no podría diferenciar lo suficientemente bien las elecciones como
para asegurar la mejor elección.
Otra de las debilidades del optimizador basado en reglas es la resolución de las opciones de
optimización en caso de obtener dos o más planes de ejecución con el mismo coste. En este
caso, el optimizador considera la sintaxis de la sentencia SQL para resolver el empate. La ruta
de ejecución ganadora se basa en el orden en que las tablas se presentan en la sentencia SQL.
Se puede entender el impacto potencial sobre la elección del orden en las tablas observando una
situación sencilla en la que se hace una combinación de una tabla pequeña con diez
registros, SmallTable, con una tabla con diez mil, LargeTable.
1. SELECT *
2. FROM SmallTable s, LargeTable l
3. WHERE s.id = l.id;
1. SELECT *
2. FROM LargeTable l, SmallTable s
3. WHERE l.id = s.id;
El tamaño de las tablas y el orden en que éstas se leen tiene repercusión en el tiempo de
ejecución de la consulta:
Si el optimizador elige para leer SmallTable en primer lugar, el SGBD lee las diez filas y
después LargeTable diez veces para encontrar las filas coincidentes de cada una de
las diez filas.
Si el optimizador elige LargeTable en primer lugar, el SGBD tiene que leer las diez mil
filas de LargeTable y después las de SmallTable diez mil veces para encontrar los
registros coincidentes.
Independientemente del orden en que aparecen las tablas en la sentencia SQL, gracias a la
información obtenida a partir de las estadísticas, el optimizador escogerá la tabla más grande
como si esta apareciera la última en la sentencia, es decir, más a la derecha.
Los parámetros estadísticos que los SGBD almacenan más a menudo son los siguientes:
1) Tabla: número de filas, número de páginas, número de páginas vacías, longitud media de
una fila.
En el SGBD comercial Oracle, se puede emplear el paquete PL/SQL DBMS_STATS para generar y
gestionar las estadísticas de las tablas, columnas, índices, particiones y otros objetos de la base
de datos.
Por ejemplo, podemos recopilar estadísticas para el esquema ‘COMPANY’ utilizando la siguiente
instrucción SQL, donde también se especifica en el segundo parámetro que calcule
automáticamente el alcance del tamaño de la muestra.
1. EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS('COMPANY',
2. DBMS_STATS.AUTO_SAMPLE_SIZE);
Ved también
Algunos de los parámetros que almacenan los estadísticos se ven en el subapartado 1.4.1. de este
módulo didáctico.
Un histograma es una estructura de datos que se puede utilizar para mejorar las estimaciones
de las que puede disponer el optimizador.
Reflexión
También se puede hacer que Oracle recopile las estadísticas al crear o reconstruir índices
Un histograma recoge un conjunto de valores junto con sus frecuencias relativas, y proporciona
al optimizador las mejores estimaciones en presencia de una distribución uniforme. Existen
dos tipos de histogramas:
Histograma equilibrado de ancho, que divide los datos en un número fijo de rangos
con el mismo ancho y para cada uno de ellos se realiza el cálculo del número de
valores que les pertenece.
Reflexión
En Oracle, es el usuario quien crea y mantiene los histogramas para las columnas apropiadas
Sustituir las operaciones lógicas en un árbol de álgebra relacional por operadores físicos produce
una estrategia de ejecución, plan de evaluación de la consulta o plan de acceso para la
consulta.
2) sortScan(R, L): exploración ordenada. Las tuplas de R se leen por orden de acuerdo con los
criterios de ordenación especificados en la lista de atributos L.
Además, la estrategia de ejecución soporta una interfaz iteradora uniforme que permite ocultar
los detalles de implementación de cada operador:
1) open: inicia el estado del iterador antes de extraer la primera tupla y asigna un espacio de
memoria intermedia para las entradas y salidas. Se pueden indicar varios parámetros que
permitan definir condiciones de selección de forma que modifiquen el comportamiento del
operador.
3) close: una vez finalizado el proceso de iteración, es decir, una vez generadas todas las
salidas solicitadas, el operador realiza las operaciones de limpieza y desasigna espacio de
memoria.
Al definir este tipo de operadores, el sistema puede implementar de manera natural el concepto
de encarrilamiento o de materializar los valores intermedios.
1) Materialización: con este enfoque se inicia la evaluación para las operaciones de nivel más
bajo a partir del árbol de operadores. Se ejecutan las operaciones con los algoritmos estudiados
y después se almacenan los resultados en relaciones temporales. Así pues, el coste de toda la
expresión es la suma de los costes de cada una de las operaciones más el coste de los
resultados intermedios en disco.
En inglés, pipelining.
(8)
Encarrilamiento
El encarrilamiento, o pipelining, como se ve más adelante, es una técnica que consiste en aprovechar
la salida de una operación como entrada de la siguiente con el objetivo de incrementar la eficiencia de
En inglés, thread.
(9)
Esta sentencia resulta bastante útil cuando se desea analizar por qué la eficiencia de una
consulta no es la esperada. La salida de esta sentencia se escribe de manera predeterminada en
la tabla PLAN_TABLE.
Ved también
Oracle.
2.Procesamiento de vistas
Desde un punto de vista teórico, una vista se puede definir como el resultado dinámico de una o
más operaciones relacionales sobre tablas para producir una relación nueva.
Las vistas son relaciones virtuales que sólo están representadas por su nombre y su definición;
no existen físicamente en la base de datos. Sólo sirven a partir del momento en que el usuario
las utiliza.
El estándar SQL
Desde que el lenguaje SQL fue aceptado como un estándar, en primer lugar por el ANSI en 1986 y
después por la ISO en 1987, se han ido añadiendo nuevas funcionalidades y características, que se
La cláusula WITH CHECK OPTION asegura que nunca podremos actuar sobre partes de una tabla
que no están a la vista. Si se incluye la cláusula LOCAL, se valida la integridad de la vista para
aquellas operaciones de inserción o actualización que se efectúen, mientras que si se utiliza la
cláusula CASCADED, también se valida la integridad de todas las otras vistas que dependen de
ella.
De manera opcional, se puede asignar un nombre a las diferentes columnas de la vista. En caso
contrario, las columnas tomarán el mismo nombre que tienen en la subconsulta. Si la
subconsulta incluye columnas calculadas o funciones, será imprescindible definirles un nombre.
Fijaos en que, tal como se puede ver en el tercer ejemplo, en la subconsulta de una vista puede
aparecer otra vista.
1. UPDATE View01
2. SET salary = 45000
3. WHERE salary = 29000;
Se daría el caso inverosímil de que se ocultaría una fila a la vista. Una situación parecida se
daría si se realizara la siguiente inserción:
1. INSERT INTO View01
2. VALUES (';John';, ';Smith';, ';12/3/2012';, 50000);
Si la vista se hubiera creado con la cláusula WITH CHECK OPTION, las operaciones se habrían
comprobado antes para asegurar que las nuevas filas insertadas o actualizadas cumpliesen la
condición de la vista.
Aunque una vista no ocupa mucho lugar en la base de datos, recordad que sólo se trata de una
definición y que también se puede destruir.
Con la sentencia siguiente destruiremos la primera de las vistas creada en el ejemplo anterior:
se convertiría en lo siguiente:
La consulta que realmente se ejecuta con esta estrategia es mucho más compleja que la que se
plantea inicialmente, y esta complejidad hará que las consultas requieran mucho tiempo de
ejecución. El colmo de la ineficiencia se da cuando hay que hacer varias consultas seguidas
sobre una misma vista. También puede ser difícil la conversión en caso de consultas muy
complejas.
La estrategia de implementación de vistas por reescritura también se conoce con el nombre de cálculo
Según esta estrategia, el caso de mínima eficiencia que presentaba la primera estrategia se
transformaría en máxima eficiencia, dado que sólo tendría que calcular la tabla una única vez.
Cabría esperar de un buen SGBD que utilizara la primera estrategia para las consultas sobres
vistas simples y la segunda para las complejas.
2.2.Actualización de vistas
Las vistas siempre se pueden consultar, pero no siempre se pueden actualizar. Consideremos,
por ejemplo, una tabla con los datos de los empleados y una vista con el nombre del
departamento al que están asignados y el salario medio del departamento. ¿Qué significado
tendría aumentar un 10% la media de los salarios de un departamento? Este aumento se puede
conseguir de muchas formas, subiendo y bajando los salarios de los diferentes miembros del
departamento. Por lo tanto, estamos ante una ambigüedad.
De una manera más formal, sea D una base de datos y V, una vista que se construye con la
función V = F(D). Si se hace una operación de actualización A sobre la vista A(V) = A(F(D)),
habrá que encontrar una operación de actualización A’ tal que A(V) = F(A’(V)). En muchos casos
habrá muchas operaciones A’ que cumplirán la igualdad anterior, aunque dejarán la base de
datos en un estado diferente.
Solo es posible asegurar que una vista será actualizable si está construida sobre una única tabla
y sus atributos contienen una clave candidata de la tabla original. Las vistas definidas sobre más
de una tabla acostumbran a no ser actualizables. Las vistas que incluyen cláusulas GROUP BY o
funciones agregadas nunca son actualizables.
Reflexión
Cualquier operación de actualización sobre una vista deberá respetar las restricciones de integridad
1. SELECT empId
2. FROM Emp
3. WHERE salary > 30000 OR deptId = 20
Ved también
Podéis consultar las consideraciones referentes a las vistas actualizables en el SGBD Oracle 11g en el
anexo.
2.2.1.Actualización con disparadores de sustitución
Existen varios mecanismos para romper las posibles ambigüedades en las acciones de
actualización sobre vistas, y se basan en el hecho de que se almacena el criterio de actualización
adecuado junto con la definición de la vista. El estándar SQL:2008 incorpora el uso de los
disparadores de sustitución (10) .
En este ejemplo se puede observar que, para actualizar el salario a un valor nuevo, el salario de
cada empleado se incrementa de forma proporcional al incremento que tendría la media de
salarios de todos los trabajadores. Si la política de actualización de salarios de nuestra
organización es proporcional, la actualización funcionará. Del mismo modo, si se cambia el
nombre de un departamento, se cambiará en la tabla correspondiente.
En inglés, triggers.
(11)
También podemos tener otra aplicación que “verá” la base de datos como si solo hubiera la
tabla DeptAvgSalaryView, sobre la cual puede borrar y actualizar gracias a los disparadores de
sustitución implementados, pero no podrá realizar ninguna acción de inserción.
Así, se logra la independencia lógica de los datos, puesto que en caso de que el esquema
conceptual sea modificado, la visión que tienen de él las diferentes aplicaciones no debe verse
afectada.
En este apartado se utilizan la notación y las facilidades del SGBD comercial Oracle 11g.
Para implementar el diseño externo, se podrán usar (según las posibilidades del SGBD) vistas,
En un supermercado, se podría tener una tabla de ventas, con la suma de las ventas de cada
sección. No haría falta insertar ninguna fila, sino que la tabla se actualizaría automáticamente a
medida que se fueran insertando filas.
En inglés, snapshots.
(12)
Las vistas materializadas son tablas que, además de almacenar la definición de la vista, también
almacenan los datos calculados (o derivados) de la ejecución de la sentencia SELECT definida en
la vista. Esta tabla se puede definir con los mismos parámetros de almacenamiento que una
tabla normal, como por ejemplo el espacio de tablas o la utilización de índices.
Cuando una sentencia SQL o PL/SQL accede a una vista materializada, el SGBD se dirige
directamente a los datos de la vista que están almacenados en lugar de utilizar los datos de las
diferentes tablas empleados en la definición de la vista.
Por otro lado, hay que considerar si la vista materializada se reutilizará en el futuro. Esto
implicará actualizar su contenido, puesto que probablemente el contenido de las tablas base será
modificado.
A la hora de determinar si hay que definir una vista como materializada o no, es preciso valorar
los costes de ejecutar la sentencia SQL que define la vista frente a los costes de almacenamiento
y actualización de la vista materializada.
Las vistas son simples definiciones que se utilizan cuando hace falta (para materializar o reescribir una
Hay que tener en cuenta que las vistas que usan funciones de
1) Actualización manual. Hay que definir la vista con la restricción ON DEMAND. El refresco se
produce cuando el usuario ejecuta manualmente algún proceso de actualización sobre la vista
materializada. Las actualizaciones manuales de las vistas materializadas se realizan utilizando el
paquete PL/SQL estándar DBMS_MVIEW.
Este paquete incluye un conjunto de funciones y procedimientos que permiten gestionar las vistas
Una vista se podría programar para que se actualice todos los días a una hora determinada
mediante el uso de las cláusulas START WITH y NEXT. La cláusula START WITH permite indicar
el momento de la primera actualización automática y NEXT indica el intervalo entre
actualizaciones automáticas.
ProductLine(idLine, description)
Products(productCode, productLine, description, priceEach),
{productLine} REFERENCES ProductLine(idLine)
Order(orderNumber, orderDate)
OrderDetail(orderNumber, orderLineNumber, productCode,
quantityOrdered), {orderNumber} REFERENCES Order(orderNumber)
La tabla derivada correspondiente a los ingresos realizados en los pedidos por línea de producto
se podría crear con la sentencia siguiente:
Siguiendo con la base de datos del supermercado del ejemplo anterior, imaginemos la consulta
siguiente:
Todos estos procedimientos y funciones admiten parámetros adicionales que se pueden consultar en
Las vistas materializadas siempre se calculan a partir de las tablas básicas y la única operación
que se puede hacer con ellas es la consulta; no tiene sentido hablar de actualización, borrado o
inserción. Dado que se acostumbran a usar para almacenar y precalcular datos agregados, a
menudo se denominan resúmenes.
En entornos distribuidos, las tablas derivadas se pueden utilizar para replicar datos en las diferentes
sedes, lo que permitiría sincronizar las actualizaciones sin crear ningún tipo de conflicto.
2.5.Tablas temporales
Otro tipo de tablas especiales son las tablas temporales, que deberían llamarse, de forma más
exacta, tablas de contenido temporal.
En las tablas temporales, el contenido tiene vigencia en el transcurso de una sesión (o una
transacción) y desaparece en el momento en que ésta finaliza.
Estas tablas son muy útiles para almacenar resultados intermedios de una transacción.
Consideremos la creación de la tabla siguiente, referente a las calificaciones obtenidas por los
alumnos en una asignatura:
Cuando se realice la primera inserción, la tabla se materializará y será posible trabajar con ella
hasta el momento en que se ejecute la cláusula COMMIT; en ese momento la tabla se destruirá
y solo permanecerá su definición en el diccionario de datos.
a) Independencia de los datos y las aplicaciones: Si se usan vistas como interfaz, se puede
llegar a una independencia completa entre la estructura real de los datos y la que ven las
aplicaciones. En cualquier momento se puede cambiar el nombre de una tabla, añadir nuevas
columnas o variar completamente su estructura. Todos estos cambios resultan invisibles para las
aplicaciones clientes. Solo habría que redefinir la interfaz, es decir, las vistas.
b) Simplificación del uso para el usuario: La utilización de las vistas permite tener
almacenadas consultas bastante complejas con múltiples combinaciones de tablas, condiciones y
funciones agregadas, y utilizarlas por medio de una consulta muy simple.
c) Mejora de la seguridad: El usuario no conoce las tablas y las columnas que forman
realmente la base de datos, de modo que ni siquiera puede intentar acceder a ellas; sólo tiene
noticia de aquellas información y estructura que se le dan a partir de las vistas.
d) Integridad de los datos: Con la cláusula WITH CHECK OPTION el usuario no puede llevar
datos fuera de los límites que tiene marcados; todos los cambios que haga sobre la vista (si es
actualizable) tendrán que dejar la fila consistente con las condiciones de la vista.
Pero no todo son ventajas; los inconvenientes más importantes son los siguientes:
3.La seguridad
En un sistema de información, generalmente, las diferentes aplicaciones y usuarios de la
organización utilizan un único conjunto de datos (base de datos corporativa) con el SGBD. Por
un lado, esto resuelve problemas de redundancia, inconsistencia e independencia entre los datos
y los programas, y por otro, hace que la seguridad se convierta en uno de los problemas más
importantes en estos entornos.
a) Liberación incorrecta de la información. Está causada por la lectura de datos por parte
de usuarios impropios mediante un acceso intencionado o accidental. En esta categoría se
incluyen las violaciones del secreto derivadas de deducir información confidencial a partir de
lecturas de información autorizada.
c) Denegación de servicios. Corresponde a acciones que puedan impedir que los usuarios
accedan a los datos o utilicen determinados recursos.
1) Amenazas no fraudulentas. Son accidentes casuales, entre los cuales se pueden distinguir
los siguientes:
Problemas de disponibilidad
saturación del sistema, la denegación de servicio (DoS) por parte de la red, etc.
2) Control de acceso. Son mecanismos que se cercioran de que los usuarios accedan sólo a los
lugares a los que están autorizados para ejecutar las acciones para las cuales han sido
autorizados.
4) Auditoría. Consiste en mecanismos para saber quién ha realizado qué, es decir, para llevar
un registro de quién lleva a cabo todos los cambios y consultas en la base de datos. Más que un
mecanismo para proporcionar seguridad, se trata de un mecanismo que permite monitorizar a
los usuarios del sistema.
Ved también
El control de acceso al SGBD Oracle 11g se puede consultar en el subapartado 4.3. de este módulo
didáctico.
3.1.Identificación y autenticación
Los sistemas de información y los datos que almacenan y procesan son recursos muy valiosos
que hay que proteger. Uno de los primeros pasos hacia la seguridad en un sistema de
información es la capacidad de verificar la identidad del usuarios. Este proceso está formado por
dos partes: identificación (ver quién es) y autenticación (comprobar que es quien dice ser).
La identidad tiene que ser única para que el sistema pueda diferenciarla entre los distintos
usuarios. Según los requisitos operacionales, una identidad puede describir a un individuo, a
más de un individuo o a uno o más individuos sólo una parte del tiempo.
1) Algo que conoce una persona: una contraseña, un número de identificación personal, etc.
2) Algo que posee una persona: una tarjeta, una clave, etc.
Estos métodos básicos se pueden emplear individualmente o se pueden combinar para obtener
un nivel de seguridad más alto.
A continuación presentamos algunos criterios que conviene tener en cuenta a la hora de elegir
una contraseña:
6) No escribir la contraseña en lugares a los que otra persona pueda acceder.
Las tarjetas dan mayor seguridad. Pueden ser simples trozos de plástico con una banda
magnética o incluso pueden incorporar chips, como hacen las tarjetas inteligentes. En ambos
casos, la contraseña personal tiene que coincidir con la que hay escrita en la tarjeta, o bien la
contraseña y cierta información de la tarjeta deben coincidir con la que hay en el ordenador.
Una diferencia importante entre la identificación y la autenticación es que las identidades son públicas,
gracias al cual una persona prueba que es realmente quien dice ser.
1) Autenticación por el mismo SGBD. Es la más utilizada, puesto que las cuentas son más
fáciles de controlar y gestionar y el mismo SGBD tiene recursos que permiten la administración
de pequeñas comunidades de usuarios.
En sistemas en los que se requiere un cierto nivel de seguridad, es habitual la utilización de sistemas
autenticación. El más conocido es Kerberos, el cual, utilizando diferentes técnicas de cifrado y emisión
de tiques (tickets), proporciona un buen nivel de seguridad para la mayoría de los sistemas.
En inglés, middleware.
(13)
3.2.Control de acceso
Se denomina control de acceso aquella parte del SGBD que tiene la función de asegurar que
los accesos al sistema se llevan a cabo de acuerdo con los modelos y reglas fijadas por la política
de protección.
El control de acceso controla la interacción (lectura, escritura...) entre los sujetos (usuarios,
aplicativos, procesos...) y los objetos a los que acceden.
1) Políticas de acceso: definen los principios según los cuales se autoriza a un usuario, se
deniega o se filtra un acceso específico a un objeto.
Filtrado
Usuario 1 ...
Usuario n ...
La intersección entre filas y columnas indica los derechos de cada usuario sobre cada objeto.
Una ampliación habitual de la tabla anterior consiste en incorporar los grupos de usuarios como
si se trataran de otro usuario y los privilegios sobre el sistema como si se trataran de un objeto.
La descentralización de las autorizaciones provoca que surjan problemas de propagación tanto
de autorizaciones como de revocaciones. Si un usuario M ha recibido una autorización de un
usuario N que tenía el derecho de administrar la seguridad sobre un objeto P, ¿qué derechos
tendrá el usuario M si a N se le revocan todos los permisos? El sistema deberá prever políticas
de autorización y revocación en cadena.
Los derechos del usuario pueden incluir el de administrar la seguridad del objeto.
Las políticas de control de acceso obligatorio se basan en la idea de que cada dato tiene un
nivel de clasificación (por ejemplo, muy secreto, secreto, confidencial...) y cada usuario tiene un
nivel de acreditación (con las mismas posibilidades que el nivel de clasificación). Los diferentes
niveles están ordenados de forma estricta e incremental: muy secreto > secreto > confidencial...
Las normas de funcionamiento del control de acceso obligatorio son las siguientes:
Un usuario puede ver un objeto sólo si su nivel de acreditación es mayor o igual que el
nivel de clasificación del objeto.
Los usuarios deberán tener, primero, el acceso discrecional autorizado y los privilegios
adecuados sobre el objeto de la base de datos antes de que se compruebe el sistema de acceso
obligatorio. El sistema de seguridad MAC se basa en el concepto de etiqueta.
Una etiqueta indica el nivel del usuario (acreditación) o del objeto (clasificación). Los valores
bajos denotan información no clasificada o menos sensible; los valores altos denotan
información más restrictiva o accesible a menos usuarios. Las etiquetas se pueden refinar
añadiendo otros subniveles.
En el ejército se podría tener una clasificación como la que se presenta en la tabla siguiente,
donde a cada etiqueta le corresponde un valor:
El sistema de gestión de bases de datos comprueba primero todas las autorizaciones de acceso
discrecional; en caso de que el usuario cumpla todos los niveles de seguridad, el sistema de
acceso obligatorio compara las etiquetas del usuario y del objeto para decidir quien tiene acceso.
El control de acceso obligatorio se suele utilizar en los SGBD que trabajan con información sensible
Aunque algunos productos comerciales proporcionan un nivel de seguridad B1, lo más normal es que
Ejemplo de cobertura
Un ejemplo de cobertura podría ser inferir la respuesta de una consulta ilegal a partir de una consulta
legal.
El significado de los privilegios que se pueden dar a un usuario sobre un objeto son los
siguientes:
Ejemplos de autorizaciones
Es relativamente frecuente asociar los mismos privilegios a diferentes usuarios, por ejemplo a
todo el departamento de contabilidad. Para facilitar este tipo de autorización, se usa el rol.
Un rol se puede definir como un conjunto de uno o más privilegios. Si se autoriza un rol a un
usuario, automáticamente se le autorizan todos los privilegios incorporados en el rol.
si a A se le quitan los privilegios que tenía, B y C se quedarán con los privilegios “abandonados”. Si la
opción elegida cuando se revocan los privilegios a A es CASCADE, los permisos de B y C también
serán revocados. Si la opción es RESTRICT, sólo se podrá revocar los permisos de A si previamente se
han eliminado los permisos candidatos a ser abandonados. Si no se utiliza ninguna de las opciones, B
y C se quedarán con los permisos, y se correrá el riesgo de que B vuelva a dar privilegios a A.
3.4.Auditoría
La auditoría es el registro y monitorización de algunas acciones específicas de usuarios sobre la
base de datos.
El administrador de la base de datos puede recoger datos sobre qué tablas se actualizan o
cuántos usuarios están conectados en momentos punta.
El trabajo de auditoría puede representar una sobrecarga superior al nivel del trabajo normal.
Auditar objetos. El sistema registrará cada vez que se realice alguna operación sobre un
objeto determinado.
Auditar sentencias sobre objetos, una versión combinada de las dos anteriores.
También se puede decidir si se desea un único registro por sesión, por sentencia o por acceso; y
si sólo se quiere registrar cuándo tiene éxito, cuándo fracasa o en ambos casos. La información
que suele registrar la auditoría es el nombre del usuario, el identificador de sesión, el
identificador de terminal, el nombre del objeto al que se ha accedido, la operación ejecutada o
que se ha intentado, el código completo de la operación, la fecha y la hora.
La creación de auditorías
Algunos SGBD incorporan sentencias SQL que permiten generar una auditoría de manera declarativa;
en otros casos habrá que crear disparadores que vayan rellenando las tablas de auditoría conforme se
producen acontecimientos.
Las normativas actuales también siguen la Directiva del Parlamento europeo 95/46 de 24 de
octubre, relativa a la protección de las personas físicas por lo que respecta al tratamiento de
datos personales y a la libre distribución de esos datos.
3) Consentimiento del afectado. Salvo que la ley disponga otra cosa, se requerirá el
consentimiento inequívoco de los afectados para el tratamiento de los datos de carácter
personal.
4) Datos especialmente protegidos. Los datos de carácter personal que revelen ideología,
afiliación sindical, religión y creencias sólo podrán ser objeto de tratamiento con el
consentimiento, expreso y por escrito, del afectado.
5) Datos relativos a la salud. Las instituciones y los centros sanitarios públicos y privados y
los profesionales correspondientes podrán proceder al tratamiento de los datos de carácter
personal relativos a la salud de las personas siempre que sean facilitados por el titular por
motivo de asistencia sanitaria.
Los datos de carácter personal objeto del tratamiento no se podrán utilizar para finalidades
6) Seguridad de los datos y deber de secreto. Tanto el responsable del fichero como el
encargado del tratamiento deberán adoptar las medidas técnicas y organizativas necesarias que
garanticen la seguridad de los datos de carácter personal y eviten la alteración, la pérdida o el
tratamiento o acceso no autorizados.
Impugnación de valoraciones
El afectado podrá impugnar los actos administrativos o las decisiones privadas que impliquen una
valoración de su comportamiento.
Derecho de acceso
Las actuaciones contrarias a la presente Ley pueden ser objeto de reclamación por pare de los
Los datos de carácter personal que hagan referencia a su origen racial, a la salud y a la vida sexual se
Para aplicar las medidas de seguridad correspondientes en los ficheros con datos de carácter
personal, deben observar los aspectos que se consideran a continuación.
Nivel básico
Todos los ficheros que contengan datos de carácter personal deben seguir las medidas de
seguridad del nivel básico.
Las medidas del nivel básico de seguridad se definirán en el documento de seguridad que
habrá elaborado e implementado el responsable del fichero. Este documento tendrá que incluir
los puntos siguientes:
a) El ámbito de aplicación del documento con especificación detallada de los recursos
protegidos.
d) La estructura de los ficheros que contengan datos de carácter personal y descripción de los
sistemas de información que los tratan.
g) La periodicidad con la que hay que sustituir las contraseñas de los usuarios.
h) El personal autorizado para conceder, modificar y/o alterar los accesos autorizados a los
datos y/o recursos, así como los criterios para realizar estas acciones.
i) El personal autorizado para acceder al lugar donde se almacenan datos de carácter personal.
Nivel medio
Los ficheros que contengan datos relativos a la comisión de infracciones penales y/o
administrativas, la Hacienda Pública y servicios financieros (solvencia patrimonial y crédito,
cumplimiento o incumplimiento de las obligaciones monetarias) tendrán que seguir las medidas
del nivel medio.
Las medidas de seguridad de nivel medio incluyen todas las del nivel básico y, además,
exigen el cumplimiento de los puntos siguientes:
El responsable de seguridad
Muy a menudo, el administrador de la base de datos (ABD) suele ser la persona responsable de la
Auditorías
c) Medidas que adoptar cuando un soporte que contenga datos de carácter personal esté a
punto de ser destruido o reutilizado.
d) Personal autorizado para acceder a los locales donde se encuentren físicamente ubicados los
sistemas de información con datos de carácter personal.
Nivel alto
Ficheros con datos cuyo contenido esté relacionado con la ideología, religión, creencias, origen
racial, salud o vida sexual seguirán las medidas del nivel alto.
Las medidas de seguridad de nivel alto incluyen todas las del nivel medio y, además, exigen
el cumplimiento de los puntos siguientes:
a) Los datos de carácter personal que se tengan que distribuir en cualquier tipo de soporte se
cifrarán.
b) Para cada acceso se guardará como mínimo la identificación del usuario, la fecha y la hora en
que se hizo el acceso, el nombre del fichero al que se ha accedido y el tipo de acceso.
d) Se cifrarán los datos de carácter personal que se transmitan por la red de
telecomunicaciones.
El documento de seguridad
El documento de seguridad deberá mantenerse siempre actualizado y deberá revisarse cada vez que
tendrá que adecuar siempre a la normativa vigente en materia de protección de datos de carácter
personal.
La página también dispone de una sección de FAQ (preguntas más frecuentes), que tiene el objetivo
de que el ciudadano pueda ejercer sus derechos y aclarar a las organizaciones cómo tienen que
4.Anexos
4.1.Reglas de equivalencia de operaciones de álgebra relacional
Las reglas de equivalencia se utilizan para reestructurar el árbol de operaciones de álgebra
relacional que se ha obtenido en el proceso de descomposición de la consulta.
A continuación, vamos a definir algebraicamente cada una de ellas y a mostrar algunos ejemplos
aclaratorios:
1) Las operaciones conjuntivas de selección pueden transformarse en una cascada de
operaciones individuales de selección.
Ejemplo
σ(salary>2.500)∧(hireDate>‘01-SEP-97’)(Emp) = σ(salary>2.500)(σ(hireDate>‘01-SEP-97’)(Emp))
Ejemplo
σ(salary>2.500)(σ(hireDate>‘01-SEP-97’)(Emp)) = σ(hireDate>‘01-SEP-97’)(σ(salary>2.500)(Emp))
∏L∏M∏N(R) = ∏L(R)
Ejemplo
∏empId∏empId;firstName;lastName(Emp) = ∏empId(Emp)
Ejemplo
∏empId;firstName;lastName(σ(salary>2.500)(Emp)) =
= σ(salary>2.500)(∏empId;firstName;lastName(Emp))
R ⋈ p S = S ⋈ p R
R × S = S × R
Ejemplo
Emp ⋈ (Emp:deptId=Dept:deptId)Dept = Dept ⋈ (Dept:deptId=Emp:deptId)Emp
σ(p∧q)(R ⋈ t S) = (σp(R)) ⋈ t (sq(S))
σ(p∧q)(R × S) = (σp(R)) × (σq(S))
Ejemplo
σ(deptName=‘IT’)∧(hireDate>‘01-SEP-97’)(Emp ⋈ (Emp:deptId=Dept:deptId)Dept) =
= σ(deptName=‘IT’)(Emp ⋈ (Emp:deptId=Dept:deptId) (σ(hireDate>‘01-SEP-97’)Dept)
∏ L1∪L2(R ⋈ t S) = (∏L1(R)) ⋈ t (∏L2(S))
Ejemplo
∏firstName;lastName;deptId;deptName((Emp) ⋈ Emp:deptId=Dept:deptId (Dept)) =
= (∏firstName;lastName;deptId(Emp)) ⋈ Emp:deptId=Dept:deptId (∏deptId;deptName(Dept))
8) Conmutatividad de la unión y de la intersección, pero no de la diferencia.
R ∪ S = S ∪ R
R ∩ S = S ∩ R
((R ⋈ S) ⋈ T) = (R ⋈ (S ⋈ T))
((R × S) × T) = (R × (S × T))
Ejemplo
((Emp ⋈ Emp:deptId=Dept:deptIdDept) ⋈ Dept:locid=Locs:locid Locs) =
= (Emp ⋈ Emp:deptId=Dept:deptId (Dept ⋈ Dept:locid=Locs:locid Locs))
Combinaciones Theta
estructuras de almacenamiento;
b) ALL_%. Contienen información sobre los objetos a los que el usuario tiene acceso.
Después del prefijo, el nombre describe la información a la que se accede cuando se hace una
consulta sobre la vista.
En inglés, tablespace.
(18)
En el SGBD Oracle 11g, el concepto de tabla key-preserved es fundamental para entender las
restricciones en las actualizaciones sobre vistas basadas en operaciones de combinación (JOIN).
Una tabla es key-preserved en una operación de combinación (JOIN) si cada valor clave de la
tabla también puede ser valor clave en el resultado del JOIN.
La propiedad key-preserved de una tabla en un JOIN no depende de los datos de las tablas, sino
que es una propiedad deducida a partir de su definición.
Ejemplo
Reflexión
Habrá que conocer muy bien las operaciones de actualización sobre las vistas que permite cada SGBD.
La columna table_name contiene los nombres de las tablas y de las vistas a las que el
usuario tiene acceso.
a) Cada columna de la vista tiene que corresponder con una columna de una tabla simple.
operador DISTINCT;
funciones de agrupamiento;
subconsultas en la cláusula SELECT;
d) Para que una vista basada en un JOIN sea actualizable, deben cumplirse todas las
condiciones siguientes:
La sentencia de actualización sólo puede afectar a una única tabla de las que forman
parte de la operación de combinación.
Para una sentencia INSERT, la vista no puede haber sido creada con WITH CHECK
OPTION, y todas las columnas para las que se insertarán valores deben de pertenecer
a una tabla key-preserved.
Para una sentencia UPDATE, la vista no puede haber sido creada con WITH CHECK
OPTION, y todas las columnas modificadas deben de pertenecer a una tabla key-
preserved.
Esta instrucción provoca la inserción sin ningún problema de una fila en la tabla Dept.
Ahora bien, si la vista EvenDeptView hubiera sido creada con la opción WITH CHECK OPTION, al
ejecutar cualquiera de las sentencias siguientes:
DESC [table_name|table_view]
La sintaxis es:
Rol DBA
El rol DBA es aquel papel, rol, que permite a un usuario realizar tareas que corresponden al
Cuando se instala el SGBD Oracle, automáticamente se crean los espacios de tablas SYSTEM, en los
que se almacenan los objetos del sistema, y SYSAUX, que se utiliza para hacer operaciones auxiliares
del sistema.
Para que un usuario pueda conectarse, hay que darle los derechos sobre lo que puede hacer, en
este caso atribuyéndole los privilegios de sistema CREATE SESSION.
DEFAULT NAMESPACE: esta cláusula indica en qué espacio de tablas se crearán por
defecto los segmentos del usuario en caso de que no se explicite ninguna
cláusula TABLESPACE en el momento de la creación del segmento. Si esta cláusula se
omite, permanece el espacio de tablas definido por defecto en la base de datos.
TEMPORARY NAMESPACE: esta cláusula indica en qué espacio de tablas se crearán por
defecto los segmentos de temporales del usuario, por ejemplo, creados en el
momento de ejecución de una operación de ordenación. Si esta cláusula se omite,
permanece el espacio de tablas temporal por defecto que haya definido en la base de
datos.
QUOTA: este concepto permite limitar el espacio que un usuario puede emplear en un
espacio de tablas. Esta funcionalidad sólo afecta a los usuarios que pueden crear
segmentos, y en ningún caso a los usuarios finales de una aplicación, dado que éstos
se limitan a manipular datos. Por defecto, los usuarios no tienen ninguna cuota en
ningún espacio de tablas, y en cambio los DBA tienen una cuota ilimitada en todos los
espacio de tablas. En todo caso, hay que evitar dar cuotas a los usuarios en
el TABLESPACE SYSTEM y en el SYSAUX.
Ejemplo
b) Modificación de un usuario
La sentencia SQL ALTER USER permite modificar un usuario. Las cláusulas son las mismas que
para la creación.
Ejemplo
C) Eliminación de un usuario
Reflexión
No se puede eliminar a un usuario que está conectado. En este caso nos devuelve el error ORA-01940.
También hay que recordar que con DROP USER no hay posibilidad de ROLLBACK porque es una
sentencia DDL.
4.3.2.Definición de perfiles
Un perfil es un conjunto de limitaciones de recursos identificadas por un nombre que pueden
asignarse a un usuario.
a) Creación de un perfil
1) Resticciones de recursos:
b) Modificación de un perfil
Los valores de los otros parámetros conservan su valor por defecto (UNLIMITED).
Para obtener información sobre usuarios y perfiles, se pueden consultar las siguientes vistas del
diccionario de datos:
4.3.3.Identificación de usuarios
Un usuario puede identificarse desde el SGBD Oracle o bien desde el propio sistema operativo.
1) Identificación por Oracle: el usuario se conecta a la base de datos utilizando un nombre y
una contraseña. Por ejemplo:
SQL > CONNECT joan/GNB9175$
Conectado.
el derecho a ejecutar una sentencia SQL general, por ejemplo de crear una tabla (este
concepto se denomina privilegio de sistema);
1) Privilegios de sistema
Un privilegio de sistema es el derecho a ejecutar una sentencia SQL en general. Cada sentencia
SQL presenta como mínimo un privilegio de sistema asociado que tiene el mismo nombre que la
sentencia SQL. Así pues, la sentencia SQL CREATE TABLE tiene un privilegio de sistema asociado
llamado CREATE TABLE, que otorga el derecho de crear una tabla en su propio esquema.
También hay que tener en cuenta que el privilegio CREATE ANY TABLE proporciona el derecho de
crear tablas en cualquier esquema de la base de datos.
Los privilegios de sistema son una fuente de riesgo, sobre todo aquellos relacionados con la
gestión de usuarios y sus derechos (CREATE USER, ALTERUSER, DROP USER, GRANT ANY
PRIVILEGE, GRANT ANY ROLE) y todos aquellos que permiten eliminar objetos (DROP ANY
TABLE, DROP TABLESPACE, etc.).
Los privilegios de sistema se utilizan principalmente para controlar el uso de las sentencias DDL;
por lo general, están destinados a administradores y/o desarrolladores y a la cuenta propietaria
de la aplicación, rara vez a usuarios finales.
Algunos privilegios
CREATE SESSION: otorga a un usuario el derecho a conectarse. Si un usuario carece
de este privilegio, se devuelve el error ORA-01045.
Es necesario que un usuario que quiera asignar o revocar un privilegio de sistema haya recibido
previamente:
el mismo privilegio con la cláusula WITH ADMIN OPTION, y
No hay cascada en la revocación de un privilegio de sistema que haya sido transmitido gracias a
la cláusula WITH ADMIN OPTION.
Ejemplo
También hay que tener en cuenta que la sentencia REVOKE permite revocar privilegios que un
usuario haya recibido directamente, no los que el usuario recibe vía PUBLIC. Se pueden revocar
todos los privilegios de sistema mediante la sentencia:
2) Privilegios de objeto
Un privilegio sobre un objeto es el derecho a acceder a un objeto de otro usuario. Por defecto, el
propietario es el único que tiene derecho a acceder al objeto.
Los privilegios de objeto se utilizan fundamentalmente para permitir a los usuarios finales de una
aplicación acceder a los objetos de la aplicación creados en una cuenta propietaria de la
aplicación. Para que otro usuario pueda acceder al objeto, es preciso que el propietario le asigne
un privilegio objeto:
datos.
datos*.
datos*.
programa.
Para los privilegios INSERT y UPDATE, se pueden especificar las columnas para indicar a cuáles
de ellas se limita el privilegio.
Para facilitar la escritura de sentencias y que el esquema propietario de los objetos sea
transparente, es necesario emplear los sinónimos. La existencia de un sinónimo, y aunque éste
sea público, no da ningún derecho sobre el objeto subyacente.
También hay que tener en cuenta que la sentencia REVOKE permite revocar privilegios que un
usuario haya recibido directamente, no los que el usuario recibe vía PUBLIC.
Se produce cascada en la revocación de un privilegio de objeto que haya sido transmitido gracias
a la cláusula WITH GRANT OPTION.
Ejemplo
El hecho de que un usuario disponga de un derecho sobre una vista no implica que tenga ningún
derecho sobre los objetos subyacentes a la vista. En cambio, por defecto, un programa
almacenado se ejecuta con los derechos del propietario. El comportamiento deseado se define
en el momento de la creación del programa almacenado gracias a la cláusula AUTHID.
La sintaxis de la cláusula AUTHID es:
1. AUTHID {CURRENT_USER|DEFINER}
DBA_TAB_PRIVS: muestra los privilegios objeto asignados a los usuarios o a los roles
sobre la totalidad del objeto.
También podemos obtener del diccionario de datos información sobre los privilegios objeto a través de
4.3.5.Roles
Dentro de una organización, los roles se crean para modelizar funciones de trabajo diferentes.
Los permisos para realizar determinadas operaciones están asignados a roles específicos. A los
usuarios del sistema se les asigna determinados roles, a través de los cuales adquieren los
diferentes permisos que les permiten ejercer funciones específicas en el sistema informático.
Dado que los usuarios no tienen permisos de forma directa, sino que los adquieren a través de
su rol, la gestión de los derechos de cada usuario se convierte simplemente en una cuestión de
asignar los roles apropiados a la cuenta del usuario, cosa que simplifica las operaciones más
comunes, como por ejemplo añadir un usuario o cambiar las funciones de un usuario.
El modelo basado en roles RBAC define las siguientes tres normas primarias:
2) Autorización de rol: es necesario que el rol activo de un sujeto esté autorizado por el
sujeto. Junto con el artículo 1, esta norma garantiza que los usuarios puedan asumir roles sólo
para los cuales están autorizados.
Como restricciones adicionales, los roles se pueden combinar en una jerarquía de niveles, donde
los roles de nivel superior asumen los permisos de propiedad de sus subroles.
Figura 4
Los privilegios se pueden asignar directamente a los usuarios o mediante roles. El uso de RBAC
para administrar los privilegios de usuario está ampliamente aceptado como una buena práctica.
Oracle permite modelizar RBAC.
Reflexión
En el momento de creación del rol es posible precisar con qué mecanismo se podrá activar, ya
sea mediante una contraseña, con autenticación externa (por ejemplo, mediante el sistema
operativo) o mediante un paquete.
Reflexión
Un usuario puede tener varios roles, en cuyo caso los privilegios se acumulan (no hay efecto
“negativo”).
Los requisitos y la sintaxis referentes a la revocación de un rol a un usuario o a otro rol y sobre
la eliminación de un rol son parecidos a los explicados anteriormente.
Un rol asignado a un usuario se activa por defecto de forma automática en el momento de la
conexión del usuario. Si el usuario ya estaba conectado en el momento de la asignación, la
activación inmediata del rol no es automática, sino que hay que activar el rol con la
sentencia SET ROLE.
Disponer de la posibilidad de emplear diferentes roles sin que estén activos al mismo tiempo es
interesante porque:
los roles protegidos con contraseña se pueden asignar a los usuarios aunque
permanezcan inactivos y, sin dar la contraseña al usuario, encargar a las aplicaciones
la activación de los roles, proporcionando las contraseñas cuando sea necesario.
1. SET ROLE {role_name [IDENTIFIED BY password][ ,... ]|ALL {EXCEPT role_name[ , ...
]|NONE};
varias vistas del diccionario de datos que permiten obtener información sobre los roles:
DBA_ROLES: listado de los roles existentes en la base de datos.
Resumen
En este módulo hemos estudiado el procesamiento de consultas y vistas, así como la seguridad
en las bases de datos.
Hemos visto que es responsabilidad del SGBD transformar la consulta efectuada por un usuario
en otra equivalente pero que se pueda calcular de una forma más eficiente. Este proceso de
búsqueda de una buena estrategia para realizar el procesamiento de una consulta recibe el
nombre de optimización de consultas. En primer lugar se comprueba la correctitud semántica y
léxica de la consulta SQL, y después se transforma en un árbol que permite su análisis y
optimización. Después se decide cuál es la mejor estrategia de implementación física.
Una vista es una relación virtual que no existe físicamente en la base de datos, sino que se
genera cada vez que un usuario efectúa una solicitud. El mecanismo de las vistas contribuye a la
seguridad al permitir ocultar los detalles de la base de datos a ciertos usuarios. Con el uso de
disparadores de sustitución se puede conseguir que las vistas sean actualizables.
Glosario
amenaza f
Cualquier situación o suceso intencionado o accidental que pueda afectar de manera
adversa al sistema y, en consecuencia, a la organización.
autenticación f
Mecanismo por el cual se determina si un usuario es quien dice ser.
autorización f
Concesión de un derecho o privilegio que permite a un sujeto acceder legítimamente al
sistema o a un objeto del sistema.
cifrado m
Codificación de datos mediante un algoritmo especial que provoca que estos datos no
sean legibles para ningún programa que no disponga de la clave de descifrado.
heurístico -a adj.
Cualidad de los métodos que utilizan el razonamiento y las experiencias pasadas para
encontrar la mejor solución a un problema.
optimización f
Proceso por el cual se transforma una consulta en otra equivalente pero más eficiente.
La optimización se puede realizar en el ámbito semántico, sintáctico y físico.
plan de ejecución m
Conjunto de operaciones (lógicas o físicas) necesarias para obtener el resultado de una
consulta.
registro m
Proceso de mantener un diario donde se almacenen los cambios efectuados en la base
de datos con el objetivo de realizar la recuperación de manera efectiva en caso de
quiebra del sistema.
vista f
Resultado dinámico de una o más operaciones relacionales sobre una base de datos con
el objetivo de producir otra relación.
Bibliografía
Connolly, T.; Begg, C. (2005). Sistemas de bases de datos (4.ª ed.). Madrid: Pearson.
Lorentz, D.; Roeser, M. B. (2011). Oracle database SQL language reference, 11g Release 2.
Oracle.
Weinberg, P.; Groff, J.; Oppel, A. (2009). SQL. The complete reference (3.ª ed.). McGraw-
Hill.