我正在使用 Google App Engine 和 Objectify 3.1,并根据它们的用法慢慢学习非规范化和设计实体,但我仍然在某些方面苦苦挣扎。
我目前正在构建一个用户实体可以参与游戏实体的系统,并且需要能够找到用户参与的所有游戏。在我看来,有两个基本解决方案:
解决方案1)
在游戏中存储用户密钥(participantKeys)列表,并找到成员参与的游戏,如下所示:
List<Key<User>> userList = new ArrayList<Key<User>>();
userList.add(new Key<User>(User.class, myUserId));
Collection<Game> games = ofy().query(Game.class).filter("participantKeys in" , userList).list();
解决方案2)
除了在游戏实体上存储参与者列表外,还要在用户实体上存储用户参与的游戏列表并找到游戏,如下所示:
User myUser = userDao.getUser(myUserId);
Collection<Game> games = user.getParticipatedGameKeys();
一旦系统中有很多游戏,解决方案 1 会变得非常慢。
解决方案 2 可以更快地找到游戏,但我需要在用户加入和离开游戏时不断更新列表。
一旦用户长时间使用系统,游戏列表也会变大。我只想返回用户当前参与的所有游戏,因此需要遍历列表并排除“历史”游戏。
我错过了一个更优雅的解决方案吗?以上都不是很吸引人。
非常感谢任何和所有帮助!
编辑:
在考虑了很长时间的替代方案后,我决定尝试像 Mikl 建议的东西。所以很高兴听到一个非常相似的解决方案:-)
我创建了一个 GameParticipation 实体,其中包含指向游戏的链接、指向用户的链接以及我需要能够获取的所有其他信息。
每次加入游戏时,我都会更新 GameParticipation 实体以反映游戏的当前状态。离开游戏时,我删除实体。此外,当游戏更改时,我会更新所有相关的 GameParticipation 实体。
我做了一些性能测试,它似乎工作得相当好!