Google app engine 如何在AppEngine';Go中的数据存储?
我试图用Go编程语言来描述AppEngine数据存储中的多对多关系。我更习惯于传统的关系数据库 我的系统中有两种类型的实体。让我们称它们为Google app engine 如何在AppEngine';Go中的数据存储?,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,我试图用Go编程语言来描述AppEngine数据存储中的多对多关系。我更习惯于传统的关系数据库 我的系统中有两种类型的实体。让我们称它们为A和B。每个A实体都与一些B实体相关。类似地,每个B实体都与另一些A实体相关。我希望能够高效地查询给定A实体的所有B实体,以及给定B实体的所有A实体 在Python SDK中,似乎有一种方法可以说明实体中的字段可以是引用其他实体的ReferencePropertys。然而,我在Go的AppEngine SDK中找不到类似的东西。Go似乎只是使用basicstr
A
和B
。每个A
实体都与一些B
实体相关。类似地,每个B
实体都与另一些A
实体相关。我希望能够高效地查询给定A
实体的所有B
实体,以及给定B
实体的所有A
实体
在Python SDK中,似乎有一种方法可以说明实体中的字段可以是引用其他实体的ReferenceProperty
s。然而,我在Go的AppEngine SDK中找不到类似的东西。Go似乎只是使用basicstruct
s来表示实体
处理此问题的最佳做法是什么?根据您查询的方式,您可以执行以下操作: 在结构A中添加一个字段:
BIds []int64
在结构B中添加一个字段:
AIds []int64
现在,每当你在a和B之间添加一个关系时,你只需要将相应的ID添加到你的两个变量中
当您现在需要查询与此A1相关的所有B时,您可以按如下方式进行查询:
SELECT * FROM B where AIds = 'A1'
对于所有与此B1相关的信息,请执行类似操作:
SELECT * FROM A where BIds = 'B1'
更新:根据dragonx的建议修改查询python ReferenceProperty本质上存储了另一个实体的密钥。这类似于在Go中使用键字段 至少有两种方法可以解决你的问题。这是一种存储有限数量引用的廉价方法,也是一种存储较大数据集的昂贵方法 fmt.Println.MKO以廉价的方式提供了答案,除了查询比他建议的更简单之外,实际上应该是:
SELECT * FROM B where AIds = 'A1'
此方法仅限于每个实体的索引项数以及实体大小。因此,援助或投标清单将把实体数量限制在20000个或更少
如果您有大量的数据,您可能需要一个映射实体来表示给定a&B实体之间的M2M关系。它只包含a的一个键和B的一个键。然后,您将查询映射实体,然后获取所需的相应a或B实体。这将更加昂贵,但超出了实体大小限制