2011-01-08 201 views
3

我有一个用户表,其中有数以百万计的行,并有一个字段用户名(varchar),我应该让它成为主键而不是唯一的索引?添加一个额外的字段user_id(int)并使其成为主键有什么优点或缺点?我不明白我会在哪里使用user_id,除非说连接条件,int上的连接会比varchar上的连接快吗?或是否?(因为这两个字段都被索引)数据库主键

更新:假设更改用户名不是一个选项。

+1

您是否曾希望用户能够更改他们的用户名? VARCHAR有多长?如果后者的关键字长度更长,则基于INTEGER的查找可能比VARCHAR上的查找更快。 – Rob 2011-01-08 14:36:23

+0

不,我不希望他们更改用户名 – user157195 2011-01-08 14:39:22

+1

你绝对,100%肯定这是永远不会需要的?我希望我能预测未来... – Rob 2011-01-08 14:44:20

回答

3

首先,我第二次感谢弗雷德里克的评论:我坚信不会将任何商业或功能价值归于表格的主键。现在可能没有选择更改用户名的选项,但可能稍后会有。即使没有,最好是养成习惯,并与所有表格保持一致,而不是混合范式。

使用数字(或以某种方式顺序)主键的次要原因是插入和更新速度。虽然这可以更改,但默认情况下,表上的主键也是聚簇索引。聚集索引确定表中行的物理顺序,因此按顺序插入一个值会导致数据库引擎在所有行之后移动,以便将其插入到适当的位置。对于具有数百万行的表,这可以是不重要的插入或更新操作。

2

我更喜欢数字PK的原因是我可以很容易地改变用户名。

如果用户名也是主键,则意味着与该用户相关的所有记录也必须在更改用户名时进行更改。

请注意,您的数据库可以通过多种方式为数字PK生成正确的ID。在MySQL上它增加了一个“auto_increment”属性到字段上,在Postgres和Oracle上它是通过序列。

如果您有数以亿计的行,但您是正确的,你可能会更好地使用用户名。我尽量避免变种PK在表格之间浮动,只会让那些跟着我进入代码的人保持整个事情变得更加困难,除非这是绝对必要的。

+0

如果更改用户名不是一个选项,那么没有理由使用额外的数字PK? – user157195 2011-01-08 14:40:32

3

我希望添加一个额外的字段作为主键。

主要原因是-imho-主键应该没有“商业”价值。主键只是一个管理项目,它只对数据库非常重要,因此可以保证完整性。
正如Brian已经提到的那样,通过添加代理主键,您可以 - 在您的情况下 - 允许用户更改其用户名而不会出现问题。

主键的值不应该改变:否则当你有很多外键时更新可能会变得非常昂贵。所有这些变化应该级联到相关表格。

除此之外,整数例如是4个字节,而您的usename列要大得多。
这不仅意味着您将在相关表格中占用更多空间,而且这也意味着您的索引将会变大。
构成索引的存储桶将包含更少的“记录指针”,这意味着您将拥有更多存储桶,这意味着您的索引将会变慢。