我有一个带有userid和username列的用户表,两者都是唯一的。
userid
username
在userid和之间username,哪个更好用作外键,为什么? 我的老板想使用字符串,可以吗?
外键首选使用string还是int吗?
这取决于
关于自然键和替代键之间的折衷,目前已有许多讨论-您将需要确定哪种方法对您有用,以及组织内的“标准”是什么。
对于OP,既有替代键(int userId)也有自然键(char或varchar username)。任一列都可以用作表的主键,并且无论哪种方式,您仍然可以强制另一个键的唯一性。
int userId
char
varchar username
选择一种方式或其他方式时,请注意以下事项:
使用代理键的情况(例如,UserId INT AUTO_INCREMENT)
如果您使用代理(例如UserId INT AUTO_INCREMENT)作为主键,则所有引用该表的表MyUsers都应用UserId作外键。
UserId INT AUTO_INCREMENT
MyUsers
UserId
但是,您仍然可以username通过使用其他唯一索引来强制列的唯一性,例如:
CREATE TABLE `MyUsers` ( `userId` int NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL, ... other columns PRIMARY KEY(`userId`), UNIQUE KEY UQ_UserName (`username`)
按照@Dagon,使用窄的主键(如int)比使用较宽的(和可变长度)值(如)具有性能和存储优势varchar。此优点还影响引用的其他表MyUsers,因为的外键userid将更窄(要提取的字节数更少)。
int
varchar
替代整数键的另一个好处是,可以轻松更改用户名,而不会影响表引用MyUsers。如果将username用作自然键,并且其他表与MyUsersvia耦合username,则更改用户名非常不方便(因为否则会违反外键关系)。如果需要在username用作外键的表上更新用户名,则需要像ON UPDATE CASCADE这样的技术来保持数据完整性。
使用自然键(即用户名)的情况
使用代理键的一个缺点是,如果需要该列,则需要MyUsers将通过代理键引用的其他表JOIN编辑回该MyUsers表Username。自然键的潜在好处之一是,如果查询仅需要Username表引用中的列,则该查询不需要MyUsers重新加入MyUsers以检索用户名,这将节省一些I / O开销。
JOIN
Username