Google app engine 如何在AppEngine';Go中的数据存储?

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

我试图用Go编程语言来描述AppEngine数据存储中的多对多关系。我更习惯于传统的关系数据库

我的系统中有两种类型的实体。让我们称它们为
A
B
。每个
A
实体都与一些
B
实体相关。类似地,每个
B
实体都与另一些
A
实体相关。我希望能够高效地查询给定
A
实体的所有
B
实体,以及给定
B
实体的所有
A
实体

在Python SDK中,似乎有一种方法可以说明实体中的字段可以是引用其他实体的
ReferenceProperty
s。然而,我在Go的AppEngine SDK中找不到类似的东西。Go似乎只是使用basic
struct
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实体。这将更加昂贵,但超出了实体大小限制