Es muy importante impedir situaciones que hagan que los datos no sean accesibles, o que existan datos almacenados que no se refieran a objetos o entidades existentes, etc. El modelo relacional también provee mecanismos para mantener la integridad. Podemos dividir estos mecanismos en dos categorías:
En cuanto a las restricciones estáticas, las más importantes son las que afectan a las claves primarias.
Ninguna de las partes que componen una clave primaria puede ser NULL.
Que parte de una clave primaria sea NULL indicaría que, o bien esa parte no es algo absolutamente necesario para definir la entidad, con lo cual no debería formar parte de la clave primaria, o bien no sabemos a qué objeto concreto nos estamos refiriendo, lo que implica que estamos tratando con un grupo de entidades. Esto va en contra de la norma que dice que cada tupla contiene datos sólo de una entidad.
Las modificaciones de claves primarias deben estar muy bien controladas.
Dado que una clave primaria identifica de forma unívoca a una tupla en una relación, parece poco lógico que exista necesidad de modificarla, ya que eso implicaría que no estamos definiendo la misma entidad.
Además, hay que tener en cuenta que las claves primarias se usan frecuentemente para establecer interrelaciones, lo cual implica que sus valores se usan en otras relaciones. Si se modifica un valor de una clave primaria hay que ser muy cuidadoso con el efecto que esto puede tener en todas las relaciones en las que se guarden esos valores.
Existen varias maneras de limitar la modificación de claves primarias. Codd apuntó tres posibilidades:
Cada SGBD puede implementar alguno o varios de estos métodos.
La integridad referencial se refiere a las claves foráneas. Recordemos que una clave foránea es un atributo de una relación, cuyos valores se corresponden con los de una clave primaria en otra o en la misma relación. Este mecanismo se usa para establecer interrelaciones.
La integridad referencial consiste en que si un atributo o conjunto de atributos se define como una clave foránea, sus valores deben existir en la tabla en que ese atribito es clave principal.
Las situaciones donde puede violarse la integridad referencial es en el borrado de tuplas o en la modificación de claves principales. Si se elimina una tupla cuya clave primaria se usa como clave foránea en otra relación, las tuplas con esos valores de clave foránea contendrán valores sin referenciar.
Existen varias formas de asegurarse de que se conserva la integridad referencial:
Veremos con mucho más detalle como se implementan estos mecanismos en MySQL al estudiar el lenguaje SQL.
Se trata de un concepto que se aplica a interrelaciones N:1 ó 1:1, que nos ahorra la creación de una relación. Supongamos las siguientes relaciones, resultado del paso del ejemplo 2 del modelo E-R al modelo relacional:
Libro(ClaveLibro, Título, Idioma, Formato, Categoría) Editado_por(ClaveLibro, ClaveEditorial) Editorial(ClaveEditorial, Nombre, Dirección, Teléfono)
Cada libro sólo puede estar editado por una editorial, la interrelación es N:1. En este caso podemos prescindir de la relación Editado_por añadiendo un atributo a la relación Libro, que sea la clave primaria de la editorial:
Libro(ClaveLibro, Título, Idioma, Formato, Categoría, ClaveEditorial) Editorial(ClaveEditorial, Nombre, Dirección, Teléfono)
A esto se le denomina propagación de la clave de la entidad Editorial a la entidad Libro.
Por supuesto, este mecanismo no es válido para interrelaciones de N:M, como por ejemplo, la que existe entre Libro y Autor.
Para ilustrar el paso del modelo E-R al modelo relacional, usaremos los mismos ejemplos que en el capítulo anterior, y convertiremos los diagramas E-R a tablas.
Empecemos con el primer ejemplo:
Sólo necesitamos dos tablas para hacer la conversión:
Estación(Identificador, Latitud, Longitud, Altitud) Muestra(IdentificadorEstacion, Fecha, Temperatura mínima, Temperatura máxima, Precipitaciones, Humedad mínima, Humedad máxima, Velocidad del viento mínima, Velocidad del viento máxima)
Este ejemplo es muy simple, la conversión es directa. Se puede observar cómo hemos introducido un atributo en la relación Muestra que es el identificador de estación. Este atributo se comporta como una clave foránea.
Este ejemplo es más complicado, de modo que iremos por fases. Para empezar, convertiremos los conjuntos de entidades en relaciones:
Libro(ClaveLibro, Título, Idioma, Formato, Categoría) Tema(ClaveTema, Nombre) Autor(ClaveAutor, Nombre) Editorial(ClaveEditorial, Nombre, Dirección, Teléfono) Ejemplar(ClaveLibro, NúmeroOrden, Edición, Ubicación) Socio(ClaveSocio, Nombre, Dirección, Teléfono, Categoría)
Recordemos que Préstamo es una entidad compuesta:
Préstamo(ClaveSocio, ClaveLibro, NúmeroOrden, Fecha_préstamo, Fecha_devolución, Notas)
La entidad Ejemplar es subordinada de Libro, es decir, que su clave principal se construye a partir de la clave principal de Libro y el atributo NúmeroOrden.
Ahora veamos la conversión de las interrelaciones:
Trata_sobre(ClaveLibro, ClaveTema) Escrito_por(ClaveLibro, ClaveAutor) Editado_por(ClaveLibro, ClaveEditorial)
Ya vimos que podemos aplicar la propagación de claves entre conjuntos de entidades que mantengan una interrelación N:1 ó 1:1. En este caso, la interrelación entre Libro y Editorial cumple esa condición, de modo que podemos eliminar una interrelación y propagar la clave de Editorial a la entidad Libro.
El esquema final queda así:
Libro(ClaveLibro, Título, Idioma, Formato, Categoría, ClaveEditorial) Tema(ClaveTema, Nombre) Autor(ClaveAutor, Nombre) Editorial(ClaveEditorial, Nombre, Dirección, Teléfono) Ejemplar(ClaveLibro, NúmeroOrden, Edición, Ubicación) Socio(ClaveSocio, Nombre, Dirección, Teléfono, Categoría) Préstamo(ClaveSocio, ClaveLibro, NúmeroOrden, Fecha_préstamo, Fecha_devolución, Notas) Trata_sobre(ClaveLibro, ClaveTema) Escrito_por(ClaveLibro, ClaveAutor)
© Enero de 2005 Salvador Pozo, salvador@conclase.net