在MYSQL数据库中跟踪用户任务进度的最佳实践

时间:2016-04-09 12:46:03

标签: mysql database-design

所以我正在创建一个小型Web应用程序来跟踪用户完成任务。我正在努力确定布局数据库的最佳方法。

首先要解释一些规则和逻辑。有许多任务由颜色标识。贪婪,红色,蓝色,黄色等。每项任务都有很多练习,1-40。所以green1,green2,green3等所有练习都有难度等级。我想通过标记为已完成或未完成来跟踪所有任务/练习的每个用户进度。这意味着我可以统计所有已完成的并为任务提供完整的百分比。

目前我的数据库表格如下:

每个任务(颜色)都有一个名为(颜色)taskinfo的表,例如'greentaskinfo':

+----------------------------+
| colorid  difficulty active |
| 1             H       Y    |
| 2             H       y    |
| 3             L       Y    |
| 4             L       y    |
+----------------------------+

然后,对于任何颜色/任务,都有一个进度表,例如greenprogressinfo。这会存储每个用户的进度。

+-------------------------------------+
| progressid  userid colorid complete |
| 1             1       1       Y     |
| 2             1       2       Y     |
| 3             1       3       N     |
| 4             1       4       N     |
| 5             2       1       N     |
| 6             2       2       Y     |
| 7             2       3       N     |
| 8             2       4       Y     |
+-------------------------------------+

然后我可以计算在userid = x和complete = Y的位置完成的数量,并将其作为总数的百分比来计算。

但这意味着当用户注册时,我需要为9个任务表自动创建40个条目。它看起来效率不高。可能存在的问题比我看到的还要多。任何专家建议如何更好地设置它将不胜感激。

1 个答案:

答案 0 :(得分:2)

您所展示的表格与您的口头要求并不完全一致,您可以在这里谈论任务和练习。反映这种区别的设计看起来像:

Task
id
color

Exercise
id
task_id
difficulty
position    // if exercises should be ordered within tasks

User_Action
id
user_id
exercise_id

每当用户完成练习(而不是在那之前),创建一个UserAction记录。因此,您可以询问用户是否已通过查询完成了任务的所有练习

select *
from Exercise e
where task_id = givenTaskId
and not exists (
   select *
   from User_Action a
   where a.user_id = givenUser
   and a.exercise_id = e.id
)

通过这种方式,您还可以获得更详细的进度信息,例如计算完成任务的次数。