我需要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之间做出选择,哪一个是新的主键,哪一个是用于创建二级索引的列。