什么类型的数据库最适合存储数组或数据对象

时间:2015-06-22 02:50:20

标签: database node.js sockets

我只是好奇如果我想在我的节点服务器上运行一个可以玩Blackjack的机器人,最好的方法是什么。

但是对于通过套接字的多个连接的客户端,每个连接的套接字都有自己的机器人可以玩,但我需要一些方法来保持机器人可用卡每次发送POST请求时,他们从他们的套牌中取出的任何卡

我认为MySQL会很快变得混乱,因为我不能只是存储一个数组或一个对象,并在使用时拼接出每张卡,但我并不熟悉哪种数据库会专门用于这种用途。 / p>

如果我没有任何意义,基本上是:

我需要为机器人存储卡(但是对于每个连接的用户会话)不仅仅是1个人的卡片,而是多个人的多个卡片组。

我不是要求你为我编写任何代码,只是指出哪个数据库适合这种设置。

我在考虑Redis或MongoDB?

1 个答案:

答案 0 :(得分:1)

Redis 可能是最快的,特别是如果你不需要耐久性保证 - 大部分游戏都可以使用Redis的内存数据存储来播放,这可能会比写入世界上的任何磁盘。也许是定期,您可以将“整个游戏”写入磁盘。如果该项目不是出于商业目的,即计算机错误不会导致玩家赔钱,这绝对是一个诱人的选择。

MongoDB 很受欢迎,特别是易于使用Node,并且肯定比大多数关系SQL解决方案更快,但事务可能是个问题。对于原型或概念验证项目,它应该没问题。但您可能也想查看其他“NoSQL”解决方案。

Cassandra 是另一种流行的面向文档的数据库,很多人比MongoDB更喜欢它,原因有多种 - 最值得注意的是,为了获得更好的可扩展性。

这种选择在很大程度上取决于您对数据建模的方式。在您当前的场景中,我知道您只想存储一个对象/数组,这听起来像是基本上采用了聚合文档(MongoDB)的方式。实际上,您将整个数据库“非规范化”为聚合,并且每次都对整个对象执行读/写操作以实现一致性。这是MongoDB和其他面向文档的DB中的一种流行技术。但请注意,此解决方案仅适用,因为您不在跨分区操作。想想当您为应用程序提供多个服务器写入单独的数据库集群时会发生什么。

如果可扩展性是一个问题,那么您必须自己分析并自行决定什么是建模数据的最佳方式。 NOT 不断写入此数组是否会成为更好的模型?例如,生成一次卡片序列,将其作为Game存储在DB中,并且只读取它以绘制卡片?然后,每个玩家的移动都可以存储为一个非常简洁的数据结构Hit,引用Game中的一张卡片。尽管数据变得非常关系(回到旧学校SQL),但写入量要小得多,并且您的服务器永远不会进入锁定状态,等待玩家释放Game对象。它可能适用于您的用例,也可能不适用,但请考虑如何为最大读取和最小独立写入建模数据。

就个人而言(IMO),如果这个项目是为了好玩,我会将Redis作为内存缓存层,大多数读/写都会发生,并将游戏日志写入Cassandra。但如果这是一项严肃的业务,我需要一些真正的一致性保证,我可能会回到关系数据库,使用Redis缓存层来加速读取。

因为没有一个正确的答案,所以任何人都可以给出的唯一建议就是将应用程序的持久性需求与每个数据库解决方案的优缺点进行权衡,并在做出重要决策之前进行大量研究,例如“哪种技术”用于持久性“。例如,你忽略了MongoDB的长期问题 - 如果你只是谷歌“MongoDB问题”或“MongoDB糟透了”。地狱,在交易或一致性方面,目前所有NoSQL产品甚至可能存在长期问题。