我有一个Event
模型start_time
& end_time
个ndb.DateTimeProperty()
属性类型。{/ p>
我通常使用Event.query(Event.start_time >= START_OF_THE_MONTH, Event.start_time <= END_OF_THE_MONTH)
等查询来查询事件。
添加重复活动支持的最佳方法是什么?
我想到的第一件事就是单独创建每个事件,但每天都会重复一次事件 - 那就是很多创建的实体(他们需要创建什么样的实体?一年?10年? )。虽然这种方法可以使现有的代码和查询工作 - 它非常昂贵且效率低下。
接下来,使用存储事件重复频率规则的属性为整个周期性事件创建一个实体,然后,除了上面的查询之外 - 再次查询模型以查找所有重复事件可能有效但仅直到有太多反复发生的事件......
还有哪些适用于ndb
且可扩展,理想情况下对现有代码/查询的更改量最少?
答案 0 :(得分:1)
我了解您需要查询一年中某个月的事件。我还假设经常性事件有某种到期日期。
因此,您可以做的是将start_date属性更改为重复属性(如果这会破坏您的某些代码,您可以创建一个名为'target_dates'的新属性或其他)。
target_dates = ndb.DateProperty(repeated=True, indexed=True)
然后,当您存储事件时,计算此事件可用的日期范围(以月为单位)并将其存储为列表:
start_date = datetime.date(year=2017, month=1, day=1)
end_date = datetime.date(year=2017, month=5, day=1)
target_dates = [datetime.date(year=2017, month=1, day=1), ... , datetime.date(year=2017, month=5, day=1)]
我要做的是使用target_dates进行与查询相同的查询。
另一种方法是仅执行两个单独的密钥查询(快速且廉价的查询,因为它们使用属性索引)。一个查询查询月份中的非重复事件,另一个查询查询周期性事件(可能使用结束日期)。然后加入结果集并使用get_multi获取实体。另外,你可以在这里获得缓存的实体。
我不确定这是否适合您的应用,但所提供的信息是我现在可以帮助您的。