【问题标题】:Recurring events in Google's Datastore / NDBGoogle 的 Datastore / NDB 中的重复事件
【发布时间】:2016-12-09 10:24:59
【问题描述】:

我有一个 Event 模型,具有 start_timeend_timendb.DateTimeProperty() 属性类型。

我通常使用Event.query(Event.start_time >= START_OF_THE_MONTH, Event.start_time <= END_OF_THE_MONTH) 之类的查询来查询事件。

添加对重复事件的支持的最佳方法是什么?

首先想到的是单独创建每个事件,但每天重复一个事件 - 这是许多已创建的实体(它们需要创建到什么程度?一年?十年? )。虽然这种方法会使现有的代码和查询工作 - 它非常昂贵且效率低下。

接下来,为整个重复事件只创建一个实体,其属性存储事件重复频率的规则,然后,除了上面的查询 - 再次查询模型以获取所有重复事件可能有效,但仅直到有太多重复事件发生的时候......

还有什么适合ndb 并且可扩展,最好是对现有代码/查询的更改最少?

【问题讨论】:

  • 您希望每个月管理多少事件?
  • @janscas 我根本不希望有很多,每个用户不应该超过〜15-20,我只是担心用户可能会创建几个日常重复事件的最坏情况(测试事物或其他东西,如果为每个事件创建一个实体并请求每月视图,这将使该用户的应用程序稍微变慢)。

标签: python google-app-engine calendar google-cloud-datastore app-engine-ndb


【解决方案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 获取实体。此外,您还可以在这里获得缓存的实体。

我不确定这是否适合您的应用,但目前提供的信息就是我能帮助您的全部。

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2014-03-06
    • 2020-07-31
    • 2018-07-18
    相关资源
    最近更新 更多