我正在使用cassandra作为博客应用。我的一个列系列用于存储用户的所有关注者 - UserFollowers。其中每一行都是用户,列是由firstname + lastname + uuid组成的关注者的排序键。复合键是这样我可以搜索关注者的范围并为它们分页。
示例 - 用户A的关注者看起来像:
A |约翰:2f432t3 |山姆:f242fg |乔:f24gf24
到目前为止,一切顺利。当我添加一个追随者,他落入他的分类的地方,我可以搜索和检索,但我喜欢。但现在山姆决定不再是追随者,我需要删除他。而且 - 就在那之前,山姆改名为塞缪尔,所以我现在发送的删除信息是塞缪尔:f242fg。将找不到该值,并且列sam:f242fg将保留。我现在唯一的解决方案是,当我想要删除时,我必须拉出整行。只能通过他的身份找到山姆。获取最初存储的密钥并将其删除。对于拥有众多粉丝的人而言效率非常低,并且取决于这些类型的删除不会发生很多。
那里有更好的策略吗?
感谢 或
答案 0 :(得分:1)
我建议如下:
所以你的数据现在看起来像这样:
f1341df | name: george | 2f432t3 | f242fg | f24gf24
2f432t3 | name: john | f242fg | f1341df
... etc
现在,您可以通过首先查询用户并获取ID列表,然后在单个查询中对所有这些键进行多次获取来获取关注者名称列表。如果用户更改了他们的名字,这不会破坏您的模型。
答案 1 :(得分:0)
好吧我想我已经找到了一种更有效率的方法。它需要更多的工作应用程序端,但它可以工作,并允许删除,无论对源的更改。
再次定义问题:
例子:如果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它将无法工作,因为删除消息现在将尝试删除UserFollowers中名为sammy的列:jones:safg8sdfg当存储的实际列为sam: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关注者列表中删除。
每个人都很开心。