我正在开发一个Java Web应用程序。对于身份验证,我要求用户输入他的电子邮件和密码。现在,我正在使用JPA 2,这可能不是那么重要 如果电子邮件是Users表的关键,那么它将简化我的生活。我可以做一个简单的事情:
User selected = em.find(User.class, userEmail);
参见?,此外,每个电子邮件地址都是唯一的,它没有空格等。现在,没有人这样做,我猜这是有原因的。我也怀疑,我的意思是,它是varchar等。但你认为这是一个好主意吗?如果没有,为什么?这必须是一个很好的理由,因此权衡不值得。 数字键总是最好的,但在这里我发现自己一遍又一遍地处理用户的电子邮件,并且一直通过电子邮件搜索它们,除了连接列等之外从未真正使用过id。
答案 0 :(得分:5)
想到的最大问题是用户的电子邮件地址会随着时间的推移而发生变化。如果您设置一个系统,其中电子邮件地址是主键,那么稍后更改电子邮件地址是一种巨大的痛苦 - 您必须将更改传播到所有子表,这将要求所有外键约束都可以推迟
答案 1 :(得分:3)
除了
如果用户可以选择更改其电子邮件ID,则最终会更改主键,这将是一个很大的努力/混乱。
答案 2 :(得分:1)
表可以有多个键。使电子邮件成为候选键。我喜欢将PK视为竞选美国总统。你有多个候选人,但只有1人可以担任总统。
其他人说的很好。如果值发生更改,则您不希望更新其他30个表。这有利于代理键(除了识别行之外没有任何意义的键)。由于代理人没有任何意义,你不必担心他们的价值在变化。通常它们是一个自动增量整数。
返回原点。你的代码:
User selected = em.find(User.class, userEmail);
无论电子邮件是主要密钥还是候选密钥,该代码都应完全有效。如果您的框架需要在主键上搜索,那么您最好在现实世界中进行尖叫,因为您搜索的不仅仅是PK。