我目前正在尝试为具有两个时间戳的列系列建模,以指定某个条目在给定日期(通常是执行时间)是否有效(或“活动”)。
传统SQL,64 GB RAM和一些索引没有大问题,我们经常使用我们的SQL服务器这样做。
但是,在CQL中,我还没有设法为这种情况建模并为其编写有效的查询。
我的基本模型是(我跳过了PK定义!)
create table myTable(
id uuid,
validFrom timeuuid,
validTo timeuuid,
someInformationalData varChar
);
一些解释:
我尝试了各种分区/群集密钥组合,但它们都没有产生有效的CQL
-- only active results
select *
from
myTable
where
validFrom < now()
and
validTo > now()
我对NoSQL / CQL世界很陌生,并且在转换我们的一些应用程序时遇到了一些麻烦。我可以在记忆中做到这一点,但我担心,这可能会在某些时候出现瓶颈......
不确定这种&#39;我不知道我在做什么&#39;大喊大叫是合适的,但任何形式的帮助都会受到赞赏。 :)
编辑以下是我一直在搞乱的方法之一
drop table if exists myTable;
create table myTable(
id int,
datefrom timeuuid,
dateto timeuuid,
someColumns varChar,
primary key((id,datefrom),dateto)
);
create index if not exists my_idx on myTable(datefrom);
insert into myTable(id, datefrom,dateto,somecolumns)
values(0,minTimeuuid('1970-01-01 00:00:00'),minTimeuuid('2020-01-01 00:00:00'),'test');
insert into myTable(id,datefrom,dateto,somecolumns)
values(1,minTimeuuid('1970-01-01 00:00:00'),minTimeuuid('2012-01-01 00:00:00'),'test2');
select * from myTable where dateto > now() allow filtering;
-- invalid ("A column of a partition key can be restricted only if the preceding one is restricted by an Equal relation.")
select * from myTable where datefrom < now() and dateto > now() allow filtering;
第一个查询是限制我的结果,该行包含&#39; validTo = 2012-01-01&#39;被过滤了,但是我无法计算出在where子句中有两个限制的方案。
答案 0 :(得分:1)
如果我了解您的问题,您正在寻找的是一种基于时间戳运行范围查询的方法。基本上,为了能够这样做,您的模型必须将时间戳组件作为群集密钥的一部分:
create table myTable(
eventType uuid,
ts timestamp,
val text,
PRIMARY KEY (eventType, ts)
);
以上内容可让您运行如下搜索:SELECT eventType, val from myTable where eventType = 'your_event' and ts >= 'start_ts' and ts < 'end_ts'
。
您需要记住的是,群集密钥指示磁盘上的顺序,从而可以高效运行上述查询。您可以在CQL spec SELECT section。
中详细了解相关详情答案 1 :(得分:0)
他们就像cassandra中的Now()一样没有任何其他sql数据库。你必须清楚地提到今天的日期而不是现在()..
您可以在where子句中使用您在其中定义为主键或辅助索引的列。