App Engine datastore: модель для постепенно обновляемой карты высот местности - PullRequest
0 голосов
/ 22 июня 2010

Пользователи отправляют прямоугольные выровненные по оси области, связанные с «картами местности».В любое время пользователи могут удалять созданные им области.

class Region(db.Model):
  terrain_map = reference to TerrainMap
  top_left_x = integer
  top_left_y = integer
  bottom_right_x = integer
  bottom_right_y = integer

Я хочу сохранить «карту высоты местности», которая постепенно обновляется по мере добавления или удаления новых прямоугольных областей.

class TerrainMap(db.Model):
  terrain_height = blob

Вот «рисунок» того, как карта может выглядеть с двумя перекрывающимися регионами: http://pastebin.com/4yzXSFC5

Поэтому я подумал, что мог бы сделать это, добавив модель RegionUpdate, созданную при создании или удалении объекта Region., а также ставит в очередь задачу, которая будет обрабатывать запрос для "RegionUpdate.applied = False"

class RegionUpdate(db.Model):
  terrain_map = reference to TerrainMap
  top_left_x = integer
  top_left_y = integer
  bottom_right_x = integer
  bottom_right_y = integer
  operation = string, either "increase" or "decrease"
  applied = False/True

Проблема заключается в том, что все объекты RegionUpdates и Region должны находиться в той же группе объектов, что и их TerrainMap: RegionUpdates должен создаваться только тогда, когда объекты Region создаются или удаляются, поэтому это должно быть сделано транзакционно;TerrainMap.terrain_height обновляется в задаче, поэтому это должна быть идемпотентная операция - я могу думать об этом только путем транзакционного захвата пакета сущностей RegionUpdate, а затем применения их к TerrainMap.

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

Я пропускаю какой-то лучший способ смоделировать это?

1 Ответ

0 голосов
/ 22 июня 2010

Как я предположил в вопросе Reddit, я думаю, что Бретт говорит о конвейерах данных , и содержит всю информацию, необходимую для его построения.Основной подход заключается в следующем: каждый раз, когда вы вставляете или обновляете регион, добавляйте объект «маркер» в одну и ту же группу объектов.Затем в этой задаче обновите соответствующий TerrainMap новыми данными и оставьте объект Marker как его дочерний элемент, указывая, что вы применили это обновление.Для получения более подробной информации см. Доклад.

С другой стороны, вы не указали, сколько регионов вы ожидаете от TerrainMap, или как часто они будут обновляться.Если частота обновления одной карты местности невелика, вы можете просто сохранить все регионы как дочерние объекты TerrainMap, к которым они применяются, и обновить карту синхронно или в очереди задач в одной транзакции, что значительнопроще.

...