在数据库中存储复杂的时间间隔

时间:2016-05-05 16:48:54

标签: python django postgresql datetime calendar

我正在开发适用于事件的应用程序。 (语言:Python 2.7,RDBMS:PostgreSQL,CSM:Django 1.9.6)。我需要存储有关日历事件的信息。它们具有高度可定制的时间间隔(例如:从3月5日上午5:00开始重复5次,每周四持续45分钟;或者在下午6:00重复每个奇数日,持续时间为1天2小时(从1日开始)下午6:00到2日晚上8:00,然后从3日下午6:00到4日晚上8:00))。

问题是如何存储此类信息,以及快速选择实际事件(在将来的当前和特定时刻有效)?

作为解决方法:使用RRule并定期工作以计算第二天每个事件的时间间隔。但是,我认为这是非常耗时的操作,特别是如果服务器上有数千个事件(缓存有帮助,但是当我在未来的特定时刻需要活动事件时该怎么做以及它是什么通常的查询)。

1 个答案:

答案 0 :(得分:0)

我会保留两个模型 - 一个用于描述重复规则,一个用于实际出现(每个规则可以有多次出现,但不是无限数量,因为你声明他们有"合理终止" )。

class Rule(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()
    frequency = models.CharField(max_length=1, choices=FREQUENCIES)
    interval = models.PositiveIntegerField()
    duration = models.PositiveIntegerField() # duration may be in seconds or minutes?
    # and so on, add all the fields you need to define the rule

class Occurrence(models.Model):
    rule = models.ForeignKey(Rule)
    start = models.DateTimeField(db_index=True)
    end = models.DateTimeField(db_index=True)

给定规则的实例,您可以使用python-dateutil中的 rrule 生成其所有出现次数并将其保存到数据库中。当然,会有很多这些,但这些是小而简单的记录,数据库没有问题处理没有问题。所以现在找到当前活动的所有事件的问题是微不足道的:

Occurrence.objects.filter(start__lte=d, end__gte=d)

如果您想要Rule实例而不是Occurrences:

Rule.objects.filter(occurrence__start__lte=d, occurrence__end__gte=d)