Google app engine 重复属性上的Google应用程序引擎ndb性能
如果我选择查询Google app engine 重复属性上的Google应用程序引擎ndb性能,google-app-engine,google-cloud-datastore,app-engine-ndb,Google App Engine,Google Cloud Datastore,App Engine Ndb,如果我选择查询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 =
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
vs
根据GAE的文档,数据存储似乎负责索引,第一个不太详细的选项是使用索引。然而,我没有找到任何文件来证实这一点
编辑
在第二个示例中,
UserProvider
的唯一目的是在用户与其登录提供者之间创建一对多关系。我想了解是否值得费心创建第二个实体,而不是查询repeated
属性。另外,假设我所需要的只是用户的密钥。但是,由于每个条目都需要索引,所以写入成本会增加,并且写入成本是基于更新的索引数量的。o第一种情况下的查询应该更便宜。因此,这取决于您添加/删除提供者的频率。好的,听起来您不必为UserProvider操心。也许您应该使用StringProperty(设置为例如“FB”)而不是不指向任何地方的KeyProperty。存储的字节更少。不清楚在第一个版本中是否也有UserProvider类,或者是否只创建指向任何地方的键(顺便说一句,这是允许的:-)。这两个查询并不相等,因为一个返回用户实体,另一个返回用户提供程序实体。@GuidovanRossum I更新了问题,希望现在更清楚。考虑到您可以创建一个不指向任何内容的键,我确实花了一段时间才理解什么是ndb.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