Google app engine 实体\u key.get()和模型.get\u by\u id(实体\u key\u id)之间的性能差异?

Google app engine 实体\u key.get()和模型.get\u by\u id(实体\u key\u id)之间的性能差异?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我有两个选项来表示来自某个其他MyData2实体的相关MyData实体: class MyData(ndb.Model): ... class MyData2(ndb.Model): data_key = ndb.KeyProperty(kind='MyData') # data's key data_key_id = ndb.IntegerProperty() # data's key ID 因此,获取MyData的密钥或MyData2实体的密钥ID

我有两个选项来表示来自某个其他
MyData2
实体的相关
MyData
实体:

class MyData(ndb.Model):
    ...

class MyData2(ndb.Model):
    data_key = ndb.KeyProperty(kind='MyData')  # data's key
    data_key_id = ndb.IntegerProperty()        # data's key ID
因此,获取
MyData
的密钥或
MyData2
实体的密钥ID的成本几乎相同

按键访问
MyData
之间是否存在显著的性能差异

my_data = my_data2.data_key.get()
并通过密钥ID访问它

my_data = MyData.get_by_id(my_data2.data_key_id)
我假定按键ID访问使用内置索引查找,但我不知道直接键访问是否执行类似的查找,或者是否使用其他方法来获取实体


所有实体都是根实体,不涉及实体组祖先关系。

ndb.Model.get\u by\u id
只需创建当前模型类型的键,并对其调用
get
,因此它们在所有意图和目的上都是相同的


由于异步间接寻址,以及模型如何重新声明处理冲突的方法,它不是最清晰的代码,但您可以看到它

ndb.Model.get\u by\u id
只需创建当前模型类型的键,并对其调用
get
,因此它们的意图和用途完全相同


由于异步间接寻址,以及模型如何重新声明方法来处理冲突,这不是最清晰的代码,但您可以看到它

Fwiw,存储密钥和ID是不必要的-您可以对其中一个执行任何操作,也可以对另一个执行任何操作,所以你可以只保留其中一个来节省存储空间。@Greg我只为了这个问题的说明目的才拥有这两个,当然:)Fwiw,存储密钥和ID是没有必要的-你可以用一个做任何事,你可以用另一个做任何事,所以你可以只保留其中一个来节省存储空间。@Greg当然,这两个都是为了说明这个问题:)