07/10/2008, 16:00
|
| | Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses Puntos: 43 | |
Respuesta: que es una foreign key??? Je je je je je, hacía mucho tiempo que no leia un post de este tipo.................
Las Foreign Keys ( En adelante FK's ) son la biblia de las BBDD relacionales como Oracle y sirven para salvaguardar la integridad y coherencia de los datos por una parte y por otra la logica de negocio que apliques en tu programación mediante la relacion entre dos tablas.
Una FK siempre deberá ir enganchada a una clave primaria ( en adelante PK ) ó a una clave unica , basicamente no hay diferencia entre las PK y las claves unicas, pero no son lo mismo.
Te pongo el tipico y sencillo ejemplo de los clientes y facturas :
Por una parte tu tienes una tabla maestra de clientes donde tienes un código de cliente ( que será la PK ) y una o varias descripciónes, como puede ser el nombre , el NIF etc etc., por ejemplo :
COD_CLIE----------------- NOMBRE
1 ---------------------------- PERICO DE LOS PALOTES.
Y por otro lado la tabla de facturas en donde guardas el numero de factura, fecha, bla bla bla y el CODIGO DEL CLIENTE al que se le ha expedido esa factura
NUM_FACTURA----------FECHA-------------COD_CLIE
0001----------------------07-10-2008--------1
Si tu relacionas estas dos tablas mediante una FK ( Tabla hija FACTURAS y tabla padre CLIENTES ), de la tabla padre te traes el codigo de cliente de tal manera que estás impidiendo que te metan un codigo de cliente erroneo, es decir, que no exista en la tabla de clientes. Por ejemplo, dado el contenido de la tabla padre que te he puesto, solo un registro con un solo cliente, esto no podrías hacerlo en la hija , Oracle no te dejaría :
NUM_FACTURA----------FECHA-------------COD_CLIE
0001----------------------07-10-2008-------- 911
Hay de muchos tipos de relaciones : 1 a N ( Por cada ocurrencia de la tabla padre puedes tener N en la tabla hija ) , 1 a 1 ( Por cada ocurrencia de la padre SOLO puedes tener una en la hija ), relaciones en ARCO ( esto es complicado de explicar en un solo post y a distancia ), reflexivas o recursivas ( que apuntan a la misma tabla, vamos que la tabla padre es a la vez tabla hija ) etc etc etc...................
Y para terminar, otras consideraciones .
Una sola tabla puede tener N tablas hijas y al reves, una tabla puede tener N tablas padres.
Una tabla hija deberá traerse TODOS los campos que forman la PK de la tabla padre. No puedes tener una tabla padre con 3 campos que forman la PK y traerte solo uno con la FK, aunque esos mismos campos ( o parte ) te los traigas de otra tabla con otra FK. Hay una excepción a esto que te acabo de poner que son las Relaciones en Arco : Si no los quieres tener repetidos, uno o mas campos de una tabla pueden formar parte de una o mas FK's y que dependiendo de que rellenes o no todos los campos, te valide contra un tabla o contra otra. Esto puede sonar "raro" y lo es, pero muchas veces para aplicar la lógica de negocio adecuada, es necesario hacerlo.
Y para terminar, por norma, cada FK debe de llevar un índice sobre los mismos campos que forman dicha FK, por ejemplo si tienes una FK que la forman el CODIGO_CLIENTE+CODIGO_DE_FACTURA+CODIGO_DE_PROVINC IA tienes que crear un índice sobre esos mismos campos, si no lo haces se pueden generar bloqueos en accesos concurrentes a esa misma tabla, la tabla padre o la tabla hija.
Espero haberte aclarado un poco tus dudas. |