0

現在、このモデルを使用して 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 エンティティは各エンティティにリストとして埋め込まれます。

これがデータを保存するための高価で遅い方法であるかどうか疑問に思っています。BundleModel を親として、各 ProductModel を子エンティティとして格納する方がよいでしょうか?

この場合、BundleModel の各リクエストは、ProductModels の複数のリクエストに変換されます。データの大きなチャンクに対する 1 つのリクエストと、データの小さなチャンクに対する複数のリクエスト (約 10 程度) のトレードオフはありますか? データの書き込みに関しては、1 つの大きなチャンクを変更するのではなく、小さなチャンクを個別に書き込みます。

コスト、速度、およびその他のパラメーターに関して、このような変更の影響は何ですか?

ありがとう!

4

1 に答える 1

1

いいえ、構造化されたプロパティを使用すると、別の子エンティティを使用するよりも高速で安価になります。

構造化プロパティが機能する方法は、構造をフラット化し、構造内の各プロパティに対してエンティティ内に新しいプロパティを自動的に作成することです。あなたの場合、BundleModelエンティティは自動生成されたプロパティを取得します: product_vals.p_createdproduct_vals.p_updated、など..

構造化されたプロパティは、2 つ以上 (親 + 子) ではなく、1 つのエンティティのみを格納するため、優れています。これにより、より速く、より安価になります。アクセスする場合、エンティティ サイズごとのコストは発生しないことに注意してください。

制限に関する注意:

  1. インデックス サイズの制限: 繰り返される構造化プロパティは、複数のリスト プロパティに展開されます。これにより、値ごとに 2 つのインデックス エントリが作成されます。1 つのエンティティは合計で最大 5000 のインデックス エントリを持つことができ、これは 1 つのエンティティ内で最大 2500 のプロパティ値に変換されます。
  2. サイズ: エンティティのサイズは最大 1Mb です。
于 2013-10-02T07:04:41.167 に答える