客观化、有效的关系。 Ref<> 与存储 id 和复制字段

Objectify, efficient relationships. Ref<> vs storing id and duplicating fields

我很难理解 Objectify 实体关系概念。假设我有实体 User 和 UsersAction。

class User{
    String nick;
}

class UsersAction{
    Date actionDate;
}

现在在前端应用程序中,我想加载许多 UsersActions 并显示它,以及相应的用户昵称。我熟悉处理这个问题的两个概念:
使用 Ref<>,
我可以在 UsersAction 中放置一个 @Load Ref,这样它将在这个实体之间创建一个 link。稍后在加载用户操作时,Objectify 将加载正确的用户。

class User{
    String nick;
}

class UsersAction{
    @Load Ref<User> user;
    Date actionDate;
}

在 UsersAction 中存储 ID 和重复昵称:
我还可以将用户的 ID 存储在 UsersAction 中,并在保存 UsersAction 时复制用户的昵称。

class User{
    String nick;
}

class UsersAction{
    Long usersId;
    String usersNick;
    Date actionDate;
}

据我所知,当使用 Ref<> 时,Objectify 将加载所有需要的 UsersActions,然后是所有相应的 Users。使用复制时,Objectify 只需要加载 UsersActions,所有数据都将在那里。现在,我的问题是。这些方法之间的性能有显着差异吗?效率是我的首要任务,但第二种解决方案对我来说似乎丑陋且危险,因为它会导致数据重复,并且当用户更改他的昵称时,我也需要更新他的操作。

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

您可能会考虑让 User 成为 UserAction 的 @Parent Ref<?>。这样,父对象将与同一批量获取中的操作同时获取。只要它符合您所需的事务吞吐量(整个用户实体组每秒不超过 1 次更改),就可以了。