2013-06-28 53 views
2

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

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

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

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

回答

1

根据您要查询你可以做到以下几点:

在你的结构一个

添加一个字段:

BIds []int64 

在你的结构b。添加一个字段:

AIds []int64 

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

当你现在需要查询所有B的与此相关的A1,你做你的查询是这样的:

SELECT * FROM B where AIds = 'A1' 

全部A至极都与此有关B1您做类似:

SELECT * FROM A where BIds = 'B1' 

更新:
上建议改变querys从dragonx

1

一个Python的ReferenceProperty主要储存密钥到另一个实体。这与在Go中使用Key字段类似。

至少有两种方法可以解决您的问题。一种便宜的方式来存储有限数量的引用,而对于较大的数据集则是一种昂贵的方式。

fmt.Println.MKO提供了廉价的方式回答,除了查询比他建议这么简单,它实际上应该是:

SELECT * FROM B where AIds = 'A1' 

这种方法的限制是每个索引条目数实体以及实体大小。所以AIds或BIds列表将会限制实体的数量为20000或更少。

如果你有一个疯狂的数据量,你会希望一个映射实体来表示给定的A实体之间的M2M关系。它只包含一个A的键和一个B的键。然后,您将查询地图实体,然后获取您需要的相应A或B实体。这将会更加昂贵,但会突破实体大小限制。