【问题标题】:Google App Engine ndb performance on repeated property重复属性上的 Google App Engine ndb 性能
【发布时间】:2013-07-03 17:10:10
【问题描述】:

如果我选择查询repeated 属性,我是否会为查询性能付出代价?例如:

class User(ndb.Model):
    user_name = ndb.StringProperty()
    login_providers = ndb.KeyProperty(repeated=true)

fbkey = ndb.Key("ProviderId", 1, "ProviderName", "FB")
for entry in User.query(User.login_providers == fbkey):
    # Do something with entry.key

对

class User(ndb.Model)
    user_name = ndb.StringProperty()

class UserProvider(ndb.Model):
    user_key = ndb.KeyProperty(kind=User)
    login_provider = ndb.KeyProperty()

for entry in UserProvider.query(
    UserProvider.user_key == auserkey,
    UserProvider.login_provider == fbkey
):
    # Do something with entry.user_key

根据 GAE 的文档,似乎 Datastore 负责索引,第一个不太冗长的选项是使用索引。但是,我没有找到任何文件来确认这一点。

编辑

UserProvider 在第二个示例中的唯一目的是在用户和它的 login_provider 之间创建一对多的关系。我想了解创建第二个实体而不是查询repeated 属性是否值得。另外,假设我只需要来自User 的密钥。

【问题讨论】:

  • 尚不清楚您是否在第一个版本中也有一个 UserProvider 类,或者您是否只是创建指向无处的键(这是允许的,顺便说一句:-)。这两个查询不等价,因为一个返回 User 实体,另一个返回 UserProvider 实体。
  • @GuidovanRossum 我更新了问题,希望现在更清楚。我确实花了一些时间来理解什么是 ndb.Key,因为您可以创建一个不指向任何内容的 Key。

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


【解决方案1】:

没有。但是会增加写入成本,因为每个条目都需要建立索引,而写入成本取决于更新的索引数量。

【讨论】:

  • OTOH 第一种情况下的查询应该更便宜。因此,这取决于您添加/删除提供商的频率。
  • 好的,听起来您不需要为 UserProvider 操心。也许您应该只使用 StringProperty(设置为例如“FB”)而不是 KeyProperty 指向无处。存储的字节数更少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多