我有一个包含用户设置集的表格,它包含以下列:
UserID INT
Set VARCHAR(50)
Key VARCHAR(50)
Value NVARCHAR(MAX)
TimeStamp DATETIME
UserID 与 Set 和 Key 一起是唯一的。因此,特定用户不能在一组特定设置中拥有两个相同的键。设置是按集合检索的,因此如果用户从某个集合中请求某个 key ,则会下载整个集合,这样下次需要同一集合中的 key 时,就不必去数据库了.
我应该在所有三列(userid、set 和 key)上创建一个主键,还是应该创建一个具有主键的额外字段(例如,一个名为 SettingID 的自动增量整数,我猜这是个坏主意),或者不创建一个主键,然后只创建一个唯一索引?
----- 更新 -----
只是为了澄清一下:这是行表的结尾,无论如何它都没有加入。 UserID 是用户表的 FK。 Set 不是 FK。它几乎是我的 GUI 的辅助表。 举个例子:用户第一次访问网站的某些部分时会得到一个帮助气球,如果他们愿意,他们可以关闭它。一旦他们点击它,我将在“GettingStarted”集中添加一些设置,表明他们的 helpballoon X 已被禁用。下次当用户访问同一页面时,该设置将声明不再显示帮助气球 X。
最佳答案
拥有复合唯一键通常不是一个好主意。
将任何业务相关数据作为主键也会给您带来麻烦。例如,如果您需要更改值。如果无法在应用程序中更改该值,则可能在将来发生,或者必须在升级脚本中进行更改。
最好创建一个代理键,一个没有任何商业意义的自动编号。
编辑更新后:
在这种情况下,您可以考虑在概念上没有主键,并将这三列设为复合唯一键的主键(使其可更改)。
关于SQL:主键还是不主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/828582/