社交媒体在 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_id
和 liker_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_time
table?
在社交网络中,您应该显示喜欢 post 的用户列表,通常您必须按 like_time DESC
排序喜欢,因为您要按喜欢排序like_time
您需要将 like_time
作为聚类键才能按时间对喜欢进行排序。
那为什么我们还有post_likes
table呢?
在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
。
假设有一个社交网络,这里有一个 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_id
和 liker_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_time
table?
在社交网络中,您应该显示喜欢 post 的用户列表,通常您必须按 like_time DESC
排序喜欢,因为您要按喜欢排序like_time
您需要将 like_time
作为聚类键才能按时间对喜欢进行排序。
那为什么我们还有post_likes
table呢?
在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
。