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

Innodb Foreign keys en campos de texto(varchar)

Estas en el tema de Innodb Foreign keys en campos de texto(varchar) en el foro de Mysql en Foros del Web. Hola tengo una duda existencial. voy a dar el ejemplo y despues explicar el problema: Database: InnoDB MySQL Database Version 5.0.51b creo una tabal provincias ...
  #1 (permalink)  
Antiguo 02/11/2010, 19:45
 
Fecha de Ingreso: febrero-2010
Mensajes: 31
Antigüedad: 14 años, 1 mes
Puntos: 0
Exclamación Innodb Foreign keys en campos de texto(varchar)

Hola tengo una duda existencial.

voy a dar el ejemplo y despues explicar el problema:

Database: InnoDB MySQL Database Version 5.0.51b

creo una tabal provincias con dos keys

CREATE TABLE provinces(
provinceid INT(11) NOT NULL AUTO_INCREMENT,
provincename VARCHAR(20) NOT NULL,
PRIMARY KEY (provinceid),
KEY (provincename)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

creo la tabla users, con una FOREIGN KEY que en ves de hacer referencia al "provinceid" hace referencia al "provincename" , para que cuando haga un select en la tabla users no me aparezca un numero, y asi evito una consulta para saber que provincia es ese numero (espero me vayan entendiendo),

CREATE TABLE `users`(
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`provincename` varchar(20) NOT NULL,
PRIMARY KEY (`userid`),
KEY (username),
INDEX province_ind(provincename),
FOREIGN KEY (provincename) REFERENCES provinces(provincename) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;


Ahora creo una tabla con compra (acortada obviamente al ejemplo) que tiene el mismo sistema que la tabla anterior, las FOREIGN KEYS hacen referencia a un campo varchar y no al int comun de los (id). para evitar consultas.

CREATE TABLE `compra` (
`eventid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`provincename` varchar(20) NOT NULL,

PRIMARY KEY (`eventid`),
INDEX username_ind(username),
FOREIGN KEY (username) REFERENCES users(username) ON DELETE CASCADE ON UPDATE CASCADE,
INDEX provincename_ind(provincename),
FOREIGN KEY (provincename) REFERENCES provinces(provincename) ON DELETE CASACADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


esto funciona perfectamente ya que cualquier cambio que haga en una tabla padre se modifica en todos los campos de la tabla hijo, no me deja que inserte datos erroneos, es decir no tiene problemas.

ahora mis preguntas:

- cuando haga un select a una tabla, los campos a comparar van a ser VARCHAR y no INT.
¿VARCHAR tarda mas en comparar que un int?

Si fuera asi

ahora la pregunta del millon

Comparar VARCHAR tarda menos o mas o usa mas o menos procesador que (comparar INT y hacer las demas consultas extras que estos conllevan para acceder a sus datos. por ejemplo (provincename))

no se si fui muy enroscado para hacer esto pero es una duda que me traba en mi modelacion de la base de datos

Saludos!

Última edición por fedecini; 02/11/2010 a las 21:50
  #2 (permalink)  
Antiguo 02/11/2010, 21:51
 
Fecha de Ingreso: febrero-2010
Mensajes: 31
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Innodb Foreign keys en campos de texto(varchar)

perdon que sea insistidor, si no saben podrian poner que no lo saben, asi alguien que viene y quiere investigar, podria ayudar a un monton..

Saludos!
  #3 (permalink)  
Antiguo 02/11/2010, 22:12
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: Innodb Foreign keys en campos de texto(varchar)

Voy a partir de tu pregunta fina:
- Comparar dos VARCHAR(20) implica que se deben igualar dos pares de 20 caracteres conforme caracter representado y collation usada.
- Comparar don BIGINT implica igualar dos valores de 8 bytes en su representación binaria.

¿Qué supones que es más rápido?

Exacto: El matching binario.

Ahora vamos a los detalles que pusiste:
Cita:
creo la tabla users, con una FOREIGN KEY que en ves de hacer referencia al "provinceid" hace referencia al "provincename" , para que cuando haga un select en la tabla users no me aparezca un numero, y asi evito una consulta para saber que provincia es ese numero (espero me vayan entendiendo),
Eso es básicamente una tontería.
En primer lugar no necesitas hacer una consulta para saber a qué nombre de provincia corresponde ese ID. Únicamente necesitas una consulta usando JOIN sobre ambas tablas al mismo tiempo.

Supongo que sabes usar los JOIN ¿No?

Bueno. Para recuperar el nombre ni siquiera necesitas invocar el ID en el SELECT, basta con ponerlo en el ON del FROM y usar el campo de nombre en el SELECT.

Por otro lado, el ejemplo de FK que usas es incorrecto. Una FK debe ser, por definición del paradigma E-R, una PK en la tabla origen, y no es lo que estás haciendo.
MySQL admite el uso de campos no PK en las FK pero sólo si el campo relacional usado es un campo UNIQUE (y por tanto clave candidata), y tampoco es el caso, porque los estás definiendo como INDEX.

Finalmente: Por cuestiones de diseño, no es buena idea usar los nombres de localidades, provincias o lugares como PK por la simple razón que la denominación toponimia raramente es única, y el requisito ineludible de una PK es su unicidad.
Si te parece que estoy equivocado, podría preguntarte, por ejemplo, cuantas ciudades Pilar, Londres o Córdoba conoces.
Antes que te pongas a buscar, te advierto que en el mundo hay más de una de cada una de ellas, y en algunos países, como Argentina, hay casi una docena de localidades denominandas "Mercedes", "Santa María", "San Pedro" y muchas otras así.
En esos casos es preferible usar algún sistema de nomenclatura ya establecido, como puede ser el código postal, o en el caso de los países, el identificador telefónico.

P.D.: Ten paciencia para las respuestas. Los que participamos en los foros no trabajamos en el foro y tu publicaste tu post a las 22:45 hora argentina.
¿Cuántos más crees que están sin dormir para participar de este tipo de foros?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 02/11/2010, 22:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 31
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Innodb Foreign keys en campos de texto(varchar)

GRACIAS! muy profunda tu respuesta, me ayudo muchisimo,

igual no lo ponia por el hecho de agredir a lo de las respuestas, sino que lo veo del punto de vista que si muchos no saben algo es mas importante encontrarlo para el que se lo propone y seria como un insentivo, era mas para ayudar que para que me respondan..

te sigo agradeciendo porque fuiste muy claro!

Saludos!
  #5 (permalink)  
Antiguo 03/11/2010, 00:00
 
Fecha de Ingreso: febrero-2010
Mensajes: 31
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Innodb Foreign keys en campos de texto(varchar)

tambien decia lo de las consultas extras, porque hay gente que prefiere hacer la logica por el codigo en el que este programando y no por la base de datos, que no se si esta bien eso o mal, yo prefiero separarlos, y ademas es menos trabajo
  #6 (permalink)  
Antiguo 03/11/2010, 03:51
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: Innodb Foreign keys en campos de texto(varchar)

Cita:
tambien decia lo de las consultas extras, porque hay gente que prefiere hacer la logica por el codigo en el que este programando y no por la base de datos, que no se si esta bien eso o mal, yo prefiero separarlos, y ademas es menos trabajo
... con lo que desperdician el 99,99% de la potencia y recursos de una base de datos...

¿Qué sentido tiene hacer que la base de datos te devuelva dos tablas de 500 y de 100.000 registros para verificar un X conjunto de datos, si una consulta correctamente escrita te puede devolver los 45 registros que te interesan para el reporte?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campos, innodb, keys, 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 09:36.