考虑以下关于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')
我怀疑:数据是否会在同一个分区上才能进行批处理?
答案 0 :(得分:2)
分区位于表中,而不是跨表。但是,数据的标记用于标识哪些副本将托管数据,它基于分区键(主键中的第一列,或者括号中包围的第一列。)
在您的情况下,'用户'的分区键是(tpe, id)
,user_by_username
是(tpe, username)
。因此,数据的令牌可能不一样。
如果user
的主要键为(tpe, id)
,user_by_username
(tpe, username)
,则每个案例的分区键为{{1}因此,授予tpe
是相同的,令牌将是相同的,因此数据将存储在相同的副本上。
在任何情况下,我都不建议批处理操作一起更新tpe
和user_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
。