所以我正在创建一个小型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个条目。它看起来效率不高。可能存在的问题比我看到的还要多。任何专家建议如何更好地设置它将不胜感激。
答案 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
)
通过这种方式,您还可以获得更详细的进度信息,例如计算完成任务的次数。