哪个数据库适合我的具体用例

时间:2013-03-24 14:04:36

标签: database database-design

我的头脑正在阅读有关数据库的内容。我知道你选择哪一个取决于具体的用例。  所以这是我的:

  • 我有一个webapp。一场比赛。
  • 这是基于等级的,你只能前进而不回来。但你可以继续玩每个级别。例如。你完成Level2然后玩Level3。然后再次启动Level3并将其保存为Level3b。您现在可以继续使用Level3和Level3b。
  • 任何时候都只能播放一个级别。
  • 服务器上存储了三个数据阵列:'progress','choices'和'vars'
  • 在您播放关卡时对它们进行修改,然后在您希望从它们开始时放入冷藏库。

当前的MySQL设置如下:

  • 表'saved'保存每个存档游戏的元数据,重要的是saveID及其所属的用户ID。
  • 每个数据数组都有一个对应的表。
  • 如果玩家做出选择,插入内容如下:

    INSERT INTO choices VALUES saveid=:saveid, choice=:choice
    
  • 因此可以通过

    重建数组
    SELECT * FROM choices WHERE saveid=:saveid
    
  • 当关卡完成后,数据阵列将通过序列化并存储在“保存”表中进行冷存储,该表有3列专用于此。
  • 他们的价值从其他三个表中清除。
  • 如果播放器从Level3b开始Level4,则序列化数组将从“save”表中获取,反序列化并放回各自的表中,尽管新的saveID为Level4。

我希望这有点可以理解。 我估计:

  • 写入比写入更多
  • 如果我理解正确,我不需要一致性,因为玩家只能操纵他们自己的数据
  • 我认为我不会做(m)任何JOINS,因为每个表都需要单独读取以填充其各自的数据数组
  • 所以我认为我不需要太多关系数据库
  • 大多数情况下,DB应该是轻载,因为插件很小

  • 数据存储必须可靠!如果我们开始经常丢失他们的存档游戏,我认为玩家不会坚持使用我们。虽然我认为Redis每秒刷新磁盘就足够了,因为我们不会在这里处理关键任务。如果游戏忘记了最后一个或两个玩家,那就不要忘记整个游戏。

您能否就我的用例建议使用DB? 我已经开始使用MySQL了,现在我已经读过CouchDB,MongoDB,Riak,Cassandra。我认为Redis是不合适的,因为一旦数据集超出你的RAM,那一个似乎会严重降级。但我对一切都持开放态度。 我也对人们说:坚持使用MySQL或转到PostgreSQL。

我也会接受对我设置存储方式的批评。如果你说:选择Cassandra并像这样存储,我会听。

这是一个健全性检查,因为现在是我最后一次能够在游戏上线之前更改数据库,我想做的最后一件事就是在3个月内换掉数据库,因为它已经缩放不好。

哦,是的,App是用Javascript编写的,与服务器的通信是通过PHP进行的。

1 个答案:

答案 0 :(得分:0)

我不认为您需要过多担心数据库 - 除非您确定从第一天开始就拥有庞大的用户群(网络应用程序通常不会在一夜之间成名)。

继续使用你所知道的(MySQL)会好得多,但是将所有数据库命令保存在一个单独的包装器类中(无论如何你应该这样做)。 如果这样做,只要您使用标准SQL并且不执行特定于该数据库的任何操作,转换到另一个数据库就不那么难了。