【问题标题】:storing and deleting in cassandra wide row在 cassandra 宽行中存储和删除
【发布时间】:2012-08-24 01:26:06
【问题描述】:

我正在将 cassandra 用于博客应用程序。我的列族之一是用于存储用户的所有关注者 - UserFollowers。其中每一行是一个用户,列是由 firstname+lastname+uuid 组成的关注者的排序键。复合键是这样我可以搜索关注者的范围并为他们提供分页服务。

示例 - 用户 A 的关注者如下所示:

一个 |约翰:2f432t3 |山姆:f242fg |乔:f24gf24

到目前为止一切都很好。当我添加一个追随者时,他会落入他的分类位置,我可以随意搜索和检索。但现在山姆决定不再做追随者,我需要删除他。此外 - 就在此之前,sam 将他的名字改为 samuel,所以我现在发送的删除消息是 samuel:f242fg。将找不到该值,并且 sam:f242fg 列将保留。

我现在唯一的解决方案是,当我想删除时,我必须拉出整行。仅通过他的 id 找到 sam。获取最初存储的密钥并将其删除。对于有很多追随者的人来说效率非常低,并且依赖于这些类型的移除不会发生很多。

有更好的策略吗?

谢谢 或

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    我建议如下:

    1. 将您在 UserFollowers 上的键更改为代表用户的 ID。
    2. 添加包含该用户名称的“名称”列。
    3. 与其存储关注者的姓名,不如存储他们的 ID。

    所以你的数据现在看起来像这样:

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

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

    【讨论】:

    • 我担心每次获取多个关注者或拉出整个关注者列表将是一个有很多关注者的繁重操作。所以我想要一种方法来对关注者进行范围查询。因此 name:uuid 在列名中。从那里开始出现问题..
    【解决方案2】:

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

    只是为了再次定义问题:

    1. 我们有 2 个相互引用的实体。示例 - 用户和其他用户。用户关注其他用户,其他用户被用户关注。
    2. 我们希望横向存储相关实体。所以我们有一个 CF UserFollowers,它在每一行中存储用户的所有关注者。
    3. 我们还在逆向 CF UserFollowing 中存储该用户关注的所有用户。
    4. 我们实际存储的是每个关注或关注用户的列,其中名称是由 firstname:lastname:uuid 组成的键,值是用户的紧凑 json。
    5. 现在通过对名称进行范围查询很容易获得关注者或关注用户。
    6. 然而,从任一列表中删除用户更加棘手,因为我们需要使用存储的原始密钥发送删除消息。

    示例:如果 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 追随者列表中删除。

    每个人都很开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2018-07-09
      • 2020-04-11
      • 1970-01-01
      • 2021-02-25
      • 2020-12-11
      • 2014-02-03
      相关资源
      最近更新 更多