1

想象有一个社交网络,这里有一个用于存储喜欢(最喜欢)动作的表,与从该表中删除不同的是:

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);

上表在 Cassandra 中存在问题,因为什么时候liker_id是第一个clustering_key,我们不能按第二个聚类键排序like_time

我们需要对我们的表格数据进行排序like_time,当用户想要查看谁喜欢这篇文章时我们会使用它,并且我们会显示按时间排序的喜欢该帖子的人列表( like_time DESC)

我们还需要删除(不像),我们再次需要拥有post_idliker_id

你的建议是什么?我们如何对该表进行排序like_time

4

1 回答 1

1

经过更多的研究,我发现了这个解决方案: 选择正确的数据模型是使用 Cassandra 最难的部分,这里是我们在 Cassandra 中找到的喜欢表的解决方案,首先,我不得不说 Cassandra 的读写路径令人惊讶速度很快,而且您不必担心在 Cassandra 的表上进行书写,您需要围绕查询建模记住,数据重复是可以的。您的许多表可能会重复相同的数据。并且不要忘记将数据均匀地分布在集群周围最小化读取的分区数量

由于我们使用的是 NoSQL 的 Cassandra,我们知道 NoSQL 中的规则之一是非规范化,我们必须对数据进行非规范化,然后只考虑您想要的查询;这里对于like 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_likes_by_time桌子?

在社交网络中,您应该显示喜欢帖子的用户列表,通常您必须按 对喜欢进行排序,like_time DESC并且由于您要对喜欢进行排序,like_time因此您需要具有like_time聚类键才能对喜欢进行排序时间。

那为什么我们也有post_likes桌子呢?

在 中post_likes_by_time,我们的聚类键是like_time,我们还需要去掉一个like!当聚类键为like_time时,当我们对表中的数据进行排序时,我们不能这样做。这就是我们也有post_likes桌子的原因

为什么你不能只拥有一张桌子并同时执行排序和删除操作?

要从post_likes表中删除一个like,我们需要提供user_id(这里liker_id)和post_id(together),并且post_likes_by_time我们有like_time作为集群键并且我们需要对表进行排序like_time,那么它应该是第一个集群键,第二个集群键可以是liker_id,并且这就是重点! like_time是第一个聚类键,然后用于选择或删除,liker_id您还需要提供,但大多数时候like_time您没有。like_time

于 2016-06-14T18:42:07.190 回答