为Achievements系统设计MySQL表

时间:2012-09-06 03:16:14

标签: c++ mysql

我正在为成就系统创建一个数据库(就像你在暴雪游戏中看到的那样)。我想有一个GUI,显示游戏中所有成就的当前进度,这意味着我需要查询用户的所有成就的进度,以便填充GUI。我计划有大约100项成就。

这带来了一个设计问题。 设计数据库和查询代码以查询~100位字段的进度的最佳方法是什么?

似乎蛮力方法是获取整行成就,然后对行中的每个字段进行一些硬编码字符串比较,以确定我们正在处理哪个成就。

另一种可能的解决方案可能是根据表的列索引获得一个大的switch语句,并处理每种情况的每个成就(不需要修改表,或者你必须重构很多C ++代码)。

我很想听到你们可能有的任何其他设计。 谢谢!

2 个答案:

答案 0 :(得分:1)

我建议使用3个表格构建解决方案。这些表是用户,成就和user_achievements。将在users表中使用u_id标识用户。将在成就表中使用a_id确定成就。然后,您可以通过在user_achievements表中插入一行来跟踪用户成就,该​​行包含用于标识用户的u_id和用于标识成就的a_id。 user_achievements表还将包含一个列,该列将指定给定用户的该成就的完成百分比。

答案 1 :(得分:0)

遇到这个问题,即使它已经5岁了,也许有人会对跟进方法感兴趣。

  • 成就通常分解为数字(其余的,如名称,每个成就的描述可以放到网站/应用核心,以避免膨胀数据库)。
  • 简单来说,我们不是FB,也不需要单独的表格,所以在"用户"表格我们只添加了一个列:"成就"它是一个varchar(50)。括号(50)中的数字取决于您对此列的实际需求(即存储的数据量)。
  • 所以你最终在Achievements列的每个单元格中都有一个数字序列:10982039482084109384

从左到右按如下方式读取这一行数字:用户已达到" 1098个个人资料视图",已收到" 2039个喜欢"等等。可选择添加分隔符以便于查看区别+当第一个用户有25个喜欢,然后是125个,然后是2039个(2个数字,3个数字,4个数字 - 或另一个选择是使用0025然后是0125然后2039,因为你知道每个成就的最大数字是4)时立即处理案例。但仍然可以说我们决定使用分隔符,即逗号:

1098,2039,4820,8410,9384

然后,一旦您需要数据,只需选择属于特定用户ID的成就,然后(如果您添加了分隔符)

explode (',', $array)

然后你的网站php核心知道前4位代表"个人资料视图"并且假设这意味着他有一个10级徽章用于个人资料视图(100个视图的1个徽章)。

在那里,您可以轻松地执行操作,而无需进一步需要SQL查询。例如,用户想知道他在达到​​20级徽章方面的进展,你会显示:他有1098/2000(或55%)进度。

此时,成就说明,名称,级别信息存储在站点核心中,而百分比则是随时计算的。

希望逻辑清晰,可能对社区中的任何人都有用。

干杯!