外键是数字ID还是我可以使用其他值?我目前使用id但我必须继续加入/查询表,以便在验证,插入等之前将值转换为id。(除了输入,我还在代码中引用值而不是id)例如,假设我有{{ 1}} table - 我可以取消数字id并保留值('active','suspended'等)?
这主要用于资源/有些静态表。
加分问题:我是否需要连接表中的id字段?我没有看到他们的目的。
可能?缺点?建议?
答案 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