经过更多的研究,我发现了这个解决方案:
选择正确的数据模型是使用 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