在cassandra宽行中存储和删除

时间:2012-08-23 10:21:17

标签: cassandra

我正在使用cassandra作为博客应用。我的一个列系列用于存储用户的所有关注者 - UserFollowers。其中每一行都是用户,列是由firstname + lastname + uuid组成的关注者的排序键。复合键是这样我可以搜索关注者的范围并为它们分页。

示例 - 用户A的关注者看起来像:

A |约翰:2f432t3 |山姆:f242fg |乔:f24gf24

到目前为止,一切顺利。当我添加一个追随者,他落入他的分类的地方,我可以搜索和检索,但我喜欢。但现在山姆决定不再是追随者,我需要删除他。而且 - 就在那之前,山姆改名为塞缪尔,所以我现在发送的删除信息是塞缪尔:f242fg。将找不到该值,并且列sam:f242fg将保留。

我现在唯一的解决方案是,当我想要删除时,我必须拉出整行。只能通过他的身份找到山姆。获取最初存储的密钥并将其删除。对于拥有众多粉丝的人而言效率非常低,并且取决于这些类型的删除不会发生很多。

那里有更好的策略吗?

感谢 或

2 个答案:

答案 0 :(得分:1)

我建议如下:

  1. 将UserFollowers上的密钥更改为代表用户的ID。
  2. 添加包含该用户名称的“名称”列。
  3. 不是存储关注者的名字,而是存储他们的ID。
  4. 所以你的数据现在看起来像这样:

    f1341df | name: george | 2f432t3 | f242fg | f24gf24
    2f432t3 | name: john | f242fg | f1341df
    
    ... etc
    

    现在,您可以通过首先查询用户并获取ID列表,然后在单个查询中对所有这些键进行多次获取来获取关注者名称列表。如果用户更改了他们的名字,这不会破坏您的模型。

答案 1 :(得分:0)

好吧我想我已经找到了一种更有效率的方法。它需要更多的工作应用程序端,但它可以工作,并允许删除,无论对源的更改。

再次定义问题:

  1. 我们有2个相互引用的实体。示例 - 用户和其他用户。用户关注其他用户,其他用户跟随用户。
  2. 我们希望水平存储相关实体。所以我们有一个CF UserFollowers,它在每一行都存储了用户的所有关注者。
  3. 我们还有反向CF UserFollowing存储该用户所关注的所有用户。
  4. 我们实际存储的是每个后续或后续用户的列,其中名称是由firstname:lastname:uuid组成的键,值是用户的紧凑json。
  5. 现在,通过名称范围查询,获取关注者或关注用户非常容易。
  6. 从其中一个列表中删除用户比较棘手,因为我们需要发送一条删除邮件,其中包含已存储的原始密钥。
  7. 例子:如果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关注者列表中删除。

    每个人都很开心。