社交媒体在 Cassandra 中的相似和不同数据模型

Social media's like and unlike data model in Cassandra

假设有一个社交网络,这里有一个 table 用于存储喜欢(最喜欢的)动作,而不像从这个 table 中删除:

CREATE TABLE IF NOT EXISTS post_likes(
  post_id timeuuid,
  liker_id uuid, //liker user_id
    like_time timestamp,
    PRIMARY KEY ((post_id) ,liker_id, like_time)
) WITH CLUSTERING ORDER BY (like_time DESC);

上面的 table 在 Cassandra 中有问题,因为当 liker_id 是第一个 clustering_key 时,我们不能按第二个聚类键 like_time 排序。

我们需要按 like_time 对 table 的数据进行排序,当用户想要查看谁喜欢这个 post 时我们会使用它,我们会显示喜欢那个的人列表post 按时间排序 (like_time DESC)

我们还需要删除(不像),我们又需要 post_idliker_id

你有什么建议?我们如何将 table 按 like_time 排序?

经过更多的研究,我找到了这个解决方案: 选择正确的数据模型是使用 Cassandra 最困难的部分,这是我们在 Cassandra 中找到的 likes tables 的解决方案,首先,我不得不说 Cassandra 的 read and write 路径非常快,你不必担心在 Cassandra 的 table 上写入,您需要围绕查询 建模 并且 请记住,数据重复是可以的。您的许多 table 可能会重复相同的数据。 并且不要忘记 将数据均匀分布在群集周围 尽量减少数量读取的分区数

由于我们使用的是 NoSQL 的 Cassandra,我们知道 NoSQL 中的规则之一是非规范化,我们必须对数据进行非规范化,只考虑您想要的查询;这里对于类似table的数据建模我们会有两个table,这些table主要侧重于易读或更容易说我们侧重于查询我们想要 :

CREATE TABLE IF NOT EXISTS post_likes(
    post_id timeuuid,
    liker_id uuid, //liker user_id
    like_time timestamp,
    PRIMARY KEY ((post_id) ,liker_id)
);

CREATE TABLE IF NOT EXISTS post_likes_by_time(
    post_id timeuuid,
    liker_id uuid, //liker user_id
    like_time timestamp,
    PRIMARY KEY ((post_id), like_time, liker_id)
) WITH CLUSTERING ORDER BY (like_time DESC);

当用户喜欢 post 时,我们只需插入上面的两个 tables.


为什么我们有post_likes_by_timetable?

在社交网络中,您应该显示喜欢 post 的用户列表,通常您必须按 like_time DESC 排序喜欢,因为您要按喜欢排序like_time 您需要将 like_time 作为聚类键才能按时间对喜欢进行排序。

那为什么我们还有post_likestable呢?

post_likes_by_time中,我们的聚簇键是like_time,我们还需要去掉一个赞!当聚类键为 like_time 时,我们无法在 table 中对数据进行排序。这就是为什么我们还有 post_likes table

为什么你不能只拥有一个 table 并在其上进行排序和删除这两项操作?

要从 post_likes table 中删除一个赞,我们需要提供 user_id(此处为 liker_id)和 post_id(一起)并在 post_likes_by_time 我们有 like_time 作为聚类键,我们需要按 like_time 对 table 进行排序,那么它应该是第一个聚类键,第二个聚类键可以是 liker_id ,这就是重点! like_time 是第一个聚类键,然后通过 liker_id 选择或删除您还需要提供 like_time,但大多数时候您没有 like_time