Objectify,手动设置实体ID /名称 - 用例

时间:2017-02-05 21:58:56

标签: google-app-engine objectify anti-patterns

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

var receivedParams = [{"fName":"mike"},{"fName":"john"}];

$http({method: 'GET', url: '/sales.json', params: receivedParams})
  .then(function successCallback(response) {
    //do stuff
  });
};

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

userB

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

1 个答案:

答案 0 :(得分:2)

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

否则对我来说看起来不错。另请参阅re-using an entity's ID for other entities of different kinds - sane idea?

删除User实体时,请务必注意始终删除所有其他用户使用该用户ID的所有友情。如果相应的用户ID最终将被重新使用,那么这种孤儿友谊会留下不希望的“复兴”的风险。