0

我有一个使用 GAE 作为后端的 Facebook 应用程序,并实现了一个简单的评分系统。真实模型中的关卡数据和多用户的可能性稍微有点杂乱,但简化版本如下:

class score(db.Model):
    value = db.IntegerProperty()
    user = db.StringProperty()

我已经显示了全球前十的分数,但我还想要显示一个用户朋友的前十分数的选项。在 SQL 环境中,我会执行类似 SELECT * FROM scores WHERE user1 IN (...friendslist...) 或 user2 IN (...friendslist...) ORDER BY value LIMIT 10 之类的操作。在非关系数据库中“ IN" 查询的成本很高,特别是在 GAE 中,它们一次仅限于 30 个值的块。以这种方式实现查询并不理想。

我目前的解决方案是使用 key_name = facebook id 存储每个分数(应用程序只存储他们的最高分数,因此重复键没有问题),然后使用 score.get_by_key_name(...friendslist...)。这种方法的问题很多:我必须查询每个朋友,这会返回一个未排序的所有朋友分数的列表,然后需要用代码对其进行解析。

通过 memcache 缓存每个分数实体,我稍微减轻了负载,但是如果数据存储区填充了许多分数,memcache 将无法很好地扩展,这仍然是一种昂贵且痛苦的方式来执行关系数据库中的简单操作。在 Google App Engine 中有没有更好的方法来做到这一点?

4

1 回答 1

0

为什么不将前十名的分数写入每个用户的实体?

用户 1 的新分数为 100!是的!

用户 1 有一个包含 20 个朋友的列表。

获取 20 位好友的列表,并将 100 加到每个实体的最高分数字段中(如果是前 20 位之一)。

缺点:每次用户获得新的高分时,您将拉取他们所有朋友的实体并可能更新它们。注意你的读写成本 当然,如果一个用户连续获得几个高分,也许朋友的值会被 memcached。

优点:您可以为每个最高分条目添加时间戳,跟踪用户上次玩的时间,并突出显示自用户上次玩以来的新高分!只是一个想法...

于 2012-08-10T22:53:32.990 回答