4

这应该可以通过外键实现,但我正在浏览文档,但我似乎无法在其中找到任何关于外键的信息。

看起来 Cloud Spanner 支持的唯一一种关系是交错表关系......但老实说,像 MongoDB 这样的 NoSQL 文档存储已经提供了这么多。

您将如何在 Cloud Spanner 中实现多对多关系?

编辑:

在我的具体情况下,我想要一个类似于 Twitter 关注者的功能,而“关注”是一个用户与另一个用户的直接关系。

我可以看到如何对此进行建模以获得相对有效的查询,但我看不到如何保护系统免受不一致的影响,即拥有一个引用已删除用户的关注。

4

2 回答 2

4

Cloud Spanner支持全范围的连接(Inner、Cross、Full、Left、Right)。它使您可以像在标准 SQL 数据库中一样创建和查询多对多关系。

但是,仅仅因为您可以进行这些查询,并不意味着它们将是有效的。如果您的查询需要跨拆分读取和写入,那么您的查询性能将会变慢,因为它需要协调对多个拆分的读取和写入。交错表让您可以更好地控制磁盘上的数据布局,从而提高查询性能。

如果你想创建一个高效的多对多关系,你可以有两个表在一个共享的公共键上与父表交错:例如

Parent key = account_id
-- Many 1 key = account_id, user_id
-- Many 2 key = account_id, group_id

这将使您能够进行只需要触及单个拆分的查询,使它们保持快速、高效且无冲突。

Cloud Spanner 也有一个数组类型,根据您的用例,它也可能会有所帮助。

编辑:回应

我可以看到如何对此进行建模以获得相对有效的查询,但我看不到如何保护系统免受不一致的影响,即拥有一个引用已删除用户的关注。

您可以删除同一帐户中的所有关注者记录删除突变作为事务中的两个单独查询,或者设置后台作业以在后台清理它。

此外,在这种情况下,例如,我不能将 Many2 级联删除,因为它在 Many1 中的引用已被删除,对吧?在这种情况下,我唯一能做的级联删除就是删除整个父级。

对,那是正确的。

于 2017-03-21T20:18:24.190 回答
0

Cloud Spanner 现在支持外键。

参考:

于 2020-05-07T19:46:36.313 回答