时态数据的CQL表设计

时间:2018-07-02 10:30:21

标签: cassandra cql

作为Cassandra的新手,我有一个CQL设计问题。我想重用在使用RDBMS系统之前建立的概念,以创建customerData的历史记录。客户本人只会看到最新版本,因此应该是最快的版本,但是可以查询整个历史记录。

我建议的实体属性:

customerId文本, validFromDate日期, validUntilDate日期, customerData文字

  • customerData的第一次保存仅插入具有validFromDate = NOW和validUntilDate = 31-12-9999的customerData
  • 随后保存的customerData会更改最后一条记录-设置validUntilDate = NOW-并使用validFromDate = NOW和validUntilDate = 31-12-9999插入新的customerData

结果:

  • 通过这种方式查询(customerId,validUntilDate)= {id,31-12-9999)将给出最后保存的版本。
  • 查询(customerId)将提供所有历史记录。
  • 要在特定时间t查询customerData,只需使用带有validFromDate 的查询

我的猜测是PARTITION_KEY = customerId,而CLUSTER_KEY可以是validFromDate。或使用PRIMARY KEY = customerId。或者,我可以创建两个表,一个用于快速查询最新版本(无历史记录),另一个用于历史分析。

您如何以CQL方式设计它?我想我在想太多RDBMish。

1 个答案:

答案 0 :(得分:1)

使用更改时间戳作为按DESC顺序排列的CLUSTERING KEY,例如

   CREATE TABLE customer_data_versions (
    id text,
    change_time timestamp,
    name text,
    PRIMARY KEY (id, change_time)
) WITH CLUSTERING ORDER BY ( change_time DESC );

它将允许您按降序存储每个客户ID的数据版本。

为同一个ID插入两个版本:

INSERT INTO customer_data_versions (id, change_time, name) VALUES ('id1', totimestamp(now()),'John'); 
INSERT INTO customer_data_versions (id, change_time, name) VALUES ('id1', totimestamp(now()),'John Doe'); 

获取上次保存的版本:

SELECT * FROM customer_data_versions WHERE id='id1' LIMIT 1;

获取ID的所有版本:

SELECT * FROM customer_data_versions WHERE id='id1';

获取日期之间的版本:

SELECT * FROM customer_data_versions WHERE id='id1' AND change_time <= before_date AND change_time >= after_date;

请注意,有some limits for partition size(每个客户ID可以存储多少版本):

  

一个分区中的单元:〜20亿(231);单列值大小:2 GB(建议1 MB)