Las tablas no son elementos aislados, sino que suelen estar relacionadas entre sí. Para ello se utilizan campos como enlaces y se definen un tipo de claves llamadas ajenas. En esta unidad repasaremos los conceptos de relación y de clave ajena, así como la creación y utilización de relaciones entre diferentes tipos de tablas.
Tras crear tablas diferentes en la base de datos, necesitamos una forma de indicarle a Base cómo debe volver a combinar esa información.
El primer paso de este proceso es definir relaciones entre las tablas. Una vez realizada esta operación, podemos crear consultas, formularios e informes para mostrar información de varias tablas a la vez.
Una relación hace coincidir los datos de los campos clave (normalmente un campo con el mismo nombre en ambas tablas). En la mayoría de los casos, estos campos coincidentes son la clave principal de una tabla, que proporciona un identificador único para cada registro, y una clave externa de la otra tabla.
Sugerencias
Para repasar y recordar las relaciones entre tablas, puede consultarse la práctica correspondiente en el bloque básico.
Las relaciones pueden ser, principalmente, de tres tipos:
1.1. Uno a muchos (1:N)
Este tipo se da cuando una fila de la primera tabla puede estar relacionada con muchas filas de la segunda tabla, pero una fila de la segunda sólo está relacionada con una de la primera. Por ejemplo, una persona puede tener muchos teléfonos (fijo, móvil) pero, dado un teléfono en particular, sólo pertenece a una persona.
1.2. Uno a uno (1:1)
Este tipo de relación aparece con menos frecuencia y sucede cuando una fila de la primera tabla sólo puede estar relacionada con una fila de la segunda y una fila de la segunda tabla sólo puede estar relacionada con una de la primera. Por ejemplo, dada una persona casada, sólo está casada con otra persona.
1.3. Muchos a muchos (N:N)
Esta clase de relación ocurre cuando una fila de la primera tabla puede estar relacionada con muchas filas de la segunda tabla y una fila de la segunda tabla puede estarlo con muchas filas de la primera. Por ejemplo, un comercial puede vender muchos productos y, dado un producto, puede ser vendido por muchos comerciales.
1.4. Normas a tener en cuenta en las relaciones
A la hora de implementar las relaciones en Base hay que tener en cuenta una serie de normas importantes:
En primer lugar, cerrar todas las tablas que estén abiertas. No es posible crear ni modificar relaciones entre tablas abiertas.
Dadas 2 tablas, siempre se relacionarán por un campo en común. Lógicamente, dicho campo deberá ser del mismo tipo y tamaño en ambas tablas.
Las 2 tablas a relacionar deberán contener siempre una clave principal o índice único. En caso contrario, Base nos avisará y no nos dejará crear la relación.
Si al arrastrar los campos, no se nos permite crear la relación, obligatoriamente deberemos corregir la información de la base de datos, ya que existirá algún tipo de inconsistencia.
Para que una relación esté correctamente creada, Base debe indicar la cardinalidad de la relación: 1 → 1, 1 → n, n → n.
Al final del proceso de diseño, todas las tablas de una base de datos deben estar relacionadas al menos con otra tabla. En caso de tener una tabla sin relacionar con ninguna otra, no tendrá ninguna utilidad. Por tanto, o sobra la tabla o está mal diseñada la base de datos.
Ejercicio
Tabla GENERO. Vista de datos
Abre la base de datos "videoclub".
Haz clic en el botón Tablas de la Barra de Objetos.
Ve a la tabla GENERO y haz doble clic sobre ella.
Ve al registro que contiene “Comedia”. Sobre el triángulo azul de la parte izquierda haz clic con el botón derecho del ratón y elige la opción Eliminar filas. Responde afirmativamente a la pregunta.
Guarda los cambios.
Cierra la tabla GENERO.
Inconsistencia de datos
Ve a la tabla PELICULA. Haz doble clic o clic en el icono Abrir.
¿Qué ocurre con los datos contenidos en la tabla PELICULA? ¿Es correcto este comportamiento? Como puede comprobarse, los cambios hechos en la tabla GENERO no se han propagado a la tabla PELICULA, lo que produce una inconsistencia en los datos. Es decir, si borramos el género “Comedia” en la tabla GENERO, en la tabla PELICULA tenemos registros cuyo género no existe.
¿Cómo lo arreglamos para que vuelvan a tener género?
Cierra la tabla PELICULA.
Ve a la tabla GENERO.
Vuelve a crear el registro para dejar los datos como estaban originalmente antes de hacer el punto anterior. Es decir, vuelve a introducir la fila “Comedia”.
Guarda los cambios.
Contenidos
2. Establecer una relación uno a muchos (1:N)
Según hemos explicado en el apartado anterior, existe claramente una relación del tipo uno a muchos (1:N) entre las tablas PELICULA y GENERO. Si consideramos que una película sólo puede pertenecer a un género, éste sería el tipo de relación que existe entre la tabla GENERO y la tabla PELICULA ya que, por ejemplo, el género “Histórico” tendrá varias películas relacionados que son de dicho género, pero dada una película sólo está relacionada con un género.
2.1. Interpretación de la relación
Las relaciones entre tablas es un concepto un tanto abstracto. Sin embargo, si representamos gráficamente nuestro diseño, el significado queda mucho más claro.
Donde tenemos que:
Cada rectángulo se corresponde con una tabla.
Las flechas indican que las 2 tablas están relacionadas.
Los números indican la cardinalidad. Es decir: (N) → Dado un género (por ej. Bélico), puede haber muchas películas pertenecientes a ese género. (1) → Dada una película, sólo pertenece a un género.
Para poder ver mejor la interpretación de la relación vamos a realizar un ejercicio en el que veremos las consecuencias de ésta en los valores de los campos.
Ejercicio
Crear relaciones. PELICULA y GENERO
Cierra todas las tablas abiertas. No es posible establecer relaciones entre tablas abiertas, ya que estamos introduciendo datos.
Ve al menú Herramientas → Relaciones. Haz clic en el icono Añadir tablas.
Selecciona las tablas PELICULA y GENERO con el botón Añadir.
Pulsa el botón Cerrar.
En nuestro caso, en la tabla PELICULA tenemos un campo “Genero” que hace referencia al género de cine al que pertenece la película. Por tanto, la columna debe ser del mismo tipo de datos que la columna que sea clave primaria en la otra tabla y los valores que podrá contener será cualquiera de los valores que tome la clave primaria en dicha tabla. En definitiva, en la tabla PELICULA el campo “Genero” debe ser del mismo tipo de datos que el campo de la tabla GENERO.
Ahora falta indicarle a Base explícitamente que las dos tablas están relacionadas y que vamos a utilizar para mantener dicha relación la columna “Genero” de la tabla PELICULA.
Arrastra del campo “Genero” de PELICULA al campo “Genero” de GENERO. Base ha creado una relación uno a muchos entre las 2 tablas.
El resultado será el siguiente:
Guarda los cambios en la base de datos.
Los campos relacionados no tienen que tener los mismos nombres, pero deben tener el mismo tipo de datos y el mismo tamaño. Es decir, deben contener el mismo tipo de información. En la tabla PELICULA el campo “Genero” debe ser del mismo tipo de datos que el campo de la tabla GENERO.
Ejemplo (el campo GeneroPeli es del mismo tipo y del mismo tamaño que el campo Genero, aunque no se llamen igual):
Crear relaciones. PELICULA y SOPORTE
Cierra todas las tablas abiertas. No es posible establecer relaciones entre tablas abiertas.
Establece una relación entre el campo “Soporte” de PELICULA y el campo “Soporte” de SOPORTE.
Contenidos
2.2. Clave ajena o externa
También podemos decir con respecto a los campos relacionados que el campo relacionado de la tabla "muchos" se denomina clave ajena o externa, mientras que el campo relacionado de la tabla "uno" será una clave principal o primaria.
Relación película-género
La clave ajena es el campo "Genero" de la tabla PELICULA. La clave primaria es el campo "Genero" de la tabla GENERO.
Relación película-soporte
La clave ajena es el campo "Soporte" de la tabla PELICULA. La clave primaria es el campo "Soporte" de la tabla SOPORTE.
3. Integridad referencial
En la relación que hemos definido en el apartado anterior, se impide que cualquier registro relacionado sea modificado o eliminado. Esta propiedad es lo que se conoce como integridad referencial.
Cuando existe una relación entre 2 tablas, cualquier operación con los datos ha de respetar la relación. En caso contrario, no se realizará.
La integridad referencial es una restricción que se define sobre una relación y que, en Base, toda relación lleva implícita debido al concepto de clave ajena.
3.1. Ejemplo práctico: relación película-género
Observando las dos tablas, podemos ver que la clave ajena "Genero" de la tabla PELICULA hace referencia al campo "Genero" de la tabla GENERO. De este modo, los valores que podrá tomar el campo "Genero" de la tabla PELICULA serán valores nulos o valores de entre los disponibles en la clave primaria de la tabla GENERO.
Esto es debido a que el objetivo de las claves ajenas es establecer una conexión con la clave primaria que referencian, de modo que si un valor de una clave ajena no estuviese presente en la clave primaria correspondiente, representaría una referencia o conexión incorrecta.
Como podemos comprobar, todos los valores de la columna "Genero" están contenidos de entre los posibles de la tabla GENERO:
Aspectos a tener en cuenta
Hay que tener en cuenta que tanto en inserciones como actualizaciones, cada vez que queramos introducir un valor en la columna "Genero" de la tabla PELICULA, deberá estar incluido en la tabla GENERO. En caso de no hacerlo, tendremos que insertar el registro antes en la tabla GENERO y, posteriormente, realizar la inserción en la tabla PELICULA.
La integridad referencial, por tanto, es un mecanismo que nos permite asegurar que los valores que estamos introduciendo son íntegros y coherentes con los valores que ya existen.
Ejercicio
Una vez establecida una relación, comprobaremos que es correcta. Para ello sólo tenemos que intentar realizar alguna operación no permitida y ver que se cumple la integridad referencial.
Haz clic en el botón Tablas de la Barra de Objetos.
Caso 1. Introducir una película de un género no existe en la tabla GENERO
Ve a la tabla PELICULA y haz doble clic sobre ella.
Introduce un nueva película que sea de un género que no exista en la tabla GENERO. Por ejemplo:
Guarda los cambios.
Como podemos comprobar, Base nos muestra un mensaje de error porque estamos insertando un registro con un género que no existe en nuestra base de datos.
Pulsa Aceptar.
Haz clic a la izquierda sobre el lápiz con el botón derecho del ratón y elige la opción Deshacer: entrada de datos.
Con esto desharemos la inserción y no nos dará error.
Cierra la tabla PELICULA.
Caso 2. Modificar un género que tiene películas relacionadas
Ve a la tabla GENERO y haz doble clic sobre ella.
Modifica datos en el registro “Terror” para que ahora sea “Terror1” (si no tienes películas de este género, haz la prueba con otro). Por ejemplo:
Guarda los cambios.
Como podemos comprobar, Base nos muestra un mensaje de error porque estamos modificando un registro de género que contiene películas relacionadas en la tabla PELICULA.
Pulsa Aceptar.
Haz clic a la izquierda sobre el lápiz con el botón derecho del ratón y elige la opción Deshacer: entrada de datos.
Caso 3. Eliminar un género que tiene películas relacionadas
Ve a la tabla GENERO y haz doble clic sobre ella.
Elimina el registro con el tipo “Histórico”. Haz clic a la izquierda sobre el triángulo con el botón derecho del ratón y elige la opción Eliminar filas.
Por ejemplo:
Guarda los cambios.
Como podemos comprobar, Base nos muestra un mensaje de error porque estamos borrando un registro de género que contiene películas relacionadas en la tabla PELICULA.
Pulsa Aceptar.
Cierra la tabla GENERO.
Contenidos
4. Orden de operaciones para cumplir la integridad referencial
Cuando establecemos relaciones y definimos claves ajenas, hemos de cumplir una serie de restricciones para garantizar la integridad referencial de la base de datos. En este caso, debemos realizar las operaciones básicas de manipulación de datos, siguiendo un determinado orden.
4.1. Inserciones
A la hora de insertar un registro en la tabla que tiene la clave ajena tendremos que asegurarnos que el valor existe como clave primaria de la tabla secundaria.
Ejercicio
Vamos a insertar un registro en la tabla PELICULA cuyo género es "Tragedia".
Lo primero será insertar, en la tabla GENERO, una fila con dicho género:
A continuación, insertamos la fila en la tabla PELICULA con los datos correspondientes:
No habrá problemas con la clave ajena, puesto que ya hemos insertado la fila previamente en la tabla GENERO.
Contenidos
4.2. Modificaciones
Ahora vamos a modificar un registro en la tabla que tiene la clave primaria, aunque antes tendremos que asegurarnos que no existen valores asociados en la tabla que contiene la clave ajena, es decir, que hagan referencia a éste.
Ejercicio
Vamos a modificar un registro de la tabla GENERO de "Comedia" a "Risa".
Si comprobamos en la tabla PELICULA los valores, veremos que éstos contienen el valor "Comedia".
Para solucionar el problema, creamos un nuevo valor "Risa" en la tabla GENERO.
Abrimos la tabla PELICULA y cambiamos los valores de "Comedia" por "Risa":
Por último, volvemos a la tabla GENERO y borramos el valor "Comedia".
Ahora tendremos el cambio realizado y sin errores.
Contenidos
4.3. Borrados
Ahora vamos a borrar un registro en la tabla que tiene la clave primaria, aunque antes tendremos que asegurarnos que no existen valores asociados en la tabla que contiene la clave ajena, es decir, que hagan referencia a éste.
Ejercicio
Vamos a eliminar un registro de la tabla GENERO, concretamente el valor "Risa".
Si comprobamos los valores en la tabla PELICULA, vemos que éstos contienen el valor "Risa".
Para solucionar el problema eliminamos el valor "Risa" de la tabla PELICULA:
Por último, abrimos la tabla GENERO y eliminamos el valor "Risa".
Ahora tendremos el cambio realizado y sin errores.
Restablecer situación inicial
Vamos a dejar la base de datos como estaba originalmente, para poder continuar con las siguientes prácticas.
Ve a la tabla GENERO.
Vuelve a insertar el género "Comedia".
Ve al formulario y establece el género "Comedia" en las películas correspondientes.
Guarda los cambios en la base de datos.
Contenidos
5. Acciones en cascada
En la integridad referencial de la unidad anterior vimos que el intento de realizar determinadas operaciones sobre una de las tablas conllevaba la imposibilidad de éstas, a no ser que hiciéramos determinadas modificaciones. Esto se produce debido a un elemento como son las acciones en cascada, para evitar los problemas derivados de los cambios producidos en tablas relacionadas.
5.1. Ejemplo: videoclub
En la relación que definimos en la unidad anterior se impedía que cualquier registro relacionado fuera modificado o eliminado. Esta propiedad es lo que se conoce como integridad referencial. Es decir, si intentamos borrar un género que tenga películas relacionadas, Base nos lo impedirá. De idéntica forma, si modificamos un género que tenga películas, también relacionadas, Base nos lo impedirá.
No obstante, es posible modificar el comportamiento de las relaciones para que se permitan determinadas opciones tanto para los borrados como para las actualizaciones. Es decir, la relación establecida entre dos tablas implica que cualquier modificación realizada sobre la información que contiene la tabla primaria afectará a los datos de la tabla secundaria.
6. Actualización en cascada
Tenemos 4 opciones:
Sin acción. Es la opción por defecto. Indica que los cambios realizados a una clave primaria no afectarán otros campos de clave ajena.
Actualiza en cascada. Actualiza todos los campos de clave ajena si se modifica el valor de la clave primaria correspondiente. Es la opción más segura y conservadora de las posibles y la que se debe utilizar en la mayoría de los casos.
Poner a nulo. Si se modifica la clave primaria correspondiente, esta opción establece el valor "IS NULL" (valor vacío) para todos los campos de clave ajena.
Por defecto. Si se modifica la clave primaria correspondiente, esta opción establece un valor por defecto para todos los campos de clave ajena.
Ejercicio
Vamos a modificar la relación existente entre las tablas PELICULA y GENERO para permitir la modificación en cascada.
Modificar relación
Ve al menú Herramientas → Relaciones.
Haz doble clic en la primera línea de la relación entre las tablas PELICULA y GENERO. En Opciones de actualización, marca la opción Actualización en cascada.
Pulsa el botón Aceptar.
Cierra la pantalla de relaciones.
Modificar datos en cascada
Ve a la tabla GENERO. Entra en modo hoja de datos.
Modifica el valor "Comedia" por "Comedia1".
Guarda los cambios
Ve a la tabla PELICULA. Entra en modo hoja de datos.
Comprueba que todos los registros relacionados han sido actualizados en cascada:
Guarda los cambios en la base de datos.
Contenidos
7. Borrado en cascada
Tenemos 4 opciones:
Sin acción. Es la opción por defecto. Indica que la supresión de una clave primaria no tendrá efecto en otros campos de clave ajena.
Suprimir en cascada. Indica que si se suprime un campo de clave primaria se suprimirán todos los campos de clave ajena correspondientes.
Poner a nulo. Si se suprime la clave primaria correspondiente, se asignará el valor "IS NULL" a todos los campos de clave ajena.
Por defecto. Si se suprime la clave primaria correspondiente, se definirá un valor por defecto para todos los campos de clave ajena.
Ejercicio
Vamos a modificar la relación existente entre las tablas PELICULA y GENERO para permitir la eliminación en cascada.
Modificar relación
Ve al menú Herramientas → Relaciones.
Haz doble clic en la primera línea de la relación entre las tablas PELICULA y GENERO. En Opciones de actualización, marca Ninguna acción. En Opciones de eliminación, marca la opción Eliminar en cascada.
Pulsa el botón Aceptar.
Cierra la pantalla de relaciones.
Introducir datos
Ve a la tabla GENERO. Entre en modo hoja de datos.
Añade un nuevo género "Bodrio".
Guarda los cambios.
Cierra la tabla GENERO.
Haz clic en el botón Formularios de la Barra de Objetos.
Abre el formulario FPELICULA. Introduce una nueva película del género “Bodrio”. Por ejemplo:
Eliminar datos en cascada
Ve a la tabla GENERO y haz doble clic sobre ella.
Borra el género "Bodrio". Botón derecho del ratón sobre el triángulo y opción Eliminar filas. Responder Sí a la pregunta.
Ve a la tabla PELICULA y haz doble clic sobre ella. Comprueba que todos los registros relacionados de género “Bodrio” han sido borrados en cascada:
Guarda los cambios en la base de datos.
El borrado en cascada hay que utilizarlo con precaución ya que podemos suprimir gran parte de la base de datos.
Para evitar efectos colaterales, vamos a dejar la relación como estaba inicialmente.
Cierra todas las tablas abiertas.
Ve al menú Herramientas → Relaciones.
Haz doble clic en la línea de relación entre las tablas PELICULA y GENERO. En Opciones de eliminación, marca la opción Sin acción.
No se permite un uso comercial de la obra original ni de las posibles obras derivadas, la distribución de las cuales se debe hacer con una licencia igual a la que regula la obra original.
Los reconocimientos se realizan en el apartado Fuentes de información.
Todas las capturas de pantalla tienen copyright y pertenecen a TuInsitutoOnline.com.
TuInstitutoOnline.com permite su uso siempre y cuando se muestren desde el dominio www.tuinstituoonline.com y NO PERMITE enlazar a ellas desde otros lugares.
Además, la estructura diseñada para mostrar el contenido de las unidades es propiedad de TuInstitutoOnline.com.