为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪4524236 2021-06-10 18:01:40
我正在努力思考如何在 Go 编程语言中表示 AppEngine 数据存储中的多对多关系。我更习惯于传统的关系数据库。我的系统中有两种类型的实体。让我们称他们为A和B。每个A实体都与一定数量的B实体相关。同样,每个B实体都与其他一些A实体相关。我希望能够有效地查询B给定A实体的所有实体,以及A给定B实体的所有实体。在 Python SDK 中,似乎有一种方法可以记录实体中的字段可以是ReferenceProperty引用其他实体的 s。但是,我在 Go 的 AppEngine SDK 中找不到类似的东西。Go 似乎只是使用 basicstruct来表示实体。处理这个问题的最佳做法是什么?
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

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

在你的结构 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 的建议的查询


查看完整回答
反对 回复 2021-06-21
?
茅侃侃

TA贡献1842条经验 获得超21个赞

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

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

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

SELECT * FROM B where AIds = 'A1'

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

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


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信