我想为我的游戏实现互联网高分。并向玩家反馈他们的位置(不仅仅是top100或类似的东西)。在普通 SQL 中,它看起来像这样:
SELECT COUNT(*) FROM Scores WHERE points > :newUsersPoints
和 GQL 有类似的东西
db.GqlQuery("SELECT * FROM Score WHERE points > :1", newUsersPoints).count()
但由于 count() 仅限于 1000,因此在我的情况下它不会很有用。您对如何实现这一点有任何想法吗?
我有两个
第一的:
使用分片计数器的想法(http://code.google.com/intl/pl/appengine/articles/sharding_counters.html)创建新的“表”来存储在某个范围内的分数(from_points,to_points)
总结上表中 range.to_points < newUsersPoints 的所有计数器
在新分数为 db.GqlQuery("SELECT * FROM Score WHERE points > :1 AND points >= :2 AND points < :3", newUsersPoints, range.from_points, range. to_points).count() + sumfrom2
查找新分数所在的范围并增加其计数器
拆分计数器大于 1000(或 999)的范围,以便 3. 不会达到限制
将新分数添加到分数表
这是相当复杂且容易出错的。在添加分数之前,我们可能会增加一些范围和超时。(非交易性)
第二个想法:
不时(每天一次?)按分数对所有分数进行排序并给他们新的位置(脚本可能超时,所以我们必须分块执行)
要找出新分数在哪个地方,我们只需要做
db.GqlQuery("SELECT * FROM Score WHERE points > :1 LIMIT 1", newUsersPoints).get().precalculated_position + 1
还有其他想法吗?