Database design 用户名是主键的有效候选项吗?

Database design 用户名是主键的有效候选项吗?,database-design,primary-key,authentication,Database Design,Primary Key,Authentication,我知道通常推荐使用代理主键而不是自然主键,但在用户名方面,是否有支持代理主键的论点?从客户的角度来看,当然。我不希望我的用户名是DWong1145 否,您应该仅将用户名用作唯一键/常量。用户名可以更改,例如:它可能是商标,所有者要求您删除它。如果您不想获得重复的用户名,请创建一个 如果DWong1145想要更改它的用户名怎么办?你能让所有的数据库关系都是更新级联< /C> > < P>这在某种意义上是一个很好的候选者,但是你必须考虑如果你真的想这么做。例如,您有一个具有特定用户名的用户,然后该

我知道通常推荐使用代理主键而不是自然主键,但在用户名方面,是否有支持代理主键的论点?

从客户的角度来看,当然。我不希望我的用户名是DWong1145

,您应该仅将用户名用作唯一键/常量。用户名可以更改,例如:它可能是商标,所有者要求您删除它。

如果您不想获得重复的用户名,请创建一个


如果
DWong1145
想要更改它的用户名怎么办?你能让所有的数据库关系都是<代码>更新级联< /C> >

< P>这在某种意义上是一个很好的候选者,但是你必须考虑如果你真的想这么做。例如,您有一个具有特定用户名的用户,然后该用户被“删除”(或标记为已删除)。因此,实际上没有理由不允许使用相同的用户名创建另一个用户,但它已经被“接受”,因为它是主键。

将字符串作为主键的一个大缺点是,不管它是用户名还是其他什么,引用表的所有外键列也必须是字符串,这既慢又浪费更多空间。

我的问题是在不允许更改用户名的身份验证系统中。我应该提到这一点。@Emanuil-引用《侏罗纪公园》中的杰夫·戈德布鲁姆的话,“生活找到了一条路。”如果有一天你需要更改用户名,你可能会后悔现在这个时刻……
信息不应该用作键;
数据
可以”<代码>数据
不需要更改,就好像总是要被程序理解一样。如果我打电话给SO并要求更改我的用户id怎么办?我不能这样做,但我可以更改我的用户名。听起来有点简练;)不过你是对的。我讨厌你不能更改用户名的系统——不过,OP在评论中说,他不想更改用户名,所以……不必再慢了。好的数据库引擎可以预先散列任何字符串值。除此之外,使用自然键可能会消除应用程序中许多连接的需要,从而加快查询速度。我承认自然钥匙通常会占用更多空间,但老实说,空间既便宜又充足。