【问题标题】:Multi-user web app - Database design多用户 Web 应用程序 - 数据库设计
【发布时间】:2015-02-10 06:45:11
【问题描述】:

我将开发一个多用户网络应用程序,用户将每天记录他们是否完成了各种任务。这些任务每天都在重复,例如:每天需要完成 XYZ。

并非所有用户每天都有相同的任务要完成。可能会有一个包含所有可能任务的数据库表。当新用户在网络上注册时,他们将通过为自己创建个人资料来选择适用于他们的任务。

然后,用户每天都会记录他们是否完成了各自的任务。之后,将有深入的报告和历史统计数据,不仅是关于用户自己的任务历史,......而且在全球范围内寻找趋势。

我只是在寻找有关如何设计数据库的任何建议(一般而言)。有一个包含所有任务的任务表可以吗?然后,当新用户在线创建自己的个人资料时,会创建一个全新的表格,其中包含他们的个人资料信息和他们选择的任务。然后,每个唯一的用户配置文件表都将包含每天完成的任务的持续历史记录。

或者有更好的设计方法吗?

编辑:或者最好有类似下面的东西:

任务历史表:

PersonID | Date     | Task1        | Task2    | Task3    | Task 4
001      | 24Jan15  | Complete     | Complete |          |
002      | 24Jan15  |              | Complete | Complete | Not Complete
003      | 24Jan15  | Not Complete |          |          |

所以会有一个包含所有用户(以及他们选择的任务)的表,另一个包含所有可能任务的表,最后是上面记录每天任务历史的表。

这里唯一的问题是并非每项任务都适用于每个人。所以会有空白。不确定这是否重要。

毫无疑问,我是个初学者。因此,我们将不胜感激。

【问题讨论】:

  • 列编号通常表示非规范化设计。您应该在描述任务状态的人员和任务之间建立多对多关系:例如person_task_status (person_id, task_id, status, status_date) statusstatus_date 可以为空,PK 为 person_id, task_id
  • 谢谢@a_horse_with_no_name,这是有道理的。还有一个问题,如果每项任务的状态不是简单的“完成”与“未完成”怎么办。例如,它也可以是一个百分比,以显示任务已完成 80%。我是否仍然只使用一个状态列,所有数据类型/输入逻辑都将在应用程序中处理?
  • 您可以使用整数列,其中任何低于 100 的值表示“不完整”,100 表示“完整”。如果您想查看“单词”,我会创建一个视图来返回此信息。 null 在该列中可能表示“尚未开始”。

标签: database postgresql database-design


【解决方案1】:

动态创建新表来保存数据子集几乎不是一个好主意。不同用户的数据应该放在同一组表中,并带有一些标识用户的字段。没有充分的理由拥有数百个完全相同的表,除了一个用于某个键值 A,下一个用于键值 B,等等。只需将键字段添加到表中即可。

正如 a_horse_with_no_name 所说,编号的列是一个强烈的信号,表明你做错了。这是一个坏主意的原因有很多。其中:如果每个任务都有一列,添加新任务时会发生什么?现在您必须向表中添加一个新列,并更新所有现有记录,而不是仅仅添加一条新记录。此外,它使查询非常复杂。像“今天完成了哪些任务”这样的查询需要对每一列进行单独的测试,而不是对单个“任务”列进行一次测试。

从你所说的来看,这是我对这应该是什么样子的第一个想法:

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 条记录,每天 3 条记录乘以 30 天。

(您可能有一个 task_status_id 作为 PK,或者您可能使用 user_id + task_id + task_date。超过 2 个字段的键往往很痛苦,所以我可能会创建一个 task_status_id。随便。)

如果您需要其他信息,这些表格中的任何一个都可能包含其他字段。像 User 表可能有员工编号、电话号码、部门等。

然后是这样的问题,“昨天哪些任务没有完成?”这个查询很容易回答:

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

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 2011-12-07
    • 2018-01-31
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多