Таблица MySQL с варчаром в качестве иностранного ключа

StackOverflow https://stackoverflow.com/questions/1285417

Вопрос

У меня есть таблица с одним уникальным полем Varchar (512). Я хочу, чтобы еще одна таблица содержит ссылку на внешнюю ключ на эту первую таблицу. Обе таблицы используют Innodb. Если я добавлю клавишу varchar (512) ко второй таблице и добавлю ограничение внешней клавиши на нее, будут выполнены данные длиной 512 байтов дважды?

Если так, есть ли способ содержать только ссылку на индекс, а не на сам варчар?

Короче говоря, мой вопрос: в Innodb есть эффективный способ удерживать иностранные ключи в длинных полях Varchar?

Большое спасибо,

Янив

Это было полезно?

Решение

Да, если у вас есть VARCHAR(512) Столбец В таблице ссылок данные будут существовать дважды.

Я рекомендую вам сделать внешний ключ таблицы ссылок, обратитесь к целочисленному первичному ключу для первой таблицы, а не на 512-байтовые данные. Это что -то вроде нормализации.

Другие советы

Я запустил простой тест: создайте 3 таблицы, одна для хранения данных с двумя столбцами, и id (int) и Data (varchar [120]), другая таблица, которая использует идентификатор в качестве иностранного ключа, и последний, который использует Данные как внешний ключ:

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;

Вставлены 100 записей в каждую таблицу и сравнивали окончательный размер таблицы:

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

Поэтому я думаю, что данные не воспроизводятся в иностранном ключе VARCHAR, ну, по крайней мере, в версии MySQL 5.1.

Поддерживать маленький размер ключа всегда хорошо. Вы могли бы обойти проблему иметь большую VARCHAR Индексируется, вместо этого имея дополнительный столбец контрольной суммы, который вы генерируете во время вставки. Это поле контрольной суммы будет содержать вывод алгоритма хэширования CRC32() или, может быть MD5() из более крупного столбца.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top