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

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

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

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

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


慕田峪4524236
浏览 158回答 2
2回答

BIG阳

根据您查询的方式,您可以执行以下操作:在你的结构 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 的建议的查询

茅侃侃

python ReferenceProperty 本质上存储另一个实体的键。这类似于在 Go 中使用 Key 字段。至少有两种方法可以解决您的问题。一种存储有限数量引用的廉价方式,以及一种用于较大数据集的昂贵方式。fmt.Println.MKO 提供了廉价方式的答案,除了查询比他建议的更简单之外,它实际上应该是:SELECT * FROM B where AIds = 'A1'此方法仅限于每个实体的索引条目数以及实体大小。因此,Aid 或 BId 列表会将实体数量限制为 20000 或更少。如果您有大量数据,您可能需要一个映射实体来表示给定 A 和 B 实体之间的 M2M 关系。它只包含一个 A 的键和一个 B 的键。然后您将查询地图实体,然后获取您需要的相应 A 或 B 实体。这会更昂贵,但突破了实体大小限制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go