Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/11/2010, 19:45
fedecini
 
Fecha de Ingreso: febrero-2010
Mensajes: 31
Antigüedad: 14 años, 2 meses
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