如何在Go中的AppEngine数据存储中建立多对多关系模型?

时间:2013-06-28 18:22:16

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

我试图围绕如何在Go编程语言中表示AppEngine数据存储区内的多对多关系。我更习惯传统的关系数据库。

我的系统中有两种类型的实体。我们称他们为AB。每个A实体都与一些B个实体相关。同样,每个B实体都与其他一些A实体相关。我希望能够有效查询给定B实体的所有A实体,以及给定A实体的所有B个实体。

在Python SDK中,似乎有一种方法可以注意实体中的字段可以是引用其他实体的ReferenceProperty。但是,我在Go的AppEngine SDK中找不到类似的东西。 Go似乎只是使用基本struct来表示实体。

处理此问题的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

根据您查询的方式,您可以执行以下操作:

你的结构中的

添加一个字段:

BIds []int64
你的struct B中的

添加一个字段:

AIds []int64

现在每当你在A和B之间添加关系时,你只需要将相应的id添加到你的两个变量

当您需要立即查询与此A1相关的所有B时,您可以执行以下查询:

SELECT * FROM B where AIds = 'A1'

对于所有与这个B1相关的A你做的相似:

SELECT * FROM A where BIds = 'B1'

<强>更新
根据dragonx的建议改变了查询

答案 1 :(得分:1)

python ReferenceProperty本质上将密钥存储到另一个实体。它类似于在Go中使用Key字段。

至少有两种方法可以解决您的问题。存储有限数量的引用的廉价方法,以及用于更大数据集的昂贵方法。

fmt.Println.MKO提供了廉价方式的答案,除了查询比他的建议更简单,它应该是:

SELECT * FROM B where AIds = 'A1'

此方法仅限于每个实体的索引条目数以及实体大小。因此,AIds或BIds列表将实体数量限制在20000或更少。

如果您有大量数据,您可能希望映射实体代表给定A&amp; A之间的M2M关系。 B实体。它只包含A的键和B的键。然后,您将查询映射实体,然后获取所需的相应A或B实体。这将更加昂贵,但突破实体大小限制。