使用字符串作为PK vs使用GUID或int Id使用唯一约束进行名称

时间:2012-06-11 13:37:07

标签: sql database-design relational-database

您好我想知道您的记录必须是唯一的表的最佳做法是什么。我已经看到了两种方法:使用主键或向列添加唯一约束。

如果您使用主键,那么使用诸如“UserName”之类的主键(varchar(*))是不好的做法吗?这是否会影响性能,以至于存在问题?是否最好使用对用户名具有唯一约束的整数id?

我看到一些其他因素可能影响选择列作为PK vs Unique。我对这些是对的吗?

PK - 列应该是一个不需要更改的列

唯一 - 可以稍后更改列

3 个答案:

答案 0 :(得分:0)

在UserName上使用主键并不是最好的主意,但它的性能并不像你想象的那么糟糕。

最好的想法是将ID(INT)用作PRIMARY KEY,将UserName用作UNIQUE。

答案 1 :(得分:0)

用户名随着时间的推移而变化,这就是为什么他们是PK的不良候选人,特别是因为你很可能有与用户名相关联的子记录。例如,假设我的用户名包含了我的真实姓名的一些变体。如果我然后离婚并回到我的婚前姓名,我想要做的最后一件事是提醒我SOB我已经结婚,所以我改变了我的用户名。你真的想改变我过去十年里发的200万个帖子吗?我不这么认为。

是字符串比较较慢但这可能是也可能不是问题,具体取决于数据库将获得的总操作量。拥有少于200个用户的小型copmany数据库,可能不是问题,拥有数百万用户的互联网站点,更有可能成为问题。

答案 2 :(得分:0)

其他人已经讨论过这可能是也可能不是一个好主意。让我再添加一个细节......

  

我看到一些其他因素可能会影响选择一个列作为PK vs Unique。

主要区别通常与clustering有关。大多数DBMS(支持群集)自动使用PK作为群集索引。例如,MySQL / InnoDB 总是对数据进行聚类,并且您无法将其关闭,而默认情况下是MS SQL Server群集(您必须使用特殊语法将其关闭)。

如果您选择使用群集(或由DBMS强制使用),索引较少通常会更好(例如,参见this article中的“群集的缺点”),即使导致“更胖”的外键也是如此。