很显然,当处理与某些自然分区键(例如传感器ID)相关的时间序列数据时,它可以用作主键。但是,如果我们对全局视图感兴趣并且没有自然的分区键候选者该怎么办?如果我们像这样对模式建模:
CREATE TABLE my_data(
year smallint,
day smallint,
date timestamp,
value text
PRIMARY KEY ((year, day), timestamp)
) WITH CLUSTERING ORDER BY (date DESC);
(可能)在大多数情况下都可以正常工作,但是鉴于我们知道要提取的年份和日期。
如果我们不在乎今天是什么日子,但我们希望看到前50个最新物品怎么办?如果我们接下来要看下50个项目怎么办?卡桑德拉(Cassandra)有办法吗?建议这样做的方法是什么?
答案 0 :(得分:1)
保留年/日的第二张表。阅读时可以先抓住它。当添加到my_data时,也会进行更新,但要保留插入天的缓存,因此每个应用程序每天只能尝试插入一次。例如,添加额外的键,以便每个时间序列可以有多个流,而不仅仅是一个表:
CREATE TABLE my_data (
key blob,
year smallint,
day smallint,
date timestamp,
value text
PRIMARY KEY ((key, year, day), timestamp)
) WITH CLUSTERING ORDER BY (date DESC);
CREATE TABLE my_data_keys (
key blob,
year smallint,
day smallint,
PRIMARY KEY ((key), year, day)
)
对于插入物:
INSERT INTO my_data_keys (key, year, day) VALUES (0x01, 1, 2)
INSERT INTO my_data ...
然后在内存中设置一个存储键/年/数据的位置,这样就不必每次都插入它。要阅读最新内容:
SELECT year, day FROM my_data_keys WHERE key = 0x01;
驱动程序返回迭代器,对其中的每个元素进行查询,直到达到50条记录为止。
如果插入足够频繁,则可以从“今天”开始倒退,发出查询直到获得50个事件。如果数据稀疏,则可能会浪费大量的读取数据,而另一个表的性能会更好。