Alejandrox

Blog personal de Alejandro Meroño Hernández

Relaciones en Access  

Antes de explicar el concepto de relación en Access y la integridad referencial vamos a analizar una pequeña base de datos para intentar entender mejor porqué son necesarias y para qué sirven las relaciones.Vamos a suponer que disponemos de las siguientes tablas en Access:


Los datos que hay en cada una de las tablas son los siguientes:

Observando los datos contenidos en la tabla “Préstamos” vemos que se han realizado tres préstamos. Se ha realizado un préstamo del libro con código 1 al socio con DNI 111222111. Para saber cual es el título que corresponde al libro con código 1 debemos observar la tabla libros. En esa tabla el libro con código de libro 1 tiene por título “Soy leyenda” y está escrito por “Richar Mathenson”. Para saber cual es el nombre del socio con DNI 111222111 debemos echar un vistazo a la tabla Socios. En esa tabla el socio con DNI 111222111 tiene el nombre “Alicia Marín García”. Así pues sabemos que se ha prestado el libro “Soy leyenda” a “Alicia Marín García” el día 20/03/2006.

De la misma forma podemos saber qué otros libros se han prestado a los socios. Según los datos que hay almacenados en la tabla “Préstamos” se ha realizado un préstamo del libro “La máquina del tiempo” (código 2) al socio “Antonio García Castillo” (DNI 555444555) el día 25/03/2006. Y otro préstamo se ha realizado a “Laura Hernández Gutiérrez”, del libro “Viaje al centro de la tierra” el día 26/03/2006.

Ahora vamos a suponer que se introduce un nuevo registro en la tabla “Préstamos”.

El socio con DNI 999888777 es “Laura Hernández Gutiérrez”, como podemos observar en tabla “Socios”. Pero, ¿cuál es libro con código 7? Ese libro no aparece en la tabla “Libros”, entonces, ¿qué libro se ha prestado realmente a Laura?. En la tabla Préstamos aparece el préstamo de un libro que en realidad no existe en la base de datos.

De la misma forma puede darse el caso de que en la tabla “Préstamos” aparezca el DNI de un socio que en realidad que no exista en la tabla de “Socios”.


¿Debería una base de datos permitir este tipo de situaciones? La respuesta es NO. Precisamente uno de los objetivos de las bases de datos es evitar inconsistencias en los datos almacenados y mantener la coherencia en los resultados.

Para evitar este tipo de situaciones, en las bases de datos se utilizan las relaciones.

LAS RELACIONES

Para poder relacionar tablas entre sí se deberá especificar un campo en común que contenga el mismo valor en las dos tablas y dicho campo será clave principal en una de ellas.

Las tablas se relacionan de dos a dos, donde una de ellas seré la tabla principal de la que parte la relación y la otra será la tabla secundaria destino de la relación.

Para realizar relaciones en Access hay que pulsar el icono , situado en la barra de herramientas.

A continuación aparecerá la siguiente ventana en la que tenemos que seleccionar todas las tablas que formarán parte de las relaciones a crear (debemos seleccionar las tablas y pulsar el botón “Agregar”).

Ahora aparecerá la ventana de Relaciones con las tablas añadidas en el paso anterior.

Para iniciar una relación hay que seleccionar el campo de la tala principal y arrastrarlo hasta el campo de la tabla secundaria que forma parte de la relación.

Cuando se realiza una relación entre dos campos aparece el siguiente cuadro de diálogo:

En la parte superior deben estar los nombres de las dos tablas relacionadas y debajo de éstas el nombre de los campos de relación. Ojo! siempre se deben relacionar campos que tengan el mismo tipo de datos.

A continuación activa el recuadro “Exigir integridad referencial” haciendo clic sobre éste. También puedes activar las casillas “Actualizar en cascada los campos relacionados” y “Eliminar en cascada los registros relacionados”. Hacer clic sobre el botón “Crear”. Se creará la relación y ésta aparecerá en la ventana de relaciones.


Los campos que forman parte de una relación deben ser del mismo tipo. Por ejemplo, si código de libro en la tabla “Libros” es de tipo Texto de tamaño 10 y en la tabla “Préstamos” es numérico, no puede realizarse la relación. Tampoco puede realizarse si, por ejemplo, código de libro es de tipo de Texto de tamaño 10 en la tabla “Libros” y de tama&ntidle;o 15 en la tabla “Préstamos”.

Si ahora abrimos la tabla “Libros” podemos observar que aparece el símbolo “+” al principio de cada registro de la tabla. Si pulsamos sobre dicho símbolo en alguno de los registros podremos ver el DNI del socio al que se le ha prestado el libro y la fecha de préstamo.


INTEGRIDAD REFERENCIAL.

La integridad referencial es un sistema de reglas que utiliza Access para asegurarse que las relaciones entre registros de tablas relacionadas son válidas y que no se borren o cambien datos relacionados de forma accidental.

Al exigir integridad referencial en una relacón le estamos diciendo a Access que no nos deje introducir datos en la tabla secundaria si previamente no se han introducido en la tabla principal.

La integridad referencial entre dos tablas debemos indicarla en el siguiente cuadro de diálogo (aparece cuando se realiza la relación entre dos campos).


Si al hacer las relaciones entra las tablas “Socios”, “Préstamos” y “Libros” hemos marcado en todas ellas la opción de “Exigir integridad referencial”, y ahora intentamos introducir en la tabla “Préstamos” un libro que no existe en la tabla Libros aparecer´ el siguiente mensaje de error:

De la misma forma si intentamos introducir en la tabla “Préstamos” un DNI que no existe en la tabla Socios aparecer´ el siguiente mensaje de error:

Así pues, una de las ventajas de la integridad referencial es que no podemos introducir datos en la tabla secundaria si previamente no se han introducido en la tabla principal. De esta forma se evitan incoherencias y se mantiene la consistencia de la base de datos.

ACTUALIZAR REGISTROS EN CASCADA Y ELIMINAR REGISTROS EN CASCADA.

La integridad referencial dispone de dos acciones:

Actualizar registros en cascada: Cuando se cambie el valor del campo de la tabla principal, automáticamente cambiarán los valores de sus registros relacionados en la tabla secundaria.

Por ejemplo: Si en la tabla “Libros” cambiamos el código del libro número 1 a 100, en la tabla “Préstamos” también cambiará el código del libro a 100.


Eliminar registros en cascada: Cuando se elimina un registro de la tabla principal se borrarán también los registros relacionados en la tabla secundaria.

Por ejemplo: Si borramos en la tabla Libros el libro con código 2, éste también desaparecerá de la tabla “Préstamos”.

CASOS PRÁCTICOS.

Disponemos de las tablas Libros, Préstamos y Socios con las siguientes relaciones:


Los datos que hay en cada una de las tablas se pueden ver al principio de esta entrada.

1. ¿Se pueden relacionar los campos Código de libro de la tabla “Libros” y Código de libro de la tabla “Préstamos” si esos dos campos tienen diferentes tipos de datos?

NO. Para poder relacionar dos campos es necesario que tengan el mismo tipo de datos. Si un campo es Texto de tamaño 10, el otro campo debe ser Texto de tamaño 10. Si un campo es un número, el otro campo debe ser también debe ser un número. Da igual que los campos tengan diferente nombre, los únicos requisitos que deben cumplirse es que los campos tengan el mismo tipo de datos y además uno de los campos sea clave principal de una tabla.

2. Si al hacer las relaciones hemos marcado en todas la opción de “Exigir integridad referencial”, ¿qué ocurre si introducimos en la tabla de “Préstamos” el DNI de un cliente que no existe en la tabla “Socios”?

Access no nos dejaría introducir el registro al haber exigido la integridad referencial. Tampoco nos dejaría introducir en la tabla de “Préstamos” el código de un libro que no existiera en la tabla de “Libros”.

3. Si al hacer las relaciones no hemos marcado la opción de “Exigir integridad referencial”, ¿podemos introducir en la tabla de “Préstamos” el DNI de un cliente que no existe en la tabla “Socios”?

SI. De la misma forma podríamos introducir en la tabla códigos de libros que no existan en la tabla de Libros.

4. Cuando has hecho las relaciones has marcado en todas ellas la casilla de “Actualizar registros en cascada”. Si cambiamos el código de libro 1 por el 100, ¿cambiará también el código de ese libro en la tabla “Préstamos”?

SI. En la tabla “Préstamos” aparecerá el nuevo código del libro (100). Sin embargo, si no se hubiera marcado la casilla de “Actualizar registros en cascada” no se actualizaría el código del libro en Préstamos.

5. Cuando se han hecho las relaciones entre las tablas se han marcado en todas la opción de “Eliminar registros en cascada”. Si eliminamos, en la tabla Socios, el socio con DNI 111222111, ¿se eliminarían todos los préstamos realizados a ese socio?

SI. Al eliminar un socio automáticamente se eliminan en la tabla “Préstamos” todos los préstamos realizados a ese socio. Si no se hubiera exigido la integridad referencial no se eliminarían los préstamos realizados.

Popularity: 11% [?]


Otras entradas que te pueden interesar



Esta entrada tiene

16 comentarios

Escrito por Alejandrox

Febrero 3rd, 2007 at 6:27 pm

Categoría: Bases de datos

16 comentarios en 'Relaciones en Access'

Suscríbete a comentarios con RSS o TrackBack en 'Relaciones en Access'.

  1. BUENAS TARDES ALEJANDRO…BUENO MI PREGUNTA ES QUE SI YO TENGO CREADA UNA BASE DE DATOS EN ACCESS COMO POR EJEMPLO DE UNA BIBLIOTECA…SERA QUE PUEDO IMPORTARLA CON TODAS SUS TABLAS A phpMyAdmin Y NO ME AFECTA SUS RELACIONES CREADAS EN ACCESS…POR FA NESECITO UNA RESPUESTA PORQUE ES UN PROYECTO PARA LA UNIVERSIDAD…

    JAVIER

    30 Oct 07 at 10:46 pm

  2. Hola Javier. Perdona por la tardanza en contestarte… Puedes importar sin problemas las tablas que tengas en Access a una base de datos MySQL (phpMyAdmin es tan sólo una interfaz para administrar bases de datos MySQL). De lo que no estoy ya tan seguro es de si se pueden mantener las relaciones que hayas hecho con Access en MySQL. Diría que no, pero tampoco puedo afirmártelo con rotundidad ya que no lo he probado…
    Si necesitas algo más, aquí estoy a tu disposición. Un saludo.

    Alejandro

    6 Nov 07 at 9:35 pm

  3. Hola javier, estoy hecho un lio con una pequeña base de datos que estoy creando, porque creo que las relaciones estan bien hechas pero cuando hago un formunlario, eligiendo campos de distintas tablas , en algunos campos me dice, “la clave de combinacion de la tabla (recaudaciones), no esta en el recordset
    Te agradezco de antemano tu ayuda.

    Saludos

    Raul

    22 Ene 08 at 12:36 am

  4. Hola Raúl. Me llamo Alejandro. jeje.
    Para poder ayudarte tengo que saber cual es la estructura de tus tablas y las relaciones que has hecho. Además, supongo que estás utilizando Access, no?
    Un saludo

    Alejandrox

    22 Ene 08 at 5:48 pm

  5. hola, mira lo que pasa es que tengo una confusion de terminos!!! De que me sirve hacer la relacion si no pongo “exigir integridad”!? pues el me deja poner cualquier valor aunque tenga la relacion.
    Si por ejemplo tengo una tabla con ciudades, y una casa tiene relacion con un campo de ciudades nombre, en la tabla casa en la celda que tiene relacion, si quiero puedo poner otro valor que no sea el de la relacion….
    Estoy

    Liliana

    21 Feb 08 at 4:37 pm

  6. Liliana: en efecto, si no pones lo de exigir integridad referencial las relaciones no te sirven para nada.
    Saludos

    Alejandrox

    21 Feb 08 at 11:02 pm

  7. bueno amigo.. talvez lo que yo quiero es mas que una simple ayudita.. tengo problemas con eso de crear tablas (mas bien con la estructura y con que tablas debo tener).
    voy a hacer una base de datos donde se puedan grabar alumnos y las calificaciones de estos..
    segun yo necesito la tabla de alumnos, de calificaciones, de grupos, maestros(ya que estos son los que insertaran las calificaciones) y pues no se que mas debo tener.. la verdad que ya me hice bolas.jejeje asi k si puedes ayudarme te lo agradeceria. porque ando perdido con eso de la estructura
    gracias.. ahi esta mi mail seria mas facil ay

    jorge

    14 Mar 08 at 8:19 pm

  8. bueno amigo.. talvez lo que yo quiero es mas que una simple ayudita.. tengo problemas con eso de crear tablas (mas bien con la estructura y con que tablas debo tener).
    voy a hacer una base de datos donde se puedan grabar alumnos y las calificaciones de estos..
    segun yo necesito la tabla de alumnos, de calificaciones, de grupos, maestros(ya que estos son los que insertaran las calificaciones) y pues no se que mas debo tener.. la verdad que ya me hice bolas.jejeje asi k si puedes ayudarme te lo agradeceria. porque ando perdido con eso de la estructura
    gracias.. ahi esta mi mail seria mas facil por ahi.. gracias
    jorgeriveravazquez@gmail.com

    jorge

    14 Mar 08 at 8:19 pm

  9. necesito saber el concepto de relaciones entre bases de datos en access 2007 su aplicacion y que objetivos tiene

    JACQUELINE FLORES

    29 Mar 08 at 10:09 pm

  10. Me ha servido de mucho la explicación, enhorabuena por el artículo y gracias por ponerlo a disposición de todos, saludos :))

    paparrasolla

    13 Abr 08 at 8:42 pm

  11. OLAA
    ESPERO K TE ENCUENTRES BIEN
    ESTA SUPER LA INFORMACION
    ME A CASI SALVADO LA VIDA.

    BUENO PUES MUCHAS FELICIDADES
    POR TU TRABAJO
    Y K BUENO QUE LO PONGAS ALA VISTA DE TODOS

    GRACIAS

    NANCY RICARIO

    10 May 08 at 2:26 am

  12. Hola gracias por tu información !!
    Doy clases de Access y me interesa tener ejercicios con explicaciónes paso a paso para mis alumnos, tu info me sirvió mucho gracias !! acepto sugerencias de otros links interesantes

    Andy

    16 May 08 at 10:17 pm

  13. Hola, en una relacion me sale alcontrario la integridad referencial, la quiero muchos a uno y me sale uno a muchos, como lo puedo resolver?

    De antemano grax.

    Aure Villa

    23 Jun 08 at 6:33 pm

  14. Muy buen material, sencillo pero interesante. Gracias por ese aporte

    BeTo Muñoz

    2 Jul 08 at 4:48 am

  15. deberian estar en esta los tipos de relaciones que hay y una definicion

    ricardo

    11 Ago 08 at 8:55 pm

  16. me podrias decir tu correo para preguntarte una duda sobre acces

    javi

    27 Oct 08 at 4:55 pm

Deja un comentario