我有一个独特的VARCHAR(512)字段的表。 我想有另一个表持有外键引用此表头。 这两个表使用InnoDB。 如果我添加一个VARCHAR(512)键,第二个表,并添加就可以了外键约束将在512个字节的数据来举行两次?
如果是这样,有没有办法只保持到索引,而不是将varchar本身的参考?
总之,我的问题是,在InnoDB的是那里举行外键LONG VARCHAR领域的有效途径?
非常感谢你,
的Yaniv
我有一个独特的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()
较大立柱。