Pregunta

Tengo una tabla con un campo único single VARCHAR (512). Quiero tener otra mesa celebrar una referencia de clave externa a esta primera tabla. Ambas tablas utilizan InnoDB. Si añado una clave VARCHAR (512) a la segunda tabla y añadir una restricción de clave externa en la que será la de datos de 512 bytes de longitud llevará a cabo dos veces?

Si es así, ¿hay una manera de contener sólo una referencia al índice y no a la propia varchar?

En resumen, mi pregunta es, en InnoDB es que hay una manera eficaz para mantener las claves externas a los campos VARCHAR?

Muchas gracias,

Yaniv

¿Fue útil?

Solución

Sí, si usted tiene una columna VARCHAR(512) en la tabla de referencia, los datos existirán dos veces.

Le recomiendo que haga referirse a un número entero de clave principal para la primera tabla, no los datos de 512 bytes de clave externa de la tabla de referencia. Esto es un poco de lo que tiene que ver con la normalización.

Otros consejos

Me encontré con una prueba sencilla: crear 3 tablas, una para mantener los datos en sí, con dos columnas, y el ID (int) y los datos (varchar [120]), otra tabla que utiliza el ID como clave externa y una última uno que utiliza los datos como clave externa:

CREATE TABLE `dados` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`) USING BTREE,
  KEY `idx` (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `refINT` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dado` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`dado`),
  CONSTRAINT `id` FOREIGN KEY (`dado`) REFERENCES `dados` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `refSTR` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dado` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `nome` (`dado`),
  CONSTRAINT `nome` FOREIGN KEY (`dado`) REFERENCES `dados` (`name`) ON DELETE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Insertado 100 registros de cada tabla y se compara el tamaño final tabla:

dados:  192.0 KB
refINT: 32.0 KB
refSTR: 32.0 KB

Así que supongo que los datos no se replica en clave externa varchar, bueno, al menos en la versión de MySQL 5.1.

Mantener el tamaño de la clave pequeña siempre es buena. Se podría evitar el problema de tener un gran VARCHAR indexado por lugar de tener una columna de suma de comprobación adicional que se genera en el momento de inserción. Esta comprobación sobre el terreno contendría la salida de un algoritmo de hash CRC32() o tal vez MD5() de la columna más grande.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top