用户表中以用户登录名作为主键的好处(2009-02-25 13:29)
以前一直认为在一个表中应该使用代理主键而不应该使用业务主键。这个理论大多时候是正确的。但对于用户表我觉得应该使用登录名作为主键。其原因如下:
1. 方便实现日志功能。对用户信息的使用可能出现在软件的不同部分,在不同部分间通常都是传递用户表的主键来标识用户的,如果主键是代理主键则是一个无意义的数字,直接记录到日志中,必然给日志的使用代来不便,想要得到用户的登录名又必须得查询数据库。
2.用户标识在整个系统中的表达存在不一致。由于用户表使用代理主键,这样程序内部需要标识用户时通常会使用代理主键,可是系统的使用者却是以用户的登录名为自身的标识的,相关的功能自然也会以用户的登录名为标识,这样的功能在实现上是以用户的登录名为标识的,要么单独实现这样的功能,要么就不得不将用户的登录名转化为代理主键,然后去调用以代理主键为用户标识的功能。
出于以上两种原因,用户表是应该以用户的登录名为主键的。而用户的登录名的确是可以作为主键的。
注意:这里说的是用户的登录名,并不是实际姓名,它应该是不可修改的,并且是唯一的。
其它的说法:
I would suggest using the username as the primary key in the table if the username is going to be unique, there are a few good reasons to do this:
The primary key will be a clustered index and thus search for a users details via their username will be very quick.
It will stop duplicate usernames from appearing
You don't have to worry about using two different peices of information (username or guid)
It will make writing code much easier because of not having to lookup two bits of information.
出外:http://stackoverflow.com/questions/4911/asp-net-authentication-user-name-vs-user-id
注(2011-01-16):
最近的项目要求把多个web客户端集成到一个Portal里,在Portal中统一进行用户管理,要求用户登录名可改。而我们需要嵌入的那部份的用户登录名是不可改的,必须进行调整。这样看以用户名做主键会遇问题.