我正在努力思考如何在 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 的建议的查询
茅侃侃
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 实体。这会更昂贵,但突破了实体大小限制。
- 2 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消