2

我正在努力思考如何在 Go 编程语言中表示 AppEngine 的数据存储区中的多对多关系。我更习惯于传统的关系数据库。

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

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

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

4

2 回答 2

1

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

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

BIds []int64

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

AIds []int64

现在,任何时候您添加 A 和 B 之间的关系,您只需要将相应的 id 添加到您的两个变量中

当您现在需要查询与此 A1 相关的所有 B 时,您可以像这样进行查询:

SELECT * FROM B where AIds = 'A1'

对于所有与此 B1 相关的 A,您的操作类似:

SELECT * FROM A where BIds = 'B1'

更新:
更改了对来自 dragonx 的建议的查询

于 2013-06-28T19:15:33.950 回答
1

python ReferenceProperty 本质上存储了另一个实体的键。这类似于在 Go 中使用 Key 字段。

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

fmt.Println.MKO 以便宜的方式提供了答案,除了查询比他建议的更简单,它实际上应该是:

SELECT * FROM B where AIds = 'A1'

此方法受限于每个实体的索引条目数以及实体大小。因此,AId 或 BId 列表会将实体的数量限制为 20000 或更少。

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

于 2013-06-28T19:31:56.747 回答