【问题标题】:Need schema suggestion in cassandra在 cassandra 中需要模式建议
【发布时间】:2015-08-29 19:18:52
【问题描述】:

这是我的桌子:

create table user
(
userId uuid primary key,
name text
)

create table comment_by_post
(
postId uuid,
cmntId timeuuid,
cmntTxt text,
cmntBy uuid,
primary key (postId, cmntId)
)

create table post_likes
(
postId uuid,
userId uuid,
primary key (postId, userId)
)

这里我有几个问题

  1. 我如何知道用户评论了comment_by_post 表中的帖子?

  2. 如何在 cmets 下订单。

  3. post_likes表中订购帖子喜欢

  4. 如果用户被删除,它应该从所有表中删除给定用户 ID 的所有条目。

要运行这些查询,我必须对架构进行哪些更改?

【问题讨论】:

  • 3.在 post_likes 表中排序帖子喜欢,根据什么排序?
  • 基于时间我的意思是它被用户喜欢的顺序。我想翻页

标签: cassandra cql cql3 datastax-java-driver cqlsh


【解决方案1】:

在 Cassandra 中,通常每个查询需要一个表。因此,请查看您的 select 语句并开始创建表。

  1. 我如何知道用户对 comment_by_post 表中的帖子发表了评论?
create table comment_by_post_user
(
    postId uuid,
    userId uuid,
    cmntId timeuuid,
    cmntTxt text,
    cmntBy uuid,
    primary key (postId, userId,commentId)
    )

    select * from comment_by_post_user where postId = <> and userId = <>;
  1. 如何在 cmets 下订单。
create table comment_by_post
(
    postId uuid,
    userId uuid,
    cmntId timeuuid,
    cmntTxt text,
    cmntBy uuid,
    primary key (postId,commentId)
    ) WITH CLUSTERING ORDER BY (commentId) desc;

    select * from comment_by_post where postId = in_postId limit 10;

这将为您提供该帖子的最新 10 个 cmets。

  1. 在 post_likes 表中排序帖子喜欢
create table post_likes
(
postId uuid,
liked_at timstamp,
userId uuid,
primary key (postId, liked_at)
) WITH CLUSTERING ORDER BY (liked_at) desc;

select * from post_likes limit 10;
  1. 如果用户被删除,它应该从所有表中删除给定用户 ID 的所有条目。

这是不可能的。要从表中删除,您需要知道整个 PRIMARY KEY。

一种解决方案是创建另一个表,其中 userId 作为 PRIMARY KEY,其他表的 PRIMARY KEY 作为该表的列。

create table user
(
userId uuid primary key,
postId uuid,
cmntId timeuuid
)

【讨论】:

  • 我认为不需要WITH CLUSTERING ORDER BY (commentId) desc; 作为commentid id timeuuid 所以它的默认排序在ASC 顺序
  • @Manish,你是对的,默认情况下它按 ASC 顺序排序,在这种情况下你不需要 WITH CLUSTERING 子句。如果您尝试获取最新的 cmets,则将其按 DESC 顺序排序会得到更快的结果。
  • 告诉我一些事情,如果想知道all comment by a user,那么我是否必须使用primary key(userid, postid, comentid) 创建一个单独的表,这就是cql 模式定义的方式,即为每个目的创建单独的表并保留相同的数据在不同的表中避免跨表查询?
  • 真的好吗??因为如果你想更新你将不得不在多个地方更新相同的数据
  • 没错。我们做更多的工作来插入数据以获得针对读取进行优化的表。
猜你喜欢
  • 2014-11-01
  • 2015-11-16
  • 2013-11-26
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2017-10-06
  • 2014-03-30
相关资源
最近更新 更多