我想在我的应用中实现友情结构。我的第一个方法是创建具有以下结构的友谊实体
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创建的。但另一方面,我认为这不会在实体之间产生逻辑联系 这是一个好方法,还是我创建一个反模式?
答案 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最终将被重新使用,那么这种孤儿友谊会留下不希望的“复兴”的风险。