如何使用 Cassandra 对我的数据进行版本控制?

How can I version my data with Cassandra?

我想使用 Cassandra 的键值对功能。到目前为止,我一直在使用 Kyotocabinet,但它不支持多次写入,因此,我想使用 Cassandra 对我的表格数据进行版本控制。

Roll No, Name, Age, Sex
14BCE1008, Aviral, 22, Male
14BCE1007, Shantanu, 22, Male

以上数据为表格格式(csv)。这是版本 1。 接下来是版本 2:

Roll No, Name, Age, Sex
14BCE1008, Aviral, 22, Male
14BCE1007, Shantanu, 22, Male
14BCE1209, Piyush, 22, Male

因此,我将上述版本称为版本 2,具有以下差异: insert_patch14BCE1209 作为键(PK),14BCE1209, Piyush, 22, Male 作为值。 我熟悉 table 的创建,但无法弄清楚版本控制部分。

如果您使用复合主键而不是包含一个字段的主键,则 table 中有多个版本的数据。

因此 table 定义可能如下所示(如果您 "know" 插入数据之前的版本号):

create table test( 
  id text,
  version int,
  payload text,
  primary key (id, version)
) with clustering order by (version desc);

并将数据插入为:

insert into test (id, version, payload) values ('14BCE1209', 1, '....');
insert into test (id, version, payload) values ('14BCE1209', 2, '....');

到 select 给定键的最新值,您可以使用 LIMIT 1:

SELECT * from test where id = '14BCE1209' LIMIT 1;

所有分区的 select 最新版本(不推荐,仅作为示例 - 需要一种特殊的方法来进行有效处理):

SELECT * from test PER PARTITION LIMIT 1;

但这仅适用于您提前知道版本的情况。如果您不知道,那么您可以使用 timeuuid 类型代替 int:

create table test( 
  id text,
  version timeuuid,
  payload text,
  primary key (id, version)
) with clustering order by (version desc);

并将数据插入为(而不是 now(),您可以使用代码生成的当前时间戳):

insert into test (id, version, payload) values ('14BCE1209', now(), '....');
insert into test (id, version, payload) values ('14BCE1209', now(), '....');

和 select 将与上述相同...