如果我使用复合键,数据会在同一分区吗?

时间:2016-07-08 00:12:30

标签: database cassandra batch-processing

考虑以下关于Cassandra数据库的情况:我必须执行包含一些相关数据的批处理语句,例如:table users和table users_by_username。我想在两个表上插入用户创建数据。这是一笔交易。在Cassandra文档中,批处理语句无法访问多个分区。如果我将主键建模为复合键,如下所示:

CREATE TABLE IF NOT EXISTS user(
  id text,
  tpe text,
  username text,
  PRIMARY KEY((tpe, id))
);

CREATE TABLE IF NOT EXISTS user_by_username(
  username text,
  tpe text,
  id text,
  PRIMARY KEY((tpe, username))
);

行示例:

用户:(' 1','用户',' lucasrpb') user_by_username :(' lucasrpb','用户',' 1')

我怀疑:数据是否会在同一个分区上才能进行批处理?

1 个答案:

答案 0 :(得分:2)

分区位于表中,而不是跨表。但是,数据的标记用于标识哪些副本将托管数据,它基于分区键(主键中的第一列,或者括号中包围的第一列。)

在您的情况下,'用户'的分区键是(tpe, id)user_by_username(tpe, username)。因此,数据的令牌可能不一样。

如果user主要键为(tpe, id)user_by_username (tpe, username),则每个案例的分区键为{{1}因此,授予tpe是相同的,令牌将是相同的,因此数据将存储在相同的副本上。

在任何情况下,我都不建议批处理操作一起更新tpeuser_by_username,但在分区键与较少C *相同的情况下,它会更好需要在批处理中写入节点。

由于您的表之间的唯一区别是您的主键,因此如果您使用的是3.0+版本,我认为对您来说是一个很好的选择,那就是研究3.0中引入的materialized views。有了这个,您可以设置user表格的user_by_username视图,如:

user

这样您只需对CREATE MATERIALIZED VIEW user_by_username AS SELECT * FROM users WHERE username IS NOT NULL PRIMARY KEY ((tpe, username)); 进行更改,然后将其传播到user