Google Cloud Spanner 是不是支持任意多对多关系?

Posted

技术标签:

【中文标题】Google Cloud Spanner 是不是支持任意多对多关系?【英文标题】:Does Google Cloud Spanner support arbitrary many-to-many relationships?Google Cloud Spanner 是否支持任意多对多关系? 【发布时间】:2017-08-13 12:48:06 【问题描述】:

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

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

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

编辑:

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

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

【问题讨论】:

【参考方案1】:

Cloud Spanner supports 全范围的连接(内、交叉、全、左、右)。它让您可以像在标准 SQL 数据库中一样创建和查询多对多关系。

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

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

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

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

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

编辑:回复

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

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

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

是的,没错。

【讨论】:

您好,非常感谢您的回答!但是在我的情况下,拥有一个父交错表并没有太大帮助......它更多的是手动优化拆分的方法。我将使用有关我的具体案例的更多详细信息来编辑我的问题。此外,在这种情况下,例如,我不能将 Many2 级联删除,因为它在 Many1 中的引用已被删除,对吧?在这种情况下,我唯一能做的级联删除就是删除整个父级。【参考方案2】:

Cloud Spanner 现在支持外键。

参考资料:

https://cloud.google.com/spanner/docs/foreign-keys/overview https://cloud.google.com/spanner/docs/foreign-keys/how-to

【讨论】:

以上是关于Google Cloud Spanner 是不是支持任意多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Spanner 是不是支持任意多对多关系?

Google Cloud Spanner 中的自动增量

Google Cloud Firestore 与 Google Cloud Spanner 的区别?

Google Cloud Spanner 和 Cloud SQL 有啥区别?

如何有效地与多个线程并行查询 google-cloud-spanner?

无法在 Spring Data Cloud Spanner 中将 java.sql.Timestamp 转换为 com.google.cloud.Timestamp