GAE ndb设计,性能和重复属性的使用

wai*_*ani 12 google-app-engine python-2.7 app-engine-ndb google-cloud-datastore

假设我有一个图片库,一张图片可能有100k +粉丝.哪种ndb设计更有效?

class picture(ndb.model):
    fanIds = ndb.StringProperty(repeated=True)
    ... [other picture properties]
Run Code Online (Sandbox Code Playgroud)

要么

class picture(ndb.model):
    ... [other picture properties]

class fan(ndb.model):
    pictureId = StringProperty()
    fanId = StringProperty()
Run Code Online (Sandbox Code Playgroud)

您可以添加到ndb重复属性的项目数量是否有任何限制,并且在重复属性中存储大量项目是否有任何性能损失?如果使用重复属性效率较低,它们的用途是什么?

Gui*_*sum 32

如果您的值超过100-1000,请不要使用重复的属性.(1000可能已经推动了它.)它们不是为这种用途而设计的.


dra*_*onx 5

通常v1会便宜得多.

就读/写成本而言,您为每个实体提取/写入付费,因此您希望减少实体数量.版本1会更便宜.如果每次获取图片时都获取每个粉丝,便宜得多.

但是每个实体限制为1MB.如果您有100k +粉丝,则可以根据粉丝的大小达到该限制.这不算你的其他图片数据,所以你可以吹掉1MB的限制.您将不得不添加一些更复杂的代码来处理溢出情况.

大型实体的获取时间比小型实体要长.如果你要一直拿到所有的粉丝,v1会更好.如果你只想在任何一点获取5个粉丝,那么v2可能会更快(只有可能).另一方面,如果你尝试拉动100k风扇实体......这将永远消失.