与自动递增的数字相比,电子邮件地址是一个糟糕的初选候选人吗?
我们的web应用程序需要电子邮件地址在系统中是唯一的。所以,我想到使用电子邮件地址为主键。然而,我的同事认为字符串比较将比整数比较慢。
这是一个有效的理由不使用电子邮件为主键吗?
我们使用的是PostgreSQL。
与自动递增的数字相比,电子邮件地址是一个糟糕的初选候选人吗?
我们的web应用程序需要电子邮件地址在系统中是唯一的。所以,我想到使用电子邮件地址为主键。然而,我的同事认为字符串比较将比整数比较慢。
这是一个有效的理由不使用电子邮件为主键吗?
我们使用的是PostgreSQL。
当前回答
这取决于桌子。如果表中的行表示电子邮件地址,那么电子邮件是最好的ID。如果不是,那么电子邮件不是一个好的ID。
其他回答
你的同事是对的:使用一个自动递增的整数作为你的主键。
您可以在应用程序级别实现电子邮件唯一性,或者您可以将电子邮件地址列标记为惟一,并在该列上添加索引。
将字段添加为唯一字段只会在插入到该表时花费字符串比较的成本,而不会在执行连接和外键约束检查时花费字符串比较成本。
当然,您必须注意,在数据库级别向应用程序添加任何约束都可能导致应用程序变得不灵活。在仅仅因为应用程序需要某个字段是唯一的或非空的,就将它设置为“唯一的”或“非空的”之前,一定要充分考虑。
我知道这有点晚了,但我想补充的是,人们放弃电子邮件帐户和服务提供商恢复地址,允许其他人使用它。
正如@HLGEM指出的那样,“Jsmith@somecompany.com很容易在一年后属于约翰·史密斯,两年后属于朱莉娅·史密斯。”在这种情况下,如果约翰·史密斯想要你的服务,你要么拒绝使用他的电子邮件地址,要么删除所有与朱莉娅·史密斯有关的记录。
如果你必须根据当地法律删除与企业财务历史有关的记录,你可能会发现自己陷入困境。
所以我永远不会使用电子邮件地址、车牌等数据作为主键,因为无论它们看起来多么独特,它们都不受你的控制,并且可能会提供一些你可能没有时间处理的有趣挑战。
您可以通过使用整数主键来提高性能。
主键应该是唯一的常量
电子邮件地址随着季节的变化而变化。作为查找的辅助键很有用,但作为主键不太合适。
不要使用电子邮件地址为主键,保持电子邮件的唯一性,但不要使用它为主键,使用用户id或用户名为主键