2011-08-02 24 views
2

我们有几个基于玩家动作产生事件的游戏服务器。我们想要保存其中一些事件来建立统计数据;既为了玩家的享受,也为了分析行为。基于游戏服务器日志事件的玩家统计数据的MongoDB模式设计?

我们已经决定MongoDB的原因很多,主要是性能。但是,我们在模式设计方面做了一些努力。使用RDBMS数据库的年限过长了。

无论如何,生成的事件看起来像这样:player1杀死了武器1的玩家2。在捕获这些事件时,我也知道服务器ID,运行的是什么地图等等。我显然知道现在是什么时间,我可以建立玩家关系来建立团队/团队。

但是,这将如何看待文档模型?

我只是把所有的事件放在一个集合中,然后把我们想要在我们的搜索中使用的属性添加为字段?或者创建一个包含文档的层次结构以获得性能优势(?)。 把它放在一个“行”我猜会让它很容易查询,但并没有真正感受到所有的优化。会有TONS行,即使MongoDB速度很快,我不相信它会处理负载。另外,如果我只是将结构扁平化并将所有内容都搜索到一行,那么RDBMS数据库中的性能应该相当平等。加上一次又一次存储相同数据的大小开销(即用户)。

+0

为了缩小“用例”的范围,我将详细介绍一个示例查询。从普通查询下方的答案中抽取一个检验项将是“地图x上有武器y的杀死数量”。然而,有两件事,我最有可能会加上“这个wwwk /月/年”,而且我不会为一个用户做这件事,而是创建一个“在...上击杀次数最多的顶级玩家”列表。添加诸如时间,武器(也可能是武器组,即爆炸物)等“事实”以及与其他玩家的关系 - 只会让我对如何设计模型感到困惑。如果我将所有这些“事实”添加到每个条目中, = bigdb的慢? – Martin

回答

1

我想说这取决于你想如何使用你收集的数据。是否需要你的数据是(几乎)实时的?还是延迟处理可以接受?

我想你会想拿出像“在武器y上地图x上发生多少击杀?”的统计数据。和很多其他组合。

如果您需要(几乎)实时,我会建议为每个统计要求专门收集量身定制的文档。因此,对于上面的例子,你可以使用地图文件的“地图”集合,其中每个地图都有每个武器的计数器或类似的东西。 这应该会提供非常快的“实时”读取。这里的缺点是您的写作表现可能会受到一些影响,因为您必须为每个事件更新多个集合。

如果你能忍受延迟处理,你想把所有事件放到一个大平面集合中并不是那么糟糕。写性能会非常好。但是,您必须定期运行som map/reduce作业(这将非常缓慢)并处理您的事件并将结果保留在结果集合中。

+0

谢谢斯文! 我们很乐意进行实时统计,因为它对我们的客户更具吸引力。但是,我们意识到可能需要引入延迟才能正确管理数据。 如果一天中的统计延迟时间为5分钟,这并不是一个真正的问题,但是如果它接近30分钟,那么吸引力会稍稍降低。 我在创建反映我们“观点”的文档模型时看到的问题是,我们基本上需要先了解我们所有的观点。我们没有选择在稍后阶段创建一个新的“最佳名单”。 – Martin