SQL:要主键还是不要主键?

Gid*_*don 3 sql indexing primary-key

我有一个包含用户设置集的表,它包含以下列:

UserID INT
Set VARCHAR(50)
Key VARCHAR(50)
Value NVARCHAR(MAX)
TimeStamp DATETIME
Run Code Online (Sandbox Code Playgroud)

UserID与Set和Key一起是唯一的.因此,特定用户在特定设置集中不能具有两个相同的键.设置按集检索,因此如果用户从某个集合请求某个密钥,则会下载整个集合,以便下次需要来自同一集合的密钥时,不必转到数据库.

我应该在所有三列(userid,set和key)上创建一个主键,还是应该创建一个具有主键的额外字段(例如一个名为SettingID的自动增量整数,我猜错误的想法),或者不创建一个主键键,只是创建一个独特的索引?

-----更新-----

只是为了清理:这是行表的一个结尾,它无论如何都没有加入.UserID是Users表的FK.套装不是FK.它几乎是我GUI的帮助表.举个例子:用户第一次访问网站的部分内容,这是一个帮助气球,他们可以根据需要关闭.一旦他们点击它,我将添加一些设置到"GettingStarted"设置,该设置将声明他们的helpballoon X已被禁用.下次当用户访问同一页面时,该设置将指出不再显示帮助气球X.

Ste*_*ger 7

拥有复合唯一键通常不是一个好主意.

将任何业务相关数据作为主键也可能会给您带来麻烦.例如,如果您需要更改值.如果在应用程序中无法更改值,则可能在将来,或者必须在升级脚本中更改.

最好创建一个代理键,一个没有任何商业含义的自动编号.

更新后编辑:

在这种情况下,您可以考虑在概念上没有主键,并使这三列成为复合唯一键的主键(使其可更改).