0

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

如果您使用主键,那么使用 varchar(*) 之类的主键是否是不好的做法?这对性能的影响是否足以导致问题?是否最好使用对用户名具有唯一约束的整数 id?

我看到了一些其他因素可能会影响选择列作为 PK 与 Unique。我对这些正确吗?

PK - 列应该是永远不需要更改的列

唯一 - 列可以稍后更改

4

3 回答 3

0

在 UserName 上设置主键并不是最好的主意,但它的性能并没有您想象的那么糟糕。

最好的办法是使用 ID (INT) 作为 PRIMARY KEY,使用 UserName 作为 UNIQUE。

于 2012-06-11T13:48:50.807 回答
0

用户名会随着时间而变化,这就是为什么它们不适合进行 PK,尤其是因为您极有可能有与用户名相关联的子记录。例如,假设我的用户名包含我真实姓名的一些变体。如果我后来离婚并恢复了我的娘家姓,我最不想做的就是提醒我结婚的那个 SOB,所以我改变了我的用户名。你真的想改变我在过去十年中发布的 200 万个帖子吗?我不这么认为。

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

于 2012-06-11T15:00:41.070 回答
0

正如其他人已经讨论过的那样,这可能是一个好主意,也可能不是一个好主意。让我再补充一个细节......

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

主要区别通常与聚类有关。大多数 DBMS(支持集群)自动使用 PK 作为集群索引。例如 MySQL/InnoDB总是集群数据并且你不能关闭它,而 MS SQL Server 默认集群(你必须使用特殊的语法来关闭它)。

如果您选择使用集群(或被您的 DBMS 强制),通常使用更少的索引会更好(例如,请参阅本文中的“集群的缺点” ),即使会导致“更胖”的外键。

于 2012-06-11T15:31:33.320 回答