如果我使用复合键,数据会在同一个分区中吗?
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_username
和 user
一起更新的批处理操作,但在分区键与 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
。
考虑以下有关 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_username
和 user
一起更新的批处理操作,但在分区键与 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
。