广泛使用ndb模型会影响性能吗?

时间:2018-05-16 12:34:51

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

我是GAE的新手,我还在努力解决问题。我们正在开发一款Android应用程序,它使用Cloud Datastore存储图像,视频,文本,音频等。因此,我们现在拥有超过15种类型的内容对象。

我一直在将每种类型的对象建模为一个独特的ndb模型类,但我想知道这种设计是否会影响性能。

具体来说,编写一个简单的类(例如ContentObject)并不是更好,它只有一个content_type,一些通用字段为string,number和blob?

如果我不得不担心创建/维护表(或者只是知道后面有常规的db表),我想我会选择后者。

我真的很喜欢第一种选择,但我不得不问,以防万一。

1 个答案:

答案 0 :(得分:4)

两种方法之间没有性能差异。

使用专用模型,您必须编写更多代码 - 每个模型都需要单独处理。但它的代码更简单,特别是如果最终你将拥有一些只存在于某些实体或处理不同的属性,这将需要带有通用模型的条件逻辑。

如果存在属性差异,使用专用模型构建查询也更简单,使用单个模型可能需要填充未使用的属性(可能使用默认值),如果它们用于排序/过滤查询结果(缺少属性的实体不是#39; t由相应的属性索引,因此它们不会显示在结果中)。

另一方面,您需要为每个模型单独查询,您无法在同一查询中获得不同类型的结果。并且您需要为每种类型维护单独的复合索引(每个应用程序总共限制200个此类索引)。

如果您担心代码重复,这也可能是您考虑共享模型的原因,那么也可以在单个ndb模型类中组合公共属性,使用单个/通用实现来处理这些公共属性,并在处理差异的专用子类中继承该类。像这样:

class Content(ndb.Model):
    type = ndb.StringProperty() # not really needed, cls._get_kind() can be used instead
    blob = ndb.StringProperty()
    # other generic/common content properties and related methods


class Video(Content):
    has_cc = ndb.BooleanProperty()
    # other video-specific content properties and related methods

但这仅仅是一种实现方法,从数据存储的角度来看,您还在使用专用模型 - 在上面的示例中,视频实体将具有Video类,而不是Content

数据存储区没有表格,同类实体之间共享的唯一内容是他们的ndb模型(仅适用于性能更高的ndb客户端库,其他客户端库和#39; t有一个)和搜索索引定义。