数据模型:多个主键的Cassandra表



我需要Cassandra表的数据模型来满足以下要求。

注意:这对于加入两个 kafka 主题很有帮助,并且任何 kafka 中的任何一个都发生了更新,两者都将以非规范化格式反映在 Cassandra 表中

create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)      
);

insert into stackoverflow_composite (key_part_one, key_part_two, data) 
VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) 
VALUES ('ronaldo', 10, 'ex-football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) 
VALUES ('ronaldo', 11, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo |            9 |    football player
ronaldo |           10 | ex-football player

按照我们的要求,主键的任何一个值都是相同的,应该被更新插入。

insert into stackoverflow_composite (key_part_one, key_part_two, data) 
VALUES ('Messi', 10, 'ex-football player');

基于第二个主键

cqlsh:key1> select * from stackoverflow_composite ;
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo |            9 |    football player
Messi   |           10 | ex-football player

基于第二个第一个主键

insert into stackoverflow_composite (key_part_one, key_part_two, data) 
VALUES ('Messi', 12, 'ex-football player');
cqlsh:key1> select * from stackoverflow_composite ;
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo |            9 |    football player
Messi   |           12 | ex-football player

这是一个有点复杂的解决方案(因为您的要求也很复杂(。

首先,您需要使主键仅key_part_one一列。

create table stackoverflow_composite ( key_part_one text, key_part_two int, data text, PRIMARY KEY(key_part_one) );

在插入之前,先执行尝试查找key_part_two的查询,以便能够直接查询此列而不限制partition key(key_part_one( 您必须在此列上创建二级索引:

CREATE INDEX key_part_two_index ON stackoverflow_composite (key_part_two);

然后在插入之前执行如下查询:

select * from stackoverflow_composite where key_part_two = 10;

如果找到返回的任何行,则应执行更新而不是插入,例如,如果要插入行:

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('Messi', 10, 'ex-football player');

相反,您应该更新除key_part_two以外的其余列:

update stackoverflow_composite set key_part_one='Messi', data='ex-football player' where key_part_two=10;

否则,如果没有找到该值key_part_two的行,则应执行正常的插入:

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('Messi', 10, 'ex-football player');

请注意,即使该值 key_part_one 在所有行之前都已存在,也会被此新插入覆盖,因为此列单独构成整行的主键。

此解决方案的缺点是您必须执行两个查询而不是一个查询进行插入,并且使用二级索引可能会使您的查询变慢。若要提高二级索引的性能,请尝试选择基数不是很高(非重复值过多(的列,因此您必须在key_part_one和key_part_two之间做出选择,哪一个是新的主键,哪一个是用于创建二级索引的列。

最新更新