Mysql 创建混合数字和字母主键

Mysql 创建混合数字和字母主键,mysql,database,database-design,mariadb,Mysql,Database,Database Design,Mariadb,我在mysql服务器中复制了一个现有的桌面数据库。当前数据库有一个customers表,其中一个字段表示公司服务的区域或区域。分区如下:1A、1B、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17 为了进行设置,为了匹配它们现有的数据集,我设置了一个参考表(customer_zones),其中的分区以一对多的关系链接到Customers表。每个区域可以有许多客户。每个客户只有一个区域 问题是“1A”和“1B”区域不允许我在customer_zones表上设置int主

我在mysql服务器中复制了一个现有的桌面数据库。当前数据库有一个customers表,其中一个字段表示公司服务的区域或区域。分区如下:1A、1B、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17

为了进行设置,为了匹配它们现有的数据集,我设置了一个参考表(customer_zones),其中的分区以一对多的关系链接到Customers表。每个区域可以有许多客户。每个客户只有一个区域


问题是“1A”和“1B”区域不允许我在customer_zones表上设置int主键。我必须使用varchar(2)作为主键。这是好的做法吗?还是最佳解决方案?

主键是聚集索引,表中数据的物理表示是因为主键和数字搜索比字符串快

根据您的情况,以下是方法

接近A

如果为表
customer\u zones
中的主键字段选择区域id为
varchar(2)
,则可以将其引用到
customer
表中的外键字段,您的问题将得到解决

方法B

如果将主键用作表
customer\u zone
中的
integer
,那么要存储1A、1B等区域,您需要多一个字段,并且在该字段上,您需要一个唯一的键,以避免数据重复


如果您遵循一种方法会更好,因为对于相同的功能,一个约束会更简单。

我赞成
主键(区域)
VARCHAR(2)
,而不是代理
自动增量

  • 与算术/字符串比较/函数等的细节相比,查询涉及的行数对性能的影响要大得多
  • 即使有数百万行,“数字比字符串快”也不太可能被注意到
  • 如果更改为代理项涉及额外的
    连接
    ,则这是额外的开销
  • 查看“1A”和“16”等更方便(手动查看数据时)
  • 我发现3次中有2次我使用的是“自然”主键,而不是“代理”(
    AUTO_INCREMENT
    )。对于多:多映射表,使用复合PK而不是代理显然更有效
在您的情况下,我建议进行以下小优化:

 VARCHAR(2) CHARACTER SET ascii
这避免了utf8的较小开销


我对GUID、UUID、sha1、md5、ip地址、国家代码、邮政编码、zipcode电话号码等进行了类似的论证。对于真正固定长度的字段,如两个字母的国家代码,使用
CHAR(2)
而不是
VARCHAR(2)

无论哪种方式,听起来都不是什么“问题”。FWIW,我会有一个代理,整数PK。使用方法a:
PRIMARY KEY(zone)
作为
VARCHAR(2)
。数据的清晰性远远超过了使用ints而不是varchars时的微不足道的性能差异。嗨,Rick,我们都建议使用方法A,但我无法理解您提供的原因。我可以看出您在数据库方面有着丰富的经验,如果您能帮助我理解这一点,我将不胜感激。是的,我在MySQL/MariaDB方面有大约20年的经验,其中大部分集中在性能和扩展方面。18个“区域”构成了一个小桌子,但养成以最佳方式设计桌子的习惯是很好的。(请参阅我的答案以解决您的问题。)