2011-11-04 29 views
5

我目前有一个社交游戏应用程序,它使用mongodb作为数据库。我的问题是如果我想创建积分和徽章系统,有什么建议。成就/徽章的业务逻辑可能变得相当复杂,而且非常特殊,因此实时颁发徽章看起来效率不高。我想象一下,在某个地方将队列追踪的行为添加到某个队列中,例如Amazon SQS,或者只是将用户的活动馈送作为队列使用,并让另一个离线工作进程处理并仅处理每个动作/活动的效果,以查看任何特定的徽章是交叉的。如何使用nosql构建成就和徽章

我对这种方法的担心是,它看起来像徽章查询可能变得相当密集,我也必须跟踪大量的动作。我可以设想,取得的成就不尽相同,例如某人在过去4周内每周都获得第2名的徽章,或者在50个州中的每一个州都有朋友的人的徽章等等......

这种类型的东西有没有更优雅或者尝试过的方法?除了mongo之外,使用另一个数据库来获得成就/活动提要/排行榜,创建mongo /其他db混合环境是否合理?

像Redis,Neo4J或者普通旧SQL Server这样的选择是混合解决方案的不错选择吗?我喜欢Mongo,所以这将保持为我们的主要分贝,但好奇看看如果增加另一个分贝将有助于。

回答

3

这是在数据库上运行map reduce的好选择。您可以在不太经常的基础上运行它们,使用它们离线计算所需的数据。

http://www.mongodb.org/display/DOCS/MapReduce

你可以使用其他工具来做到这一点,但在摘要中我看不到任何令人信服的理由,在此阶段增加了复杂性。我会探索地图减少,尝试一下,然后如果它不符合您的需求,扩大您的选择。但是那个时候,如果有的话,你至少会发现具体的瓶颈。

0

只是使用像Neo4j图形数据库的一些注意事项。由于您的徽章信息总是?查询具体用户这些是本地的而不是全局查询。

所以,如果你可以在你的域模型为对象的网络(因为它也许已经是),并表达自己的徽章逻辑作为一组traversalsgraph-queries起始于用户的,则工作没有坚持他们为当地图查询的速度不够快不管数据集的大小。

最简单的事情就是创建一个时间盒式PoC,看看它是否适合你。通过将用户标识存储在图形数据库索引中并作为节点上的属性交叉连接这两个存储应该相当容易。你可以在提交/保存钩子或异步同步数据库。也许将其他“社交网络”数据移动到图中并将游戏数据+文档保存为mongodb是明智的。