当前位置: 首页 > 知识库问答 >
问题:

数据模型:多主键的Cassandra表

晏富
2023-03-14

请针对以下需求对Cassandra表的数据模型给出一些建议/想法。我不确定这是否可以实现。如果可以实现,我们就不需要编写外部程序

注意:这有助于连接两个Kafka主题和任何更新发生在任何一个Kafka,两者将反映在非ormalized格式在卡桑德拉表

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

共有1个答案

萧辰沛
2023-03-14

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

首先,您需要使主键只有一列key_part_one

创建表stackoverflow_composite(key_part_one text,key_part_two int,data text,PRIMARY KEY(key_part_one));

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

从stackoverflow_composite中选择*,其中key_part_two=10;

如果您发现返回了任何行,则应该执行更新而不是插入,例如,如果您想插入一行:

插入stackoverflow_composite(key_part_one,key_part_two,data)值('messice',10,'ex-football player');

请注意,即使key_part_one的值在此之前已经存在,所有行也将被这个新的insert覆盖,因为此列单独构成了整行的主键。

这种解决方案的缺点是,您必须执行两个查询来进行插入,而不是一个,并且使用辅助索引可能会使查询变慢。为了提高辅助索引的性能,请尝试选择一个基数不是很高的列(太多不同的值),因此必须在key_part_one和key_part_two之间选择哪一个作为新的主键,哪一个作为用于创建辅助索引的列。

 类似资料:
  • 我是Cassandra数据建模的新手,如果可能的话,我需要在单行中容纳多维数据(是的,我知道Cassandra是柱状存储)。我的示例数据集(试图简化我的用例,忍受我的格式化) 时间戳、交易id、项目代码、用户id、支付方式 20130304221518,abcd,3,6,信用卡 20130304221519,efgh,4,5,现金配送 20130305180402,ijkl,4,5,现金交付 例如

  • 主要内容:群集,键空间,Cassandra数据模型规则,数据建模目标Cassandra中的数据模型与RDBMS中正常情况完全不同。 我们来看看Cassandra如何存储数据。 群集 Cassandra数据库分布在运行的几(多)台机器上。 最外层的容器被称为包含不同节点的群集。 每个节点都包含一个副本,如果发生故障,副本将负责顶上。 Cassandra将节点以环形格式排列在群集中,并为其分配数据。 键空间 键空间(Keyspace)是Cassandra中数据的最外层

  • 表1: 表1的键和数据大小: 我的分区密钥为enterprise_id+campaign_id。每个企业可以有几个活动。datastore可能有几百个活动的数据。每个活动可以有多达200万-300万的记录。因此,在100个企业中可能有3000个分区,每个分区有2-3个miilion记录。 Cassandra查询:查询始终使用分区键+主键直到日期时间。订阅id包含在主键中,以保持每个记录的唯一性,因

  • 我正在研究一个用于存储时间序列的卡桑德拉数据模型(我是卡桑德拉新手)。我有两个应用程序:日内股票数据和传感器数据。 库存数据将以一分钟的时间分辨率保存。七个数据字段构建一个时间框架:符号、日期时间、开盘、高位、低位、收盘、成交量 我将主要通过符号和日期来查询数据。例如,给我2013年1月1日到2013年1月31日之间按日期时间排序的AAPL的所有数据。cassandra查询的建议是查询整列。所以你

  • 主要内容:集合类型,用户定义的数据类型:CQL提供了丰富的内置数据类型,包括集合类型。 除了这些数据类型,用户还可以创建自己的自定义数据类型。 下表提供了CQL中可用的内置数据类型的列表。 数据类型 常量 说明 ascii strings 表示ASCII字符串 bigint bigint 表示64位有符号long类型 blob blobs 表示任意字节 Boolean booleans 表示真或假 counter integers 表示

  • 主要内容:Cassandra自动数据到期Cassandra支持不同类型的数据类型。 下面来看看看下表中的不同数据类型: CQL 常量 描述 asci Strings US-ascii字符串 bigint Integers 64-bit有符号long blob blobs 任意十六进制字节 boolean Booleans True 或 False counter Integers 为64位分布式计数器值 decimal Integers