MySQL外键使用id还是值?

时间:2012-02-11 21:34:59

标签: mysql indexing foreign-keys foreign-key-relationship

外键是数字ID还是我可以使用其他值?我目前使用id但我必须继续加入/查询表,以便在验证,插入等之前将值转换为id。(除了输入,我还在代码中引用值而不是id)例如,假设我有{{ 1}} table - 我可以取消数字id并保留值('active','suspended'等)?

这主要用于资源/有些静态表。

加分问题:我是否需要连接表中的id字段?我没有看到他们的目的。

可能?缺点?建议?

2 个答案:

答案 0 :(得分:3)

您可以将char或其他类型的列用作外键。问题是你的列会更宽。足以存储256种不同状态的TINYINT需要1个字节。一个CHAR(10),因此您可以存储'Active''Suspended'等,需要10个字节。不仅行数会更宽,而且指数也会更宽。对于现代硬盘而言,空间可能不是问题,但索引大小也会影响效率。

所以,是的,如果可以容忍性能下降,你可以取消数字ID并只保留值。

或者,您可以使用CHAR(1)作为status表的主键(在其他表中使用外键作为外键),因此'A'可以'Active'用于'S' 1}},'Suspended'用于ENUM等。如果您的状态不超过26种,则可以使用它。

MySQL {{1}}类型有几个问题,Bill Karwin在这里的回答中有描述:Mysql ENUM type vs join tables

答案 1 :(得分:2)

外键也可以引用其他类型的列。

如果您想要有效使用几个不同的字符串,建议使用

enum。它们将在内部整数,但您可以使用它们的名称。 mysql reference