我正在尝试思考如何使用 Go 编程语言在 AppEngine 的数据存储区中表示多对多关系。我更习惯传统的关系数据库。
我的系统中有两种类型的实体。我们称它们为A
和B
。每A
实体与一些 B
相关实体。同样,每个 B
实体与其他编号 A
相关实体。我希望能够有效地查询所有 B
给定 A
的实体实体,并为所有人A
给定 B
的实体实体。
在Python SDK中,似乎有一种方法可以注释实体中的字段可以是 ReferenceProperty
s 引用其他一些实体。但是,我在 Go 的 AppEngine SDK 中找不到类似的东西。 Go似乎只使用基本的struct
s 代表实体。
处理这个问题的最佳实践是什么?
最佳答案
Python ReferenceProperty 本质上存储另一个实体的 key 。这类似于在 Go 中使用 Key 字段。
至少有两种方法可以解决您的问题。存储有限数量引用的廉价方法,以及存储较大数据集的昂贵方法。
fmt.Println.MKO 提供了廉价方式的答案,除了查询比他建议的更简单之外,它实际上应该是:
SELECT * FROM B where AIds = 'A1'
此方法仅限于每个实体的索引条目数以及实体大小。因此,AId 或 BId 列表会将实体数量限制为 20000 或更少。
如果您有大量数据,您可能需要一个映射实体来表示给定 A 和 B 实体之间的 M2M 关系。它只包含 A 的键和 B 的键。然后您将查询 map 实体,然后获取所需的相应 A 或 B 实体。这会更昂贵,但突破了实体大小限制。
关于google-app-engine - 如何在 Go 中的 AppEngine 数据存储区中建立多对多关系模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371244/