我很难理解Objectify实体关系概念。假设我有实体User和UsersAction。
class User{
String nick;
}
class UsersAction{
Date actionDate;
}
现在在frond-end应用程序中,我想加载许多UsersActions并显示它,以及相应的用户昵称。我熟悉处理这个问题的两个概念:
使用Ref<>,
我可以在UsersAction中放置一个@Load Ref,因此它将在这个entites之间创建一个链接。稍后在加载用户操作时,Objectify将加载适当的用户。
class User{
String nick;
}
class UsersAction{
@Load Ref<User> user;
Date actionDate;
}
在UsersAction中存储ID并复制缺口:
我还可以在UsersAction中存储用户ID,并在保存UsersAction时复制用户的昵称。
class User{
String nick;
}
class UsersAction{
Long usersId;
String usersNick;
Date actionDate;
}
当使用Ref&lt;&gt;时,据我所知,Objectify将加载所有需要的UsersActions,然后加载所有相应的用户。使用复制时,Objectify只需加载UsersActions,所有数据都将存在。现在,我的问题是。这种方法之间的性能是否存在显着差异?效率是我的首要任务,但第二种解决方案对我来说似乎是丑陋和危险的,因为它导致数据重复,当用户改变他的昵称时,我也需要更新他的行动。
答案 0 :(得分:1)
你问的是 denormalize 这个昵称是否更好。如果不知道你打算运行什么类型的查询,很难说,但一般来说答案可能是否定的。这听起来像是过早的优化。
您可以考虑的一件事是让用户成为UserAction的@Parent Ref<?>
。这样,父项将在同一批量的动作获取的同时获取。只要它符合您所需的事务吞吐量(整个用户实体组每秒不超过1次更改),它应该没问题。