对象化,手动设置实体 id/name - 用例

Objectify, setting entity id/name manually - use cases

我想在我的应用程序中实现友谊结构。我的第一种方法是创建具有以下结构的 Friendship 实体

@Entity Friendship{
    @Id Long id;
    @Parent User<Key> userA;
    @Index User<Ref> userB;
}

每个友谊都由两个友谊实体表示,每个用户一个。这适用于简单的情况,但现在我想 运行 查询 find user's friends with name foo,所以我在 Friendship 中添加 @Index String userBName,并在创建实体时设置它。但是每次 userB 更改他的名字时都需要更新这个值,加上它是索引中的附加列,这是我想避免的事情。
所以我想出了另一种方法:删除 userB 属性 并将 Friendship id 设置为 @Id 将被 userB 引用的用户。然后我将能够查询具有给定名称的用户,根据它的 @Id 创建密钥并按父级和创建的密钥过滤友谊。

@Entity Friendship{
    @Id Long id;
    @Parent User<Key> userA;
}
Key<User> userA;
Key<User> userB;
Friendship friendshipA;
Friendship friendshipB;

CreateFriendship(){
    friendshipA.setId(userB.getId());
    friendshipA.setUserA(userA);

    friendshipB.setId(userA.getId());
    friendshipB.setUserA(userB);
}

现在我的问题是:这是手动设置实体 ID 的正确用例吗?我认为它会起作用,因为 Key 是由父类、类型和 ID 创建的。但另一方面,我不认为这会在实体之间建立逻辑联系。
这是一个好方法,还是我在创建反模式?

如果您的任何 User 实体(即 Friendship 父实体)本身可以有父实体,那么它们的 ID 保证是唯一的,因此它们不能用作 Friendship(或任何其他实体类型)ID。您必须使用整个用户密钥,而不仅仅是 ID,就像在您的 pre-proposal 代码中一样。

否则我觉得还可以。另见

删除 User 实体时请注意始终删除所有其他用户与该用户 ID 的所有友谊。如果相应的用户 ID 将来最终成为 re-used,则遗留的此类孤儿友谊会带来不受欢迎的 "revival" 风险。