好的,我想我找到了一种更有效的方法。它需要更多的工作应用程序端,但它可以工作并允许删除,无论对源进行更改。
只是为了再次定义问题:
- 我们有 2 个相互引用的实体。示例 - 用户和其他用户。用户关注其他用户,其他用户被用户关注。
- 我们想要水平存储相关实体。所以我们有一个 CF UserFollowers,它在每一行中存储用户的所有关注者。
- 我们还有逆向 CF UserFollowing 来存储该用户关注的所有用户。
- 我们实际存储的是每个关注或关注用户的列,其中名称是由 firstname:lastname:uuid 组成的键,值是用户的紧凑 json。
- 现在,通过对名称进行范围查询,获得关注者或关注用户已经很容易了。
- 然而,从任一列表中删除用户更加棘手,因为我们需要使用存储的原始密钥发送删除消息。
示例:如果 sam:jones:safg8sdfg 跟随 abe:maxwell:fh2497h9 我们将拥有 -
in UserFollowers: fh2497h9 | sam:jones:safg8sdfg<json for sam>
and in UserFollowing: safg8sdfg | abe:maxwell:fh2497h9<json for abe>
如果 sam 将他的名字更改为 sammy 并尝试取消关注 abe,它将不起作用,因为当实际存储的列是 sam:jones:safg8sdfg 时,删除消息现在将尝试删除 UserFollowers 中名为 sammy:jones:safg8sdfg 的列。
所以我对此的解决方案是在每一侧存储一个带有存储 json 的 reverseKey,以便每一侧都知道在另一侧实际存储了什么密钥,并可以使用它从那里删除自己。
它看起来像:
in UserFollowers: fh2497h9 | sam:jones:safg8sdfg<json for sam.. reversKey:abe:maxwell:fh2497h9>
and in UserFollowing: safg8sdfg | abe:maxwell:fh2497h9<json for abe..reverseKey:sam:jones:safg8sdfg>
现在当 sam 想要从他的追随者中删除 abe 时,他可以使用 reverseKey:sam:jones:safg8sdfg 将自己从 abes 追随者列表中删除。
每个人都很高兴。