Para que sirven las foreign key

Iniciado por 4dr14n31t0r, 6 Febrero 2016, 19:41 PM

0 Miembros y 1 Visitante están viendo este tema.

4dr14n31t0r

Cuando hago una consulta en mysql que conlleva el uso de varias tablas utilizoSELECT NombrePeliculas, NombreGeneros
FROM Peliculas, Generos
WHERE Peliculas.idGeneros = Generos.idGeneros;

Aunque tambien podria utilizar los JOIN
SELECT NombrePeliculas JOIN NombreGeneros
ON Peliculas.idGeneros = Generos.idGeneros;

Pero en cualquiera de los dos casos el uso de las foreign key es completamente innecesario, ya que tanto si indico que es una clave ajena como si no, funciona igualmente.
Entonces, ¿Cual es la verdadera escencia de las foreign key?

Sospecho que habrá alguna forma de unir tablas con las foreign key que todavia no he visto, pero por mas que busco en internet no encuentro nada  :(

sodark

Imagina que tienes un usuario en el foro y que cuando quieres borrar a ese usuario, tambien quieres eliminar todo lo que este haya puesto (post, mensajes, etc..)

Con la foreign key puedes decirle a la  tabla de comentarios que el user_id es un FK de la tabla usuarios, etc... de manera que si vieras un esquema E/R verias una linea de una tabla a la otra.
Pero ademas al definir una FK tambien puedes indicar que accion se toma cuando el dato es cambiado o borrado.

Si seleccionamos ON DELETE -> CASCADE lo que hara es que al borrar al usuario de la tabla de usuarios automáticamente se borran los registros de la tabla que tiene como FK al usuario, y se borran los de ese usuario.

De esta forma te aseguras que cuando eliminas algo, se elimina en todos lados, en vez de tener que tu ir por codigo y lanzar varias query de delete a varias tablas (todas las que quisieras borrar).

No es obligatorio borrar, tambien puedes poner a null o no hacer nada, si no recuerdo mal

4dr14n31t0r

Vale, pero... ¿Entonces las foreign key no sirven para consultas?
¿solo sirve para los on delete y on update?

sodark

Básicamente como puedes ver en el post que te pongo debajo, sirve para restringir los posibles datos en ese campo y lo que te he dicho.

No sirve para consultas como tal.

https://firebird21.wordpress.com/2013/05/26/entendiendo-a-las-foreign-keys/

Carloswaldo

#4
Cita de: 4dr14n31t0r en  6 Febrero 2016, 19:41 PM
Aunque tambien podria utilizar los JOIN

Lo que hiciste primero también es un JOIN

Cita de: 4dr14n31t0r en  6 Febrero 2016, 20:17 PM
Vale, pero... ¿Entonces las foreign key no sirven para consultas?
¿solo sirve para los on delete y on update?

DELETE y UPDATE son consultas.

Como el ejemplo de sodark, si no usas foreign keys y eliminas un usuario, todos los mensajes y otros registros "relacionados" con el usuario quedarán intactos (digo "relacionados" porque la relación solo existiría en tu mente y no en la base de datos), haciendo que queden muchos registros huérfanos y en una base de datos grandes esto te volvería loco. Mejor aprender a hacer las cosas bien en lo pequeño.

Además podrías crear, por ejemplo, un mensaje asignado a un usuario que no existe y la base no se quejará.

Un foreign key también exige que la columna referenciada tenga un índice, lo que sí afecta al rendimiento de los SELECTs.