【问题标题】:Is this a normalisation error?这是标准化错误吗?
【发布时间】:2012-06-08 14:57:24
【问题描述】:

这与我的上一个问题相似,但更归结为问题。

我正在设计一个系统来安排任务;大多数时候重复的任务。例如,用户可以将“扫地”安排在每周的周一、周三和周五进行。

我可以从日程表中判断某项任务是否应在任何特定日期完成,最重要的是我可以判断它是否应在当天完成。然后我必须向工作人员显示当前任务的列表(并将其发送到站点周围的手机)。

然后用户表明他们已经开始了任务(所以我们需要一个状态 Task-Started)以及他们何时完成了一项任务(Task-Worked)。如果工人没有很好地完成工作,检查任务的人可以“失败”它,进入结束状态任务失败。一个任务也可以有其他一些状态,但这对于这个问题的范围来说应该足够了。

我想知道是否应该在数据库中创建每个任务发生的实例,从而允许我针对那个特定实例存储状态 的任务。我想另一种看待它的方式是我在数据库中创建“到期”的初始状态,或“今天到期”以及它到期的实际日期时间(或至少是机会窗口的日期时间)做任务)。

但是 - 这种状态可以总是派生出来,因为这是我从中生成“今天的”任务列表的地方,所以它确实感觉像是一个规范化错误 - 感觉就像我在重复数据无论如何都可以推导出来。

优点:

  • 它将允许生成的“到期”任务有一个准确的日期时间,从而保护它免受只会影响未来几天的日程安排的更改(尽管我的日程安排历史表允许我得到旧数据)。

  • 可以调整特定日期的日程安排,以防当天发生异常情况。

  • 它在数据库中创建一个正式的状态,而不是派生它(我是不是编的?)。

缺点:

  • 需要一个后台进程来生成这些实例(或生成“到期”或“今天到期”状态,具体取决于您如何看待它)。

我想我的问题归结为:

1) 如果日程表只是一个确切的日期时间列表,则不会有任何问题,因为每个条目都描述了任务本身。事实是:这个日期时间的这个任务。一旦该任务完成,我们就会针对它存储事实。

2) 然而,重复计划只是描述了每个任务应该在什么时候,而不是描述实际发生的时间。

我希望这是有道理的。想法?

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    我会将其建模为任务计划,其中将包含诸如任务发生在哪一天以及下次到期时间等信息。

    作为每天的后台作业,您将查看时间表并确定它们是否在今天发生。如果是这样,您将创建一个任务记录,并更新下一个截止日期。下一个截止日期是一种非规范化,但我认为它让生活更轻松。这取决于您的调度逻辑有多复杂以及您拥有多少数据。

    任务表是任务计划的子表。任务表将包含到期日期、状态、分配给等。同时您会将这些任务发送到手机(我会在第一个任务成功完成后启动的第二个任务中执行此操作)。

    【讨论】:

    • 是的,这基本上是我想这样做的另一种方式,尽管我不会存储下一个到期日期,因为查找该值是一个简单的查询,而且如果时间表发生变化,它会发生冲突(这当然是避免非规范化的原因之一)。谢谢:-)
    • 我有一个类似的问题,我决定存储下一个截止日期。在我的情况下,由于公共假期、不同天数的月份和手动编辑,这很复杂。我不想每天为每个项目重新计算下一个日期。如果很简单,请不要存储它。
    • 是的,听起来确实更复杂。但是您是否不需要计算它以便能够存储下一个到期日?只是好奇。
    • 可以,但是每次执行只需要计算一次,而不是每天计算一次。如果下一次运行是在 30 天内,我不需要在中间的 29 天计算它,只是为了发现还不是时候。此外,可以索引下一个日期,以使早上批处理运行从计划中快速创建任务。
    【解决方案2】:

    将“任务”和“任务实例”分开,但不要在任务到期时生成新实例。

    在启动时生成(并将结束时间和成功状态保留为 NULL)。任务实例完成后,将这些 NULL 替换为具体值。

    因此,不需要后台进程,但您始终可以确定何时:

    • 到期任务未启动(实例表中无行)
    • 或启动的任务尚未完成(NULL 结束时间)
    • 或完成的任务有多成功(通过检查结束时间为非 NULL 的任务实例的成功状态)。

    【讨论】:

    • 感谢 Branko(也感谢您对另一个问题的回答)。我正在慢慢完成所有工作,所以不要忽视答案 - 我稍后会回复。谢谢!
    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多