这应该可以使用外键,但我正在浏览文档,但我似乎无法找到任何有关外键的内容。
看起来Cloud Spanner支持的唯一关系就是交错表关系......但老实说,像MongoDB这样的NoSQL文档存储已经提供了这么多。
您如何在Cloud Spanner中实现多对多关系?
编辑:
在我的特定情况下,我想要一个类似于Twitter的粉丝的功能,而“跟随”是从一个用户到另一个用户的有向关系。
我可以看到如何对此进行建模以获得相对有效的查询,但我不知道如何保护系统免于出现不一致,即有一个引用已被删除的用户的跟踪。
答案 0 :(得分:4)
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中的引用已被删除,对吧?在这种情况下我唯一可以做的级联删除是删除整个Parent。
是的,这是对的。