Pergunta

Eu tenho uma tabela com um único campo Varchar (512) exclusivo. Quero ter outra tabela com uma referência de chave estrangeira a esta primeira tabela. Ambas as tabelas usam innodb. Se eu adicionar uma chave Varchar (512) para a segunda tabela e adicionar uma restrição de chave estrangeira, os dados de 512 bytes serão mantidos duas vezes?

Em caso afirmativo, existe uma maneira de manter apenas uma referência ao índice e não ao próprio Varchar?

Em suma, minha pergunta é: em Innodb Existe uma maneira eficiente de manter chaves estrangeiras em campos longos de varchar?

Muito obrigado,

Yaniv

Foi útil?

Solução

Sim se você tem um VARCHAR(512) Coluna na tabela de referência, os dados existirão duas vezes.

Eu recomendo que você faça a chave estrangeira da tabela de referência, consulte uma chave primária inteira para a primeira tabela, não os dados de 512 bytes. É disso que se trata a normalização.

Outras dicas

Fiz um teste simples: Crie 3 tabelas, uma para manter os dados em si com duas colunas e id (int) e os dados (Varchar [120]), outra tabela que usa o ID como chave estrangeira e uma última que usa Os dados como chave estrangeira:

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;

Inserido 100 registros em cada tabela e comparou o tamanho da tabela final:

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

Então, acho que os dados não são replicados em Varchar Foreign Key, bem, pelo menos na versão MySQL 5.1.

Manter o tamanho da chave pequeno é sempre bom. Você pode contornar o problema de ter um grande VARCHAR Indexado em vez de ter uma coluna de soma de verificação adicional que você gera no momento da inserção. Este campo de soma de verificação conteria a saída de um algoritmo de hashing CRC32() ou talvez MD5() da coluna maior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top