Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Llaves primarias y foraneas

Estas en el tema de Llaves primarias y foraneas en el foro de Mysql en Foros del Web. Hola a todos¡¡ tengo una duda existencial xD jiji Me gustaria saber si puedo tener llaves primarias y foraneas de tipo char. Segun aqui veo ...
  #1 (permalink)  
Antiguo 10/12/2011, 15:33
Avatar de halexander  
Fecha de Ingreso: abril-2010
Ubicación: En algun lugar de mexico xD
Mensajes: 59
Antigüedad: 14 años
Puntos: 0
Llaves primarias y foraneas

Hola a todos¡¡ tengo una duda existencial xD jiji

Me gustaria saber si puedo tener llaves primarias y foraneas de tipo char.

Segun aqui veo ps sip, pero como es su funcionamiento?? Siempre crei que solo podia ser int las llaves, ya que son autonumericas y se ira incrementando el numero sin duplicarlo. Gracias¡¡

Ejemplo:

Código MySQL:
Ver original
  1. CREATE TABLE TRABAJA_EN
  2.     (DniEmpleado        CHAR(9)     NOT NULL,
  3.      NumProy        INT         NOT NULL,
  4.      Horas          DECIMAL(3,1)        NOT NULL,
  5.     PRIMARY KEY(DniEmpleado, NumProy),
  6.     FOREIGN KEY(DniEmpleado) REFERENCES EMPLEADO(Dni),
  7.     FOREIGN KEY(NumProy) REFERENCES PROYECTO(NumProyecto) );

Tabla con la que conecta:

Código MySQL:
Ver original
  1. CREATE TABLE EMPLEADO
  2.     (Nombre VARCHAR(50)     NOT NULL,
  3.      Apellido1  VARCHAR(50),
  4.      Apellido2  VARCHAR(50)     NOT NULL,
  5.      Dni        CHAR(9)     NOT NULL,
  6.      FechaNac   DATE,
  7.      Direccion  VARCHAR(50),
  8.      Sexo       CHAR,
  9.      Sueldo     DECIMAL(10,2),
  10.      SuperDni   CHAR(9),
  11.      Dno        INT         NOT NULL,
  12.     PRIMARY KEY(Dni),
  13.     FOREIGN KEY(SuperDni) REFERENCES EMPLEADO(Dni) );

La otra tabla con la que conecta:

Código MySQL:
Ver original
  1. CREATE TABLE PROYECTO
  2. (NombreProyecto VARCHAR(50)     NOT NULL,
  3.      NumProyecto        INT         NOT NULL,
  4.      UbicacionProyecto  VARCHAR(50),
  5.      NumDptoProyecto    INT         NOT NULL,
  6.     PRIMARY KEY(NumProyecto),
  7.     UNIQUE(NombreProyecto),
  8.     FOREIGN KEY(NumDptoProyecto) REFERENCES DEPARTAMENTO(NumeroDpto) );
  #2 (permalink)  
Antiguo 10/12/2011, 18:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
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)
  #3 (permalink)  
Antiguo 11/12/2011, 22:15
Avatar de halexander  
Fecha de Ingreso: abril-2010
Ubicación: En algun lugar de mexico xD
Mensajes: 59
Antigüedad: 14 años
Puntos: 0
Respuesta: Llaves primarias y foraneas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.

Gracias amigo¡¡¡ me sirvió de mucho =) eres bueno¡¡

Etiquetas: integer, llave, primaria, varchar, foreignkey
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:57.