【问题标题】:Data Model : Cassandra Table for Multiple Primary key数据模型:多主键的 Cassandra 表
【发布时间】:2019-01-17 10:29:07
【问题描述】:

我需要一个 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

【问题讨论】:

  • 已修改示例:
  • 您能否指定您将对数据模型执行哪些读取查询?在 Cassandra 中,根据您要执行的查询构建模型很重要
  • 感谢您的回复。请查找更多详细信息。考虑 - 表 A 有 3 列。 Col-1、Col-2、Col-3。在不考虑主键的情况下,如果源有任何更新,则表中的所有记录都应更新。 col-1 | col-2 | col-3 -------------- 100 | 11 |蓝色 200 | 11 |蓝色 300 | 11 | Green All col-3 = 'Blue' 应该用 'Red' 更新而不考虑 Key 值
  • 我已经明白这一点了,我的问题是关于你的阅读查询(选择查询)......你要问 Cassandra 什么?
  • 选择查询将基于主键..这不是问题。

标签: cassandra datastax cassandra-3.0 composite-primary-key


【解决方案1】:

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

首先你需要让主键只有一列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) 的情况下直接查询此列,您必须在此列上创建一个secondary index

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 之间进行选择,哪个是新的主键,哪个是新的主键是用于创建二级索引的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 2023-03-27
    • 1970-01-01
    • 2012-09-19
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多