Модели данных GAE для событий и общих ресурсов - PullRequest
1 голос
/ 11 марта 2012

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

Ресурсы распределяются между пользователями, и ресурс может быть только в одном событии.вовремя.Ресурс будет иметь несколько событий, но эти события не могут перекрываться или происходить одновременно.Событие также может иметь несколько ресурсов.

class event(db.Model):
  #user that created/owns the event
  user = db.ReferenceProperty(user, collection_name='events',required=True)

  #an event can have multiple resources
  resources = db.StringListProperty() # resource key(s)

  #when the event opens and closes (start/stop)
  opendt = db.DateTimeProperty()
  closedt = db.DateTimeProperty()

class resource(db.Model):
  name = db.StringProperty(required=True)

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

  1. Получить все ресурсы (простой запрос)
  2. Получить все события, которые перекрывают новое событие (несколько запросов)
    1. найти события, которые начинаются до и заканчиваются после нового события
    2. найти события, которые начинаются до и заканчиваются во время нового события
    3. находить события, которые начинаются и заканчиваются во время нового события
    4. находить события, которые начинаются во время и заканчиваются после нового события
  3. Отфильтровать ресурсы, включенные в перекрывающиеся события

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

Когда пользователь создает новое событие, после того, как он вводит время начала / окончания своего нового события, яхотели бы, чтобы они быстро могли видеть доступные ресурсы для этого периода времени.

Есть ли лучший, более эффективный способ?

1 Ответ

0 голосов
/ 11 марта 2012

Просто с моей головы, это будет работать: 1. Используйте длинное целое число для представления ваших кусков времени, вроде таймера Unix, но используйте большие куски времени, так что каждый шаг представляет 15 минут. т. е. 0 = 01.01.2012 00:00, 1 = 01.01.2012 00:15, 2 = 01.01.2012 00:30 и т. д.

И в ваших ресурсах, и в событии храните ListProperty длинных целых для всех квантов времени, которые они заняты.

Если вы хотите увидеть, является ли ресурс или событие «активным» в определенный момент времени, просто рассчитайте длинное целое значение для этого временного блока и найдите его в ListProperty, используя фильтр «in» в запрос.

...