与自动递增的数字相比,电子邮件地址是一个糟糕的初选候选人吗?
我们的web应用程序需要电子邮件地址在系统中是唯一的。所以,我想到使用电子邮件地址为主键。然而,我的同事认为字符串比较将比整数比较慢。
这是一个有效的理由不使用电子邮件为主键吗?
我们使用的是PostgreSQL。
与自动递增的数字相比,电子邮件地址是一个糟糕的初选候选人吗?
我们的web应用程序需要电子邮件地址在系统中是唯一的。所以,我想到使用电子邮件地址为主键。然而,我的同事认为字符串比较将比整数比较慢。
这是一个有效的理由不使用电子邮件为主键吗?
我们使用的是PostgreSQL。
当前回答
字符串比较比int比较慢。但是,如果您只是使用电子邮件地址从数据库检索用户,那么这并不重要。如果您有多个连接的复杂查询,那么这很重要。
如果在多个表中存储有关用户的信息,则用户表的外键将是电子邮件地址。这意味着您将多次存储电子邮件地址。
其他回答
我对postgres不太熟悉。主键是一个很大的主题。我在这个网站(stackoverflow.com)上看到了一些很好的问题和答案。
我认为使用数字主键并在电子邮件列上使用UNIQUE INDEX可以获得更好的性能。电子邮件往往在长度上有所不同,可能不适合主键索引。
在这里和这里读点书。
字符串比较比int比较慢。但是,如果您只是使用电子邮件地址从数据库检索用户,那么这并不重要。如果您有多个连接的复杂查询,那么这很重要。
如果在多个表中存储有关用户的信息,则用户表的外键将是电子邮件地址。这意味着您将多次存储电子邮件地址。
我知道这有点晚了,但我想补充的是,人们放弃电子邮件帐户和服务提供商恢复地址,允许其他人使用它。
正如@HLGEM指出的那样,“Jsmith@somecompany.com很容易在一年后属于约翰·史密斯,两年后属于朱莉娅·史密斯。”在这种情况下,如果约翰·史密斯想要你的服务,你要么拒绝使用他的电子邮件地址,要么删除所有与朱莉娅·史密斯有关的记录。
如果你必须根据当地法律删除与企业财务历史有关的记录,你可能会发现自己陷入困境。
所以我永远不会使用电子邮件地址、车牌等数据作为主键,因为无论它们看起来多么独特,它们都不受你的控制,并且可能会提供一些你可能没有时间处理的有趣挑战。
这很糟糕。假设某个电子邮件提供商倒闭了。用户会想要更改他们的电子邮件。如果你使用e-mail作为主键,用户的所有外键都将复制该电子邮件,这使得更改它非常困难……
... 我甚至还没有开始谈论性能考虑因素。
您应该使用整数主键。如果你需要电子邮件列是唯一的,为什么不简单地在该列上设置一个唯一索引呢?