Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/12/2011, 18:11
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Llaves primarias y foraneas

Una FOREIGN KEY (ver definición en Wikipedia para más datos) es un campo o conjunto de campos que referencia a la PK de otra tabla. Si la PK de la otra tabla está formada por un VARCHAR, CHAR, DATE, TIME, o lo que sea, al sistema no le importa. Sólo le importa que la PK y la FK estén conformadas por el mismo tipo de dato, del mismo rango y eventualmente misma collation y charset.
Por otro lado, te aclaro: Una PK no necesariamente es un INT AUTO_INCREMENT. Si alguien te dijo que eso, te dijo tonterías.
Una PK es un campo o conjunto de campos que identifican a un único registro en una tabla. Es un identificador. Que lo hagas con un INT, CHAR, DATE o VARACHAR es irrrelevante para el modelo. Lo que importa es que cada valor de una PK de un registro de la tabla jamás pueda repetirse. Nunca.
Es común creer que un ID autoincremental es una PK. Eso no sólo no es cierto, sino que además es una mala práctica, muy usual entre los programadores. Pero cuando estudias formalmente las bases de datos aprendes que en la mayoría de las ocasiones las mejores PK están creadas con diversos tipos de dato, y que muchas veces los mejores diseños ni siquiera usan PK numéricas.
Según lo que se estudia en BBDD, una tabla sólo debe llevar PK numéricas incrementales o no, si llegados a la Tercera Forma Normal (ver Normalización de Bases de Datos), no se ha encontrado una clave candidata para PK.
El problema es que como son "fáciles" de programar, y muy habituales para los programadores, se cree que eso es correcto. Lo que yo te puedo decir por experiencia, es que traen problemas de migración, de integración, de restauración de datos y bases, y muchas otras cosas que sólo se ven a largo plazo.
Es mejor buscar bien las CC y no crearle una PK autoincremental.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)