我有单个唯一VARCHAR(512)字段的表。我想有另一个表持有外键引用此表头。这两个表使用InnoDB。 如果我添加一个VARCHAR(512)键到第二表并添加在其上的外键约束将在512个字节长的数据被保持两次?

如果是这样,有一种方法来仅保持到索引的引用,而不是将varchar本身?

总之,我的问题是,在InnoDB的是那里举行外键LONG VARCHAR领域的有效方式?

非常感谢你,

参见Yaniv

有帮助吗?

解决方案

是,如果有在引用表中的列VARCHAR(512),数据将存在两次。

我建议你做引用表的外键指向一个整数主键第一个表,而不是512字节的数据。这是什么样的正常化是怎么一回事。

其他提示

我跑一个简单的测试:创建3个表,一个本身具有两列保持数据,和ID(int)和数据(VARCHAR [120]),另一个使用ID作为外键和最后表一个使用该数据作为外键:

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