Cassandra 数据建模分区键

Posted

技术标签:

【中文标题】Cassandra 数据建模分区键【英文标题】:Cassandra data modelling partition key 【发布时间】:2018-09-26 05:38:56 【问题描述】:

我的项目在 cassandra 中有两个表。

create table IF NOT EXISTS post_by_user
(topic_id varchar, 
post_id UUID,
title varchar, 
post_body varchar, 
user_id varchar,  
view_count int,
date_created date,
primary key (user_id, post_id))
WITH CLUSTERING ORDER BY (post_id DESC);



create table IF NOT EXISTS post_by_topic
(topic_id varchar, 
post_id UUID,
title varchar, 
post_body varchar, 
user_id varchar,  
view_count int,
date_created date,
primary key (topic_id, post_id))
WITH CLUSTERING ORDER BY (post_id DESC);

现在我想为基于 view_count 的热门帖子创建一个表格。 由于可能有多个主题和用户,表的分区键应该是什么?物化视图有没有可能?

还有一种方法可以让分区键保持恒定值。

请建议...

【问题讨论】:

【参考方案1】:

在您上面的一张表上创建具体化视图并不能帮助您计算总体上浏览量最高的帖子。例如,如果我们在post_by_user 上创建一个物化视图,如下所示,我们只能计算每个用户的 top-post:

CREATE MATERIALIZED VIEW toppostforuser AS
   SELECT post_id FROM post_by_user
   WHERE post_id IS NOT NULL AND user_id IS NOT NULL AND view_count IS NOT NULL AND date_created IS NOT NULL
   PRIMARY KEY (user_id, post_id, view_count, date_created)
   WITH CLUSTERING ORDER BY (view_count desc);

您需要一个分区键等于post_id 的表,在该表上可以创建物化视图来计算总体顶视图。

注意:如果您将date_created 拆分为单独的列,例如yearmonthday,您还可以计算每日热门帖子、每月热门帖子等.

CREATE MATERIALIZED VIEW dailytoppostforuser AS
   SELECT post_id FROM post_by_user
   WHERE post_id IS NOT NULL AND user_id IS NOT NULL AND view_count IS NOT NULL AND year IS NOT NULL AND month IS NOT NULL AND day IS NOT NULL
   PRIMARY KEY ((user_id, year, month, day), post_id, view_count)
   WITH CLUSTERING ORDER BY (view_count desc);

参考:Materialized views in Cassandra

【讨论】:

这在 cassandra 中不起作用....如果您将 post_id 作为分区键,则排序没有意义..因为 post_ids 是唯一的。如果没有 post_id 和 user_id,您将无法根据 view_count 获取记录 我的初始回答中似乎混淆了 post-id 和 user-id。已经编辑过了。在当前的物化视图中,您只需要用户 ID 即可获取该用户的热门帖子。

以上是关于Cassandra 数据建模分区键的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra分页和令牌功能;选择分区键

Cassandra表定义/分区/建模

使用键和索引进行 Cassandra 建模

cassandra 中的数据建模和查询

Cassandra 中的数据建模冲突

具有非规范化的 cassandra 数据建模