客体化,有效的关系。价<> vs存储ID和重复字段

时间:2017-01-09 08:30:22

标签: performance google-cloud-datastore objectify relationships ref

我很难理解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,所有数据都将存在。现在,我的问题是。这种方法之间的性能是否存在显着差异?效率是我的首要任务,但第二种解决方案对我来说似乎是丑陋和危险的,因为它导致数据重复,当用户改变他的昵称时,我也需要更新他的行动。

1 个答案:

答案 0 :(得分:1)

你问的是 denormalize 这个昵称是否更好。如果不知道你打算运行什么类型的查询,很难说,但一般来说答案可能是否定的。这听起来像是过早的优化。

您可以考虑的一件事是让用户成为UserAction的@Parent Ref<?>。这样,父项将在同一批量的动作获取的同时获取。只要它符合您所需的事务吞吐量(整个用户实体组每秒不超过1次更改),它应该没问题。