当我阅读有关分片的内容时,看起来作者没有考虑到分片表必须连接到的其他表(即使他们将分片描述为“原始数据库的子集”)。但是,这是一种非常常见的情况,我仍然不知道如何处理。一些作者提到了由可复制到每个分片(例如Country)的分片表引用的“静态”表。但是,他们没有提及引用分片表的表。
想象一下,我们运行一个社交网络并意识到我们的User表(id, name)不再适合单个服务器,因为写入量或大小(或两者)。所以我们决定将它水平分割成多个分片(比如 4,所以 id 1-1000 的用户转到一个分片,1001-2000 转到另一个分片等)并选择User.id作为分片键。由于用户表通常连接到其他表,我们将记录从引用给定用户或由它引用的表移动到相应的分片(这是一个很大的挑战,因为关系通常是可传递的,例如,表 A 可能引用 B 引用分片表C)。为了简化事情,我们可以决定将除 User 表之外的所有表完整复制到所有分片。到现在为止还挺好。
然后,想象Friends表(id, user_id,friend_id)包含有关谁是谁的朋友并引用User表的信息。用户 1001 有 2 个朋友,2002 和 3003,他们位于不同的分片上。所以如果我们需要获取用户 1001 个朋友的信息,我们将不得不执行 2 次跨分片连接。即使我们最初设法将所有相关用户放在同一个分片上,用户也可以从不同的分片添加新朋友。我们不能将这个朋友 4004 移动到用户 1001,因为来自同一分片 #5 的其他用户也可以将他作为朋友。
老实说,我无法弄清楚在执行分片时如何处理这种情况,而且我还没有看到任何资源对此进行解释。