首页 > 解决方案 > 大量使用 ndb 模型会影响性能吗?

问题描述

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

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

具体来说,编写一个简单的类(例如 ContentObject),它只有一个 content_type 和一些通用字段(如字符串、数字和 blob)不是更好吗?

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

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

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

解决方案


两种方法之间无需担心性能差异。

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

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

另一方面,您需要为每个模型单独查询,您无法在同一查询中获得不同种类的结果。而且您需要为每种类型维护单独的复合索引(每个应用程序的总限制为 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客户端库,其他客户端库没有)和搜索索引定义。


推荐阅读