0

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

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

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

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

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

有什么更好的策略吗?

谢谢或

4

2 回答 2

1

我建议如下:

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

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

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

... etc

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

于 2012-08-23T13:42:54.290 回答
0

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

只是为了再次定义问题:

  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,它将不起作用,因为当实际存储的列是 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 追随者列表中删除。

每个人都很高兴。

于 2012-08-23T13:55:40.417 回答