MySQL表只用VARCHAR作为一个外键(MySQL table with only a varc

2019-09-24 01:05发布

我有一个独特的VARCHAR(512)字段的表。 我想有另一个表持有外键引用此表头。 这两个表使用InnoDB。 如果我添加一个VARCHAR(512)键,第二个表,并添加就可以了外键约束将在512个字节的数据来举行两次?

如果是这样,有没有办法只保持到索引,而不是将varchar本身的参考?

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

非常感谢你,

的Yaniv

Answer 1:

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

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



Answer 2:

我跑一个简单的测试:创建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版本复制。



Answer 3:

保持关键尺寸小总是好的。 你可以得到周围有大的问题VARCHAR通过而不是你产生在插入时额外的校验列索引。 该校验和字段将包含散列算法的输出CRC32()或也许MD5()较大立柱。



文章来源: MySQL table with only a varchar as a foreign key