在数据存储区写入方面哪些更快,更便宜?将数据存储在ndb.StructuredProperty中或作为子实体单独存储

时间:2013-10-01 12:38:09

标签: python google-app-engine app-engine-ndb

我目前正在使用此模型在我的appengine ndb数据存储中存储数据

class BundleModel (ndb.Model):
  product_vals=ndb.StructuredProperty(ProductModel,repeated=True)

ProductModel如下:

class ProductModel(ndb.Model):
  p_created=ndb.DateTimeProperty(auto_now_add=True)
  p_updated=ndb.DateTimeProperty(auto_now=True)
  p_title=ndb.StringProperty()
  p_link=ndb.StringProperty()
  p_categ=ndb.StringProperty()
  p_categ_alt=ndb.StringProperty()
  p_value=ndb.FloatProperty()
  p_location=ndb.StringProperty()
  p_avail=ndb.BooleanProperty(default=True)
  p_mod=ndb.BooleanProperty(default=False)

我只将BundleModel放在数据存储区中,并将ProductModel实体作为列表嵌入到每个实体中。

我想知道这是一种存储数据的昂贵且缓慢的方法。将每个ProductModel存储为子实体,将BundleModel作为父实体存储会更好吗?

在这种情况下,BundleModel的每个请求都会转换为对ProductModel的多个请求。那么需要权衡一个大块数据的请求与小块数据的多个请求(大约十个左右)之间的权衡吗?在编写数据方面,我会分别编写小块而不是修改一个大块。

在成本,速度和任何其他参数方面,这种变化的后果是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

不,使用structured property比使用单独的子实体更快,更便宜。

结构化属性的工作方式是展平结构并在结构中为每个属性在实体中自动创建新属性。在您的情况下,您的BundleModel实体会获得自动生成的属性:product_vals.p_createdproduct_vals.p_updated等。

结构化属性更好,因为它只存储一个实体,而不是两个或更多(父+子)。这使它更快,更便宜。请注意,访问它时,每个实体大小没有成本。

关于限制的说明:

  1. 限制索引大小:重复的结构化属性将扩展为多个列表属性。这反过来将为每个值创建两个索引条目。一个实体总共可以拥有最多5000个索引条目,这些条目转换为一个实体内的最大2500个属性值。
  2. 大小:实体的大小最大为1Mb。