gpt4 book ai didi

java - 没有祖先的 Google App Engine HRD 查询

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:52 26 4
gpt4 key购买 nike

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

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

userid 是关键,所以我认为用它来获取将是一致的。但是,当我进行查询(并使用过滤器)以查找具有相同用户名或电子邮件的可能用户时,我无法确定结果是否一致。因此,如果有人在几秒钟前创建了一个具有相同用户名或电子邮件的用户,我可能无法通过查询找到它。我知道祖先用于解决这个问题,但如果我没有祖先可用于查询怎么办?用户没有 parent 。

我很高兴听到您对此的想法,以及在这种情况下什么被认为是最佳实践。如果有任何改变,我将使用 Objectify for GAE。

最佳答案

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

这是我如何解决这个问题的简短介绍:

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、用户名等

关于java - 没有祖先的 Google App Engine HRD 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com