重复性日历任务应如何存储在数据库中?


14

这是一个用于微管理的小型个人项目。基本上,我将任务存储在如下所示的SQLite3数据库中:

    id INTEGER PRIMARY KEY AUTOINCREMENT
    label TEXT
    deadline INTEGER

因此,每个任务都有一个截止日期(截止日期),该截止日期存储为Unix时间戳。到目前为止,到目前为止,我可以进行诸如“明天:访问祖母”之类的条目,并以“ visit grandma”为标签创建新行,明天将转换为Unix截止日期。

现在,我想输入新的任务类型:例程-按时间模式重复的任务,例如“每天:清洁厨房”。如何存储或建模此类任务?

目前,我认为,对于需要每天执行的任务,要在表中生成具有相同标签的新行,并且截止日期字段将增加一天。在这种情况下,我需要在将来确定一个限制。例如,如果我每天创建一个例程,那么它将为剩余年份的每一天创建一个新行。

有没有更简单的方法可以做到这一点?我是否缺少一些明显的数据库设计原则?


3
是。使用适当的计划程序工具,而不要发明另一个工作计划程序。在SOPA抗议结束后,请阅读en.wikipedia.org/wiki/Open_Source_Job_Scheduler。很好,已经解决了很多次了。
S.Lott 2012年

谢谢洛特!是的,我怀疑对此有一个优雅的解决方案!我将等待SOPA结束或检查其他Wikipedia国家/地区是否有翻译。编辑:实际上,我刚刚注意到Wikipedia US中仍提供HTML源,黑屏就像CSS技巧,我在小量的monkeymonkey脚本的方式:)
弗朗索瓦·维斯帕ت12年

1
一般注意事项:以下大多数帖子都没有考虑到数据实际存储方式的问题。我的意思是给定一个任务,该任务在每个星期一重复一次,为期两年,那么需要将多少行写入磁盘?
NoChance 2012年


@ root45不错,其实我是用lynx命令行,更容易:)
弗朗索瓦ッ胡蜂ت

Answers:


7

您可以制作一个单独的表以进行重复。但老实说,我会把它和类型字段放到同一表中。

像这样:

ID - Int Pk

TaskDescription - TEXT

Type - Text - (Re-Occurring, or Single Occurrence) 

Due- TimeStamp - for Single Occurrence is the Date time

LastTimeCompleted - Time Stamp

ReoccurringUnit - Text - "Days", Weeks, Month, Ext

ReoccurringEveryX - Int - Reoccurring interval 

有趣的,我其实探索类似这样的一个可能的解决方案,我还在工作我的SQL函数,我会后,如果成功
弗朗索瓦ッ胡蜂ت

有趣的是,我试图提出一个查询,该查询可以提取重复任务和非重复任务,然后按到期日对它们进行排序。有什么线索吗?
Harshal Patil 2014年

2

除了S.Lott的评论外,Martin Fowler-日历的重复事件 PDF可能会对您有所帮助(我觉得有点困难)。

还要注意,有几个UI工具提供了您现成描述的功能(使用简单的任务模型)。如果没有这样的工具,我会认为这个问题很难解决数据库设计问题。


1

我认为有两种选择:

  • 为重复发生的项目存储大量相等的行,但是它们必须结束(直到结束日期或有限数量的项目),并且必须标记为重复发生的项目。更改事件时,必须全部更新它们,但是如果您想偏离一次,则可以简单地“断开”一个事件之间的连接,并将其设为正常事件。
  • 使用某种重复方案将事件存储为重复发生的项目,并针对给定的日期计算哪些重复发生的项目在给定的日期到期。这提供了无限重复的可能性。

这就是我看到它,以及
弗朗索瓦ッ胡蜂ت

1

如果这是一个个人项目,并且您只想要一种存储任务的方法,则建议使用TaskCoach。它是一个桌面应用程序,多平台,开放源代码,易于入门并且具有非常好的功能。

如果您正在开发任务应用程序,那么最可能的方法是为每个重复任务添加新行。逻辑是每个任务本身就是一个单独的实体,必须在第二天开始同一任务之前完成它。如果仅增加它,就无法捕获任务的历史记录。

以防万一,如果一些任务没有完成,它将给您一个很大的清单,然后您可以在重复任务完成后触发一个事件,以便仅当任务完成时才将新任务作为新行生成标记为完成。如Morons所建议的,您可以使用带有标志的单独表来对原始表中的重复任务以及重复数据(天,周,重复时间)进行使用,这样您就可以拥有一个简单的脚本,该脚本可以根据以下内容生成重复任务日期或条件或按标签。

但是,如果您确定该任务是肯定重复的任务,并且没有任何更改(例如每天刷一次)并且不需要广泛的跟踪,那么您可以尝试以下结构

  • 重复标记-表示任务正在重复
  • 重复周期-日,周,月
  • 创建的任务数-这将根据重复周期增加任务。因此,如果任务从今天开始并且有一天的重复周期,那么明天它将增加一个
  • 已完成的任务数-如果任务完成,此数量将增加

逻辑是完成的任务与创建的任务之间的区别是,如果任务始终完成,则应始终将其作为重复周期。因此,将天数差异除以重复期限可以使您了解任务待处理的时间。

感谢Kareem指出这一点

恕我直言,任务应用程序对于大多数人来说很难构建。


感谢您的建设性回答!这是一个有趣的项目,我想使它尽可能的灵活,具有查询,如“每4天重复,除非它是一个星期三”
弗朗索瓦ッ胡蜂ت

1

到目前为止,最频繁的操作是列出一个时间段内发生的所有事件。因此,请优化您的数据,以便可以通过简单的SQL查询来回答问题。我将创建两个表:

CREATE TABLE events(start TIMESTAMP, end TIMESTAMP, name TEXT, user_id LONG,
                    recurrence_id LONG, ...);
CREATE TABLE recurrences(id LONG, start TIMESTAMP, end TIMESTAMP, name TEXT, 
                         frequency ...);

按开始时间和结束时间索引事件表。然后,可以从事件表中非常迅速地回答所有查询。编辑重复时,只需删除并重新创建所有相应的事件。

汤姆·凯特(Tom Kite)的一本书无耻地重复了这一建议。


1

重复的任务应具有开始日期和结束日期。对于单个日期的任务,它们将是相同的日期。

创建某种类型的“日期”表,该表每天记录一条您认为从需求开始到您想要的每一天相关的记录:例如12/31/2100并转换为格式。

查询可能类似于:

Select 
  t.id
  , t.label
  , d.UnixDate
from Tasks as t
inner join Dates as d
on d.UnixDate >= t.StartDate
  and d.UnixDate <= t.EndDate
where t.id = [ID Param]

0

几年前,我已经做了类似的事情,实现了Windows Task Scheduler之类的接口,基本上对于每个任务,您都有StartDate,EndDate(可以为null),StartTime和RecurringDays,其中包含必须安排任务的星期几。


那很有意思。是否存在一些设计限制,即无法完成的查询(如“每周重复一次”)?
弗朗索瓦·维斯帕ت12年

0

您可以使用两个表:一个用于描述任务,另一个用于描述它们的状态(完成/未完成,以及其他信息:花费的时间,退出状态,日志文件的位置等)。描述表将包含任务的名称,以及执行该任务的日期或频率:每个任务只有一行。每天,流程都会从描述表中填充今天要执行的任务的状态表(您可以提前一周或一个月填充)。

以编程方式生成状态表可为您提供所需的频率灵活性(例如,“除X国的银行假日外的每个工作日”-甚至可以存储为字符串)。有了状态表,您可以检查任务是否失败或失败的频率(例如:“我应该每天运行:我有多少时间执行此操作?”)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.