mysql - 用于基于数百万个Player-> Player事件分析MMO播放器之间关系的数据库?

标签 mysql node.js mongodb database

我玩“ Planetside 2”游戏,该游戏提供了游戏数据REST API和实时Websocket事件流服务。我想根据玩家在游戏中的行为来分析他们之间的关系。我以前在数据库方面的经验很少,并且不知道关系数据库,图形数据库或基于文档的数据库是否最合适。

玩家的组织方式如下:

Faction A                                             Faction B
    |____Outfit                                Outfit____|
    |       |____Player                 Player____|      |
    |       |____Player                 Player____|      |
    |                                                    |
    |____Outfit                                Outfit____|
            |____Player                 Player____|
            |____Player                 Player____|


有3个派系,但您明白了。我想研究球员与其他球员和服装之间的关系。

游戏中的绝大多数事件具有以下形式:

(Player1)-->(Action)-->(Player2)


每个事件都会以如下形式到达JSON文档:

{
    "payload":{
            "amount":"",
            "character_id":"",
            "event_name":"GainExperience",      
            "experience_id":"",
            "loadout_id":"",
            "other_id":"",
            "timestamp":"",
            "world_id":"",
            "zone_id":""
    }
}


如上所述,所有事件有效负载都是平坦的,但不能保证开发人员不会在事件中添加或删除字段。 GainExperience是一种特别棘手的事件,因为有将近400种不同的事件可以奖励经验。 other_id字段标识事件的收件人(如果有)。例如,如果某人使另一个玩家复活,则复活的玩家的character_id将放置在other_id中。

大多数基于团队合作的事件是GainExperiance事件。



我想做的各种查询:

我感兴趣的大多数事情都涉及查找不同组的成员之间特定事件的所有发生,然后计算并显示有关这些事件的统计信息。也许“交集”是正确的设定理论术语?

是什么让我不确定要使用哪种数据库:

数量庞大的球员,服装和赛事。

游戏中有持续2小时的“警报”。在黄金时段警报期间,最多可以有:


警报区域中有1000多名同时玩家。
共有2000名参与者。
至少由一名成员代表的400-500件服装。
事件流传递的1-1.5M事件,取决于订阅的事件。
最活跃的服装可能有多达100位参与者参加警报。


这使得在单个警报期间确实存在一些令人恐惧的潜在的玩家-玩家,玩家装备和装备-装备关系。如果我想跟踪的不仅仅是两个小时的警报,如果我不小心的话,我很容易看到这些数字,导致数据库爆炸。





这些是我到目前为止查看的数据库:

MySQL:这是使用PS2 API的其他开发人员所使用的,服务器端数据库也是某种SQL数据库,这在API集合的结构方式中得到了体现。

我主要关心的是如何处理GainedExperiance事件,因为该单个事件类型实际上包含近400个不同的事件。我不知道是否最好将它放在单个大表中,或者尝试通过experiance_id将其拆分为一堆表。我还怀疑SQL是表达我感兴趣的查询的最佳方法。

CouchDB:它执行map-reduce的方式看起来确实很有趣,但是AFAIK一旦拥有几百万条记录,更改或添加新视图的成本就变得非常高昂。保存事件,因为它们流进来将是很好而且琐碎的。

MongoDB:将每个事件视为一个很小的文档当然会很方便,但是考虑到每个事件是如此之小和平坦,我认为我真的不会利用MongoDB的优势,并且想知道是否另一个DB更适合于此。

Neo4j:图形非常适合表示关系,但AFAIK更加适合于大量节点之间的少量边,而不是(相对)少量节点之间的大量边。这将是成千上万个节点之间的数百万条边,这与您所读到的典型的“找朋友的朋友”有点不同。



TL; DR:

我想看看一群玩家在在线游戏中的互动方式,尤其是团队合作。有大量可用数据,其中大多数以两个参与者之间的动作形式出现。我暂时使用自己的PC,基本上没有使用数据库的实际经验。我打算使用Nodejs。

哪个数据库是完成这项工作的最佳工具?

最佳答案

好吧,我会选择PostgreSQL或MySQL之类的经典RDBMS。您提到的金额(150万个事件)简直是小菜一碟。我可能会尝试将玩家,玩家装备和装备装备事件分别存储在单独的表中。

关于mysql - 用于基于数百万个Player-> Player事件分析MMO播放器之间关系的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027285/

相关文章:

mysql - 在 MySQL 中调用过程时出错 : Error Code: 2013. 在查询期间丢失与 MySQL 服务器的连接

mysql - 创建具有成对唯一性的两列

javascript - 将权限转换为数字 Discord.js

javascript - 计算 Mongoose hook 内的平均值

node.js - 如何在 mongoose 引用模式中使用 $in

php - 返回按文章日期排序的类别

php - 库存系统数据库设计

node.js - Node JS/Hapi 图片上传及安全

node.js - PrismaClient 验证错误 : Invalid `prisma.user.create()` invocation:

ruby-on-rails - Ruby on Rails Mongoid 和 Webfaction : Not Authorized For Query (Error 16550)