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

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

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

我们使用的是PostgreSQL。


当前回答

整数主键更好的另一个原因是当您在不同的表中引用电子邮件地址时。如果address本身是一个主键,那么在另一个表中你必须使用它作为一个键。所以你可以多次存储电子邮件地址。

其他回答

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

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

在这里和这里读点书。

如果只是要求电子邮件是唯一的,那么你可以用该列创建一个唯一的索引。

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

您可能需要考虑任何适用的数据法规。电子邮件是个人信息,例如,如果你的用户是欧盟公民,那么根据GDPR,他们可以指示你从你的记录中删除他们的信息(记住,无论你在哪个国家,这都适用)。

如果出于参考完整性或审计等历史原因,需要将记录本身保存在数据库中,则使用代理键将允许您将所有个人数据字段设置为NULL。如果他们的个人数据是主键,这显然不那么容易

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

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

systempuntoout问道:

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

这就是级联的作用。

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

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