1

我正在使用 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 实体。

我做了一些性能测试,它似乎工作得相当好!

4

1 回答 1

0

你也可以有另一个实体,我不知道你怎么称呼它(UserGame?),但在这个实体中,你将存储游戏密钥、用户密钥以及你想要访问的一些信息,例如用户名称,游戏名称等。然后,当用户进入游戏时,您将创建此实体。

使用此实体,您可以轻松检索成员参与的游戏以及参与游戏的所有用户。

此方法的不便之处在于,如果用户属性或游戏属性发生更改,您还需要更新存储在 USerGame 实体中的信息,例如 userName。

我不知道这是否是一个好的解决方案,但它应该可以工作。

于 2012-06-28T08:08:58.623 回答