一尘不染

使用char作为主/外键是不是吗?

sql

考虑有一堆表链接到“国家”或“货币”表。

为了使数据更易于阅读,我希望将带有国家/地区代码(例如美国,GB,AU)和货币代码(USD,AUD)的CHAR字段作为这两个表中每个表的主键,所有其他表都将使用此CHAR作为前键。

数据库是带有innodb引擎的mysql。

这会导致性能问题吗?这是我应该避免的事情吗?


阅读 232

收藏
2021-03-17

共1个答案

一尘不染

性能并不是真正的主要问题,至少对我而言不是。问题更多是关于代理与自然键。

国家/地区代码不是静态的。他们可以而且确实会改变。国家将名称更改(例如,埃塞俄比亚改为厄立特里亚)。它们应运而生(例如南斯拉夫或苏联解体)而不再存在(例如西德和东德)。发生这种情况时,ISO标准代码会更改。

自1990年以来的更多名称更改:国家,城市等

代理键往往会更好,因为当这些事件发生时,键不会更改,只有引用表中的列会更改。

因此,我更倾向于使用int主键创建国家和货币表。

话虽如此,varchar关键字段将占用更多空间,并具有某些性能劣势,除非您要执行大量查询,否则可能不会成为问题。

2021-03-17