app engine datastore:逐步更新的地形高度图的模型

时间:2010-06-22 11:34:04

标签: google-app-engine google-cloud-datastore

用户提交与“地形图”关联的矩形轴对齐区域。用户可以随时删除他们创建的区域。

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在Task中更新,因此这必须是幂等操作 - 我只能通过事务性地抓取一批RegionUpdate实体,然后将它们应用到TerrainMap来实现这一点。

这使得我的实体组比“单个用户的数据或更小的数据”的“经验法则”规模大得多。

我是否会忽略一些更好的方式来模拟这个?

1 个答案:

答案 0 :(得分:0)

正如我在Reddit问题中所建议的那样,我认为Brett's data pipelines talk拥有构建此问题所需的所有信息。基本方法是:每次插入或更新区域时,在同一实体组中添加“标记”实体。然后,在该任务中,使用新数据更新相应的TerrainMap,并将Marker实体作为其子项,表明您已应用该更新。有关详细信息,请参阅演讲。

另一方面,您没有指定每个TerrainMap期望的区域数,或者它们更新的频率。如果单个地形图的更新速率不是很大,您可以简单地将所有区域存储为它们应用的TerrainMap的子实体,并在单个事务中同步或在任务队列上更新映射,这很多简单。