gpt4 book ai didi

java - Objectify/GAE - 具体的非规范化问题

转载 作者:行者123 更新时间:2023-12-01 05:15:55 25 4
gpt4 key购买 nike

我正在使用 Google App Engine 和 Objectify 3.1,并慢慢学习非规范化并根据其使用情况设计实体,但我仍然在某些方面遇到困难。

我目前正在构建一个系统,其中用户实体可以参与游戏实体,并且需要能够找到用户参与的所有游戏。在我看来,有两个基本解决方案:

解决方案1)

在游戏中存储用户 key (participantKeys)列表并查找成员(member)参与的游戏,如下所示:

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 实体以反射(reflect)游戏的当前状态。当游戏结束时,我删除该实体。此外,当游戏发生更改时,我会更新所有相关的 GameParticipation 实体。

我做了一些性能测试,看起来效果相当不错!

最佳答案

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

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

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

我不知道这是否是一个好的解决方案,但它应该有效。

关于java - Objectify/GAE - 具体的非规范化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11209908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com