与自动递增的数字相比,电子邮件地址是一个糟糕的初选候选人吗?

我们的web应用程序需要电子邮件地址在系统中是唯一的。所以,我想到使用电子邮件地址为主键。然而,我的同事认为字符串比较将比整数比较慢。

这是一个有效的理由不使用电子邮件为主键吗?

我们使用的是PostgreSQL。


当前回答

我知道这有点晚了,但我想补充的是,人们放弃电子邮件帐户和服务提供商恢复地址,允许其他人使用它。

正如@HLGEM指出的那样,“Jsmith@somecompany.com很容易在一年后属于约翰·史密斯,两年后属于朱莉娅·史密斯。”在这种情况下,如果约翰·史密斯想要你的服务,你要么拒绝使用他的电子邮件地址,要么删除所有与朱莉娅·史密斯有关的记录。

如果你必须根据当地法律删除与企业财务历史有关的记录,你可能会发现自己陷入困境。

所以我永远不会使用电子邮件地址、车牌等数据作为主键,因为无论它们看起来多么独特,它们都不受你的控制,并且可能会提供一些你可能没有时间处理的有趣挑战。

其他回答

我对postgres不太熟悉。主键是一个很大的主题。我在这个网站(stackoverflow.com)上看到了一些很好的问题和答案。

我认为使用数字主键并在电子邮件列上使用UNIQUE INDEX可以获得更好的性能。电子邮件往往在长度上有所不同,可能不适合主键索引。

在这里和这里读点书。

如果你有一个非int值作为主键,那么在大数据上插入和检索将会非常慢。

在逻辑层面上,电子邮件是天然的关键。 在物理层面上,如果您使用的是关系数据库,那么自然键并不适合作为主键。原因主要是别人提到的性能问题。

出于这个原因,设计可以进行调整。自然键成为替代键(UNIQUE, NOT NULL),您使用代理键/人工键/技术键作为主键,在您的情况下,这可以是一个自动递增键。

systempuntoout问道:

如果有人想更改他的电子邮件地址怎么办?你是否也要更改所有外键?

这就是级联的作用。

使用数字代理键作为主键的另一个原因与索引在平台中的工作方式有关。例如,在MySQL的InnoDB中,表中的所有索引都预先挂起了主键,所以你希望PK尽可能小(为了速度和大小)。同样与此相关的是,当主键按顺序存储时,InnoDB会更快,而字符串在那里没有帮助。

使用字符串作为替代键时要考虑的另一件事是,使用您想要的实际字符串的哈希值可能更快,跳过一些字母的大写和小写。(实际上,我降落在这里是为了寻找证据来证实我刚才说的话;还看……)

您应该使用整数主键。如果你需要电子邮件列是唯一的,为什么不简单地在该列上设置一个唯一索引呢?

是的,这是一个糟糕的主键,因为你的用户会想要更新他们的电子邮件地址。