用于根据数百万玩家>玩家事件分析MMO玩家之间关系的数据库?



我玩游戏"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个参与者。

这使得在单个警报中可能出现的玩家-玩家,玩家-装备以及装备-装备关系的数量非常可怕。如果我想跟踪多个单独的2小时警报,如果我不小心,我可以很容易地看到这些数字导致我的数据库爆炸。



这些是我目前看过的数据库:

MySQL:这是其他使用PS2 API的开发人员使用的,服务器端数据库也是某种SQL数据库,这反映在API集合的结构方式上。

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

CouchDB:它做map-reduce的方式看起来真的很有趣,但是据我所知,一旦你有几百万条记录在那里,改变或添加新的视图就会变得非常昂贵。不过,在事件流传入时保存它们会很好,也很简单。

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

Neo4j:图很适合表示关系,但据我所见,它们更多是为大量节点之间的少量边而设计的,而不是(相对)少量节点之间的大量边。这将是成千上万个节点之间的数百万条边,这与你读到的典型的"找到朋友的朋友的朋友"的例子有点不同。


<标题> TL;博士:

我想看看玩家群体在网络游戏中的互动方式,特别是团队合作。这里有大量可用的数据,其中大部分是两个玩家之间的行动。我目前使用的是我自己的电脑,基本上没有使用数据库的实际经验。我打算使用Nodejs.

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

嗯,我会选择经典的RDBMS,比如PostgreSQL或MySQL。你提到的数量(150万个事件)是小菜一碟。我可能会尝试将player-player, player-outfit和outfit-outfit事件分别存储到单独的表中。

您可能会看到"wamp"或"xamp" = Windows或Linux计算机,使用apache, mysql和php。有大量的PHP应用程序是开源的,简单的如何指导node.js可能会对你有所帮助。

如果这只是一个快速学习查看信息(学校项目)的事情。任何方法都可能奏效。而是将所有数据存储到数据库表中,并存储在单个文件中。在不同的文件中存储多个信息=哎哟。

最新更新