您好我想知道您的记录必须是唯一的表的最佳做法是什么。我已经看到了两种方法:使用主键或向列添加唯一约束。
如果您使用主键,那么使用诸如“UserName”之类的主键(varchar(*))是不好的做法吗?这是否会影响性能,以至于存在问题?是否最好使用对用户名具有唯一约束的整数id?
我看到一些其他因素可能影响选择列作为PK vs Unique。我对这些是对的吗?
PK - 列应该是一个不需要更改的列
唯一 - 可以稍后更改列
答案 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中的“群集的缺点”),即使导致“更胖”的外键也是如此。