给定 cassandra 模式的优缺点

Posted

技术标签:

【中文标题】给定 cassandra 模式的优缺点【英文标题】:Pros and cons of given cassandra schema 【发布时间】:2016-08-06 01:00:37 【问题描述】:

我有这个架构可以将 post 及其评论一起存储在同一个表中:

CREATE TABLE post ( 
  post_id int,
  access_key text,
  comment_id int,
  title text,
  comments FROZEN <type_comment>,
  PRIMARY KEY ((post_id, access_key), comment_id)
);

CREATE TYPE ks_test.type_comment (
  id int,
  content text
);

这是一个示例数据

post_id | access_key | comment_id | comments                 | title
---------+------------+------------+--------------------------+--------------
       1 | about_post |          1 |                     null | this is post
       1 |   comments |          2 | id: 2, content: 'cmn1' |         null
       1 |   comments |          3 | id: 3, content: 'cmn2' |         null
       1 |   comments |          4 | id: 4, content: 'cmn3' |         null

我正在使用此架构,因此我只需访问一个表即可获得post 及其注释。这种模式的优缺点是什么?

【问题讨论】:

【参考方案1】:

真的很好,如果你能弄清楚如何填写 id 字段,那就可以了。

我认为type_comment 中的comment_idid 是多余的。可以用content 替换整个comments 列。

我个人会将 post_id 替换为时间 uuid,因为 Cassandra 中没有自动递增的事物 id。在分布式环境中自动递增全局唯一标识符很困难。有一些事情可以为你做,但实际上,只使用时间 uuid/随机 uuid 是最简单的。

CREATE TABLE post ( 
  post_id uuid,
  access_key text,
  comment_id timeuuid,
  title text,
  content text,
  PRIMARY KEY ((post_id, access_key), comment_id)
);

如果想按日期抓取它可以做类似的事情

CREATE TABLE post ( 
  year int,
  month int,
  access_key text,
  comment_id timeuuid,
  title text,
  content text,
  PRIMARY KEY ((access_key, year, month), comment_id)
);

然后您可以按月抓取,也可以使用范围在该月的时段内抓取。也可以制作一个“time_bucket”来将年/月替换为 iso 时间字符串,例如“2016-01-01 00:00:00”,这样您可以更轻松地更改分桶(即月、日等)。

【讨论】:

我想知道的是?正如您在输出中看到的那样,在某些行中会有null 列值,所以我的记录数会增加那些null 值也会增加。有问题吗? 只有分区/集群键需要设置(不提供其他的物化视图/索引),其他的不存在意味着更少的磁盘空间使用。 您认为这种模式方法的优缺点是什么? PROs - 它可以很好地工作和分区数据。缺点 - 需要一些尴尬的 id 生成并且有一些冗余数据(但磁盘空间很便宜所以 meh)。 如果所有分区或集群键的值相同,有什么区别吗?

以上是关于给定 cassandra 模式的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 中的手动压缩

EMR LinkageError 上的 Spark + Cassandra

在 Cassandra 数据库中编写存储过程

国内哪些互联网公司使用了 Cassandra 数据库?

Cassandra 是不是支持聚合功能或 Map Reduce 等任何其他功能?

从 MySQL 切换到 Cassandra - 优点/缺点?