没有祖先的Google App Engine HRD查询

Joe*_*oel 5 java google-app-engine objectify google-cloud-datastore

我有一个用Java编写的GAE项目,我对HRD和一个我不确定如何解决的问题有一些想法.

基本上我的系统中有用户.用户由用户标识,用户名,电子邮件和密码组成.每次我创建一个新用户时,我想检查是否已经有一个用户具有相同的用户ID(应该永远不会发生),用户名或电子邮件.

用户标识是关键,因此我认为使用此标准将是一致的.但是,当我进行查询(并使用过滤器)查找具有相同用户名或电子邮件的可能用户时,我无法确定结果是否一致.因此,如果有人在几秒钟之前创建了具有相同用户名或电子邮件的用户,我可能无法通过查询找到它.我知道祖先习惯于解决这个问题,但如果我没有用于查询的祖先呢?用户没有父母.

我很高兴听到您对此的看法,以及在这些情况下被认为是最佳做法.如果改变了什么,我正在使用Objectify for GAE.

sti*_*ure 7

我不建议您为用户实体使用电子邮件或任何其他自然密钥.用户更改其电子邮件地址,并且您不希望在有人更改其电子邮件时最终重写数据库中的所有外键引用.

以下是我如何解决此问题的简短介绍:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的用户实体中还有一个(未规范化的)电子邮件字段,我在发送出站电子邮件时使用该字段(保留案例以防万一对某人有用).当有人使用特定电子邮件创建帐户时,我会在XG事务中按键加载/创建EmailLookup和用户实体.这可以保证任何个人电子邮件地址都是唯一的.

同样的策略适用于任何其他类型的独特价值; Facebook用户名,用户名等