1

У меня есть Event модель с start_time & end_time из ndb.DateTimeProperty() типы недвижимости.Повторяющиеся события в компании Google Datastore/NDB

Обычно я запрашиваю события с запросом вроде Event.query(Event.start_time >= START_OF_THE_MONTH, Event.start_time <= END_OF_THE_MONTH).

Что было бы лучшим подходом для добавления поддержки повторяющихся событий?

Первое, что приходит на ум, - это создать каждое из событий индивидуально, но с повторением события ежедневно - это много созданных объектов (и в какой момент они должны были быть созданы? В течение года? В течение 10 лет ?). Хотя этот подход заставит работать существующий код & запросов - это очень дорого и неэффективно.

Далее, создавая только одно сущность для всего повторяющегося события со свойством, в котором хранится правило того, как часто повторяется событие, а затем, помимо запроса выше, снова запрашивает модель для всех повторяющихся событий, но только до тех пор, пока не произойдет слишком много повторяющихся событий ...

Что еще существует, что подходит для ndb и является масштабируемым, в идеале с минимальным количеством изменений существующего кода/запросов?

+0

Сколько мероприятий вы планируете управлять каждый месяц? – janscas

+0

@ janscas Я не ожидаю, что многие из них не должны превышать ~ 15-20 на пользователя, я просто беспокоюсь о сценариях худшего случая, когда пользователь может создавать несколько ежедневных повторяющихся событий (тестирование вещей или что-то еще, что немного замедлит приложение для этого пользователя, если создается сущность на событие и запрашивается ежемесячное представление). –

ответ

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. Кроме того, вы получаете здесь кешированные сущности.

Я не уверен, что это будет вписываться в ваше приложение, но с предоставленной информацией я могу вам помочь прямо сейчас.

Смежные вопросы