小编典典

外键首选使用string还是int吗?

sql

我有一个带有useridusername列的用户表,两者都是唯一的。

userid和之间username,哪个更好用作外键,为什么?
我的老板想使用字符串,可以吗?


阅读 233

收藏
2021-04-15

共1个答案

小编典典

外键首选使用string还是int吗?

这取决于

关于自然键和替代键之间的折衷,目前已有许多讨论-您将需要确定哪种方法对您有用,以及组织内的“标准”是什么。

对于OP,既有替代键(int userId)也有自然键(charvarchar username)。任一列都可以用作表的主键,并且无论哪种方式,您仍然可以强制另一个键的唯一性。

选择一种方式或其他方式时,请注意以下事项:

使用代理键的情况(例如,UserId INT AUTO_INCREMENT)

如果您使用代理(例如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将更窄(要提取的字节数更少)。

替代整数键的另一个好处是,可以轻松更改用户名,而不会影响表引用MyUsers。如果将username用作自然键,并且其他表与MyUsersvia耦合username,则更改用户名非常不方便(因为否则会违反外键关系)。如果需要在username用作外键的表上更新用户名,则需要像ON
UPDATE CASCADE这样的技术来保持数据完整性。

使用自然键(即用户名)的情况

使用代理键的一个缺点是,如果需要该列,则需要MyUsers将通过代理键引用的其他表JOIN编辑回该MyUsersUsername。自然键的潜在好处之一是,如果查询仅需要Username表引用中的列,则该查询不需要MyUsers重新加入MyUsers以检索用户名,这将节省一些I
/ O开销。

2021-04-15