我玩游戏“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的方式看起来非常有趣,但是当AFAIK在那里有几百万条记录时,更改或添加新视图变得非常昂贵。尽管如此,将事件保存在流中也是很好的和微不足道的。
MongoDB:将每个事件视为一个小文档肯定会很方便,但考虑到每个事件都是如此小而扁平,我认为我不会真正利用MongoDB的优势,并且不知道如果另一个DB更适合这个。
Neo4j:图表非常适合表示关系,但AFAIK设计的更多是针对大量节点之间的少量边缘,而不是大量节点之间的边缘(相对而言)节点数量很少。这将是数千个节点之间的数百万个边缘,这与您阅读的典型“寻找朋友朋友的朋友”有点不同。
我想看看玩家群体在网络游戏中的互动方式,尤其是团队合作。有大量可用数据,其中大部分是两个玩家之间的行动形式。我暂时使用自己的电脑,基本上没有使用数据库的实际经验。我打算使用Nodejs。
哪个数据库是此工作的最佳工具?
答案 0 :(得分:0)
好吧,我会选择像PostgreSQL或MySQL这样的经典RDBMS。你提到的金额(1.5M事件)是小菜一碟。我可能会尝试将玩家,玩家装备和装备装备事件存储在单独的表格中。
答案 1 :(得分:0)
您可能会看到“wamp”或“xamp”= windows或linux计算机,使用apache,mysql和php。有大量的PHP应用程序在那里开源,只是如何指导vs node.js可能有助于你。
如果这只是一个快速研究,以查看信息(学校项目)的事情。什么都可能工作。但实际上将所有数据存储到数据库表中的东西,以及在单个文件中的内容就是你所看到的。将多个信息存储在不同的文件中= ouch。