【发布时间】:2011-01-30 15:35:22
【问题描述】:
对不起,这太长了,而且都是散文。我正在创建我的第一个真正游戏化的网络应用程序,并且可以使用一些帮助来思考如何构建数据。
设置
用户需要完成多个类别中的每一个任务才能升级。我有我的Users、Tasks 和Categories 表,还有一个连接三者的UserTasks 表。 (“用户 3 在类别 8 中添加了任务 42。现在他们已经完成了。”)这一切都很好,而且工作得很好。
挑战
我不确定跟踪各个类别中每个级别的进度的最佳方法。 “业务”规则是:
- 您必须在每个类别中达到一定数量的分数才能向上移动。
- 如果您获得了 Cat 8 所需的分数,但仍有其他工作要做以完成该级别,则任何新的 Cat 8 分数都会计入您的总分,但不要“滚动”到下一个级别.
- 类别的数量很少(目前为 5 个),不太可能经常更改,但绝不是绝对固定的。
- 升级所需的点数因级别而异,可能由公式或查找表决定。
因此,挑战在于跟踪每个用户在每个类别中迈向下一级别的进度。我想到了一些可能的方法:
可能的解决方案
- 在用户表中为每个类别添加一列,并在每次用户升级时将它们全部重置为零。
- 有一个单独的
UserProgress表,每个用户的每个类别都有一行,以及他们拥有的点数。 (基本上是 #1 的多对多版本。) - 将
userLevel列添加到UserTasks表中,并使用它通过某种SUM 语句推导出进度。
他们当前的级别将是 User 表中的一个简单 int。
优点和缺点
(1) 似乎是迄今为止最简单的,但它也是最不灵活的。也许我可以使用基于类别 ID 的命名约定来帮助克服其中的一些问题。 (使用“select cats; for each cat, get the value from Users.progress_{cat.id}”之类的代码。)这也是我丢失数据最多的地方——我不知道哪些点数计入升级。我没有这个需要,所以也许我不在乎。
(2) 看起来很复杂:每次我添加或减去一个用户或一个类别时,我都必须维护另一个表。我预见到同步挑战。
(3) 介于两者之间——比 #2 更清晰,但不如 #1 直观。为了找出用户的位置,我会使用稍微复杂的 SQL,例如:
SELECT categoryId, SUM(points) from UserTasks WHERE userId={user.id} & countsTowardLevel={user.level} groupBy categoryId
嗯……这似乎还不错。我想我在这里是在谈论自己进入#3,但我会喜欢任何意见、建议或其他想法。
【问题讨论】:
-
是的,就像我在那边说的:我记得在我把它贴在这里之后就存在了。但坦率地说,我宁愿把它关在那里而不是在这里。这个社区的规模是这个社区的 1/100,这个问题当然足够普遍,可以适用。无论如何,如果我没有得到任何答案,我不会感到惊讶:这个问题太长了,我几乎在最后回答了它。我们拭目以待......
-
祝你的游戏好运!计划这些事情总是那么有趣。
标签: database-design