SQL中玩家得分表的结构

时间:2011-04-11 08:55:23

标签: mysql sql datatable

我需要将游戏分数表从(请不要笑......)* .ini 数据库迁移到SQL表,因为我想将整个游戏迁移到MySQL基础。

需要将用户分数存储在数据库中,以便能够针对整体/年/月/周/日时间跨度检索结果表。这需要每年:{年度得分} + {月份得分} * 12 + {周得分} * 52 + {日得分} * 360 =每位用户425行+每位用户1位{总得分}。这没有感觉优化,这就是为什么我在这里提出这个问题。

使用什么基地?上面提到的,是timepans的基础,使用这样的结构:

{timespan type} {timespan} {user ID} {score for type 1} {score for type 1} {score for type 1} {score for type 2}

我需要注意的另一件事。对于不同的分数类型,有不同的方法来排序。如果第一个类型是普通分数,我获得最高分(更多 - 更好),那么第二个类型是速度,我按最快速度排序(更小 - 更好)。

如果您有疑问:“为什么要分隔几周/几个月/几年/整体?”,那么回答是,我想要一些快速的方法来获得结果表,例如,最后一周得分类型2,首先3个地方。

我想,也许,如果我只存储{day score},在当前结构中摆脱每个用户的那些426-360 = 66行,导致新的结构:

{user ID} {day number} {score for type 1} {score for type 1} {score for type 1} {score for type 2}

我怎样才能获得“前三周获得速度最佳成绩的前三名”。这需要一些多层次的计算...

  1. 查询包含天数的行,该行包含所有用户前几周的时间跨度
  2. 汇总每个{用户ID}的所有分数或获得最低分数(取决于分数类型)并放入新表
  3. 查询新表,按分数列ASC或DESC排序(取决于分数类型)并检索前3行
  4. 重复步骤2.& 3.对于每个得分列
  5. 如果我想每分钟超过1-3次(就像在表中的每个新输入后,我需要评估,特定用户需要多少积分才能获得更高的分数,我想,这需要一些严肃的服务器资源。截至问题顶部给出的结构(时间跨度),每个得分列只需要第3步。

    感谢您的回答&建议!

    目前的数据格式如下:

    Overall file: overall.ini
    (in folder of yearnumber) Year file: 2011.ini
    (in folder of yearnumber) Month files: m1.ini ... m12.ini
    (in folder of yearnumber) Week files: n1.ini ... n52.ini
    (in folder of yearnumber) Day files: m1d1.ini ... m12d1.ini
    

    存储在内部的数据:

    [~REZ~]
    User13245325=1145 203.433 3 1.735
    User3425435=1412 173.871 8 2
    User32487854=18 76.253 1 11.016
    User345645=2153 155.139 8 2.344
    User65875=100 67.767 2 10.016
    User453325=26 138.568 1 3.031
    
    PS:这是一般性问题,与游戏开发没有直接关系,所以请不要把它扔给游戏开发SO部分。

2 个答案:

答案 0 :(得分:3)

说实话,我真的很难理解你在这里问的是什么 - 但是如果我理解正确的话,还有一些其他的系统可以记录实际的游戏结果,并且你想把这个游戏数据变成一个排行榜风格的数据结构,您希望您的查询运行真正,非常快。

所以,首先 - 您似乎担心数据的大小。除非你处理绝对天文数字(Google,Facebook,Twitter),否则你可能不需要。磁盘空间很便宜,索引良好的数据库与数十万行一样快,数十万行。

从广义上讲,您需要决定是否要交换空间(预先计算结果)以获得速度,以及何时进行计算。

通常,使用“原始”数据并在运行时计算结果是最容易理解和维护的,并且具有最低的错误风险 - 但也可能是最慢的。然而,那是我开始的地方。您没有说明您的“原始”数据的存储方式或更新频率,但我首先编写一个产生您的预期数据的查询。如果它很棘手,我会将一些中间步骤纳入视图以简化查询。

然后,我使用负载测试工具测量性能(JMeter或类似工具是完美的)。

如果 - 但仅限于 - 它实际上太慢了,我首先将逐步将视图转换为预先计算的表,方法是引入常规批处理作业来填充这些视图。这完全取决于您的数据以及它是如何“陈旧”的。

通过这种方法,您通常可以获得非常好的性能提升 - 只要批处理作业运行,解决方案仍然非常简单且能够抵御错误...

只有当这种方法遇到性能瓶颈时,才会考虑预先计算整个数据集。在这种情况下,您也可以创建一个与您想要输出到屏幕的表格完全相同的表格。

答案 1 :(得分:0)

我建议2桌。

用户,具有相关的用户信息,以及得分信息的分数。

分数看起来像是:

score
------
user_id
speed
score_total

您可以使用查询轻松完成所有聚合。