sql - 使用 char 作为主键/外键是否不行?

标签 sql mysql database-design data-modeling innodb

假设有一堆链接到“国家”或“货币”表的表。

为了使数据更易于阅读,我希望将带有国家代码(例如美国、英国、澳大利亚)和货币代码(美元、澳元)的 CHAR 字段作为这两个表中每一个的主键,所有其他表都将使用此 CHAR 作为外键。

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

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

最佳答案

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

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

更多信息 Name Changes Since 1990: Countries, Cities, and More

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

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

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

为了完整性,您可能需要引用 Database Development Mistakes Made by AppDevelopers .

关于sql - 使用 char 作为主键/外键是否不行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1419210/

相关文章:

MySQL 自动递增自定义值

c# - 在数据库中存储货币值的最佳方式是什么?

php - 每个类别的帖子限制 10 条记录

php - MySQL不会更新

sql - SQL 中自然键的最佳示例是什么?

database - 用于将现实世界的选择排列表示为树的数据模型模式的名称是什么?

mysql - 数据库/SQL 边缘案例

mysql - 如何使用 laravel 将 Mysql(大)表导出为 CSV?

java - 我需要在 Hibernate 中手动创建关系表吗?

php - 如何显示group by中的所有列