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

Does Google Cloud Spanner support arbitrary many-to-many relationships?

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

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

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

编辑:

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

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

Cloud Spanner supports 全方位的连接(内、交叉、完整、左、右)。它允许您创建和查询多对多关系,就像在标准 SQL 数据库中一样。

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

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

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

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

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

编辑:回应

I can see how to model this to get relatively efficient queries, but I don't see how I would safeguard the system from inconsistencies, i.e. having a Following that references an User that has been deleted.

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

Also, in this situation I can't for instance have a Many2 be cascade-deleted because its reference in Many1 has been deleted, right? The only cascade delete I can do in this case is if I delete a whole Parent.

是的,没错。

Cloud Spanner 现在支持外键。

参考文献: