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

Would data be in the same partition if I use composite keys ?

考虑以下有关 Cassandra 数据库的情况:我必须对一些相关数据执行批处理语句,例如:table 用户和 table users_by_username。我想在两个 table 上插入用户创建数据。这是一个交易。在 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', 'users', 'lucasrpb') user_by_username: ('lucasrpb', 'users', '1')

我的疑惑:数据在同一个分区上可以做批处理吗?

分区在 table 内,而不是跨越 table。但是,数据的 token 是基于 partition 键(主键,或括号中的第一列)。

在您的例子中,'user' 的 partition 键是 (tpe, id)user_by_username(tpe, username)。因此,数据的标记可能会不同。

如果 user 键是 (tpe, id)user_by_username (tpe, username),则每种情况的分区键将是 tpe,因此授予 tpe 是相同的,令牌将是相同的,因此数据将存储在相同的副本上。

在任何情况下,我都不建议将 user_by_usernameuser 一起更新的批处理操作,但在分区键与 less C* 相同的情况下会更好需要批量写入节点

因为你的 table 之间的唯一区别是你的主键,如果你使用的是 3.0+ 版本,我认为你的一个很好的选择是查看引入的 materialized views在 3.0.有了这个,您可以在 user table 之外设置一个 user_by_username 视图,例如:

CREATE MATERIALIZED VIEW user_by_username AS 
SELECT * FROM users 
WHERE username IS NOT NULL
PRIMARY KEY ((tpe, username));

这样您只需对 user 进行更改,然后会为您传播到 user_by_username