我不建议为您的用户实体使用电子邮件或任何其他自然键。用户更改他们的电子邮件地址,并且您不希望在有人更改他们的电子邮件时最终重写数据库中的所有外键引用。
以下是关于我如何解决此问题的简短说明:
https://groups.google.com/d/msg/google-appengine/NdUAY0crVjg/3fJX3Gn3cOYJ
创建一个单独的 EmailLookup 实体,其 @Id 是电子邮件地址的规范化形式(我只是将所有内容都小写 - 技术上不正确,但当用户不小心将 Joe@example.com 大写时会省去很多痛苦)。我的 EmailLookup 如下所示:
@Entity(name="Email")
public class EmailLookup {
/** Use this method to normalize email addresses for lookup */
public static String normalize(String email) {
return email.toLowerCase();
}
@Id String email;
@Index long personId;
public EmailLookup(String email, long personId) {
this.email = normalize(email);
this.personId = personId;
}
}
我的用户实体中还有一个(未规范化的)电子邮件字段,我在发送出站电子邮件时使用它(保留大小写以防对某人很重要)。当有人使用特定电子邮件创建帐户时,我在 XG 事务中通过密钥加载/创建 EmailLookup 和用户实体。这保证了任何个人电子邮件地址都是唯一的。
相同的策略适用于任何其他类型的独特价值;facebook id、用户名等