我将开发一个多用户网络应用程序,用户每天都会记录他们是否完成了各种任务。这些任务每天都在重复,例如:每天都需要完成XYZ。
并非所有用户每天都要完成相同的任务。可能会有一个包含所有可能任务的数据库表。当新用户在网上注册时,他们将通过为自己创建个人资料来选择适用于他们的任务。
每天用户将记录他们是否完成了各自的任务。接下来,不仅会对用户自己的任务历史进行深度报告和历史统计,而且还会在全球范围内寻找趋势。
我只是在寻找有关如何设计数据库的任何建议(一般而言)。有一个包含所有任务的任务表是否可以。然后,当新用户在线创建自己的个人资料时,会创建一个全新的表格,其中包含他们的个人资料信息以及他们选择的任务。然后,每个唯一的用户配置文件表将包含每天完成的任务的持续历史记录。
或者有更好的方法来设计它吗?
编辑:或者更好的想法是拥有如下内容:
任务历史记录表:
PersonID | Date | Task1 | Task2 | Task3 | Task 4
001 | 24Jan15 | Complete | Complete | |
002 | 24Jan15 | | Complete | Complete | Not Complete
003 | 24Jan15 | Not Complete | | |
因此会有一个表包含所有用户(以及他们选择的任务),另一个表包含所有可能的任务,最后上面的表记录了每天的任务历史记录。
这里唯一的问题是并非每项任务都适用于每个人。所以会有空白。不确定这是否重要。
毫无疑问,我是初学者。所以任何建议都会受到赞赏。
答案 0 :(得分:0)
动态创建新表以保存数据子集几乎绝不是一个好主意。不同用户的数据应该放在同一组表中,其中一些字段标识用户。没有充分的理由让数百个表都完全相同,除了一个用于某个键值A,下一个用于键值B等。只需将键字段添加到表中即可。
正如a_horse_with_no_name所说,编号列是一个强烈的迹象,表明你做错了。这是一个坏主意的原因有很多。其中:如果每个任务都有一列,添加新任务时会发生什么?现在,您必须向表中添加新列,并更新所有现有记录,而不是仅添加新记录。此外,它使查询非常复杂。一个类似于&#34的查询;今天完成了哪些任务"需要对每一列进行单独的测试,而不是对单个任务进行一次测试"列。
根据你所说的,这是我第一次想到这应该是什么样子:
Task table
(task_id, task_name)
列出了所有感兴趣的任务。
User table
(user_id, user_name)
列出了所有用户。
Assigned_Task table
(user_id, task_id)
这将用户与任务联系起来。此表中将为每个用户的每个任务创建一条记录。也就是说,如果Alice是用户1并且她应该执行任务1,2和3;而Bob是用户2,他应该做2和4,然后会有记录(1,1),(1,2),(1,3),(2,2)和(2,4)
(注意:您可能将此表的assigned_task_id字段作为主键,或者PK可以是user_id + task_id,因为它必须是唯一的。)
Task_Status table
(user_id, task_id, task_date, completed)
每天将为每个用户/任务组合创建一条记录。因此,30天后,如果Alice有3个任务,那么她将有3 x 30 = 90个记录,每天30个记录3个。
(你可能有一个task_status_id作为PK,或者你可能使用user_id + task_id + task_date。超过2个字段的键往往很痛苦,所以我可能会创建一个task_status_id。无论如何。)
如果您需要其他信息,则这些表中的任何一个都可能包含其他字段。就像用户表可能有员工编号,电话号码,部门等
然后问一个问题,"昨天没有完成哪些任务?"很容易回答这个问题:
select user.name, task.name
from task_status
join user on user.user_id=task_status.user_id
join task on task.task_id=task_status.task_id
where task_date=@date
and completed=0
今天完成了多少任务?
select count(*)
from task_status
where date=@date and completed=1
等