我有一个使用 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 中有没有更好的方法来做到这一点?