我有一个使用GAE作为后端的Facebook应用程序,并实现了一个简单的评分系统。真实的模型稍微混乱了水平数据和多个用户的可能性,但简化版本如下:
class score(db.Model):
value = db.IntegerProperty()
user = db.StringProperty()
我已经显示全球十大分数,但我还想要显示用户朋友的前十分数。在SQL环境中,我会做类似SELECT * FROM得分的事情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 ...)。这个方法的问题很多:我必须查询每个朋友,然后返回一个未排序的所有朋友的分数列表,然后需要用代码解析。
通过memcaching每个得分实体我减轻了一点负担,但是如果数据存储区中填充了许多分数,则memcache将无法很好地扩展,这仍然是一种昂贵且痛苦的方式来完成一个简单的操作。关系型数据库。 在Google App Engine中有更好的方法吗?
答案 0 :(得分:0)
为什么不将十大分数写入每个用户的实体?
用户1的新分数为100!呀!
用户1有20个朋友的列表。
获取20个朋友的列表,并将100添加到每个实体的最高分数字段中(如果它是前20名中的一个)。
缺点:每当用户获得新的高分时,您将拉动所有朋友的实体并可能更新它们。看完你的阅读费用当然,如果用户连续获得几个高分,那么朋友的值可能会被memcached。
优势:您可以为每个最高分数条目添加时间戳,跟踪用户上次播放的时间,以及自用户上次播放以来突出显示新的高分!只是一个想法...