SQL:主键还是不主键?

标签 sql indexing primary-key

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

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/

相关文章:

mysql - 聚集索引在SQL查询上的性能

javascript - 插入或拖动后重新索引对象数组的算法 'n' 放置顺序更改

sqlite - 如何在 Sqlite 中指定主键

performance - GUID + 自动增量 ID = 性能缓慢?

sql - Postgresql使用sql将相邻数据平均到新表中

PHP 或 SQL 问题

SQL Server 存储过程因使用 XML/ANSI_NULLS、QUOTED_IDENTIFIER 选项而失败

mysql - 仅在 MYSQL DATEDIFF 中显示小时数

java - Hibernate - 打开和关闭 SQL 索引的使用

java - 在 cassandra 主数据库中包含枚举列是否会影响 cassandra 负载平衡?