我将无法执行 WHERE user_id = ? ORDER BY timestmp ASC, seq ASC – cassandra 不允许这样做。
您可能会看到一个错误,因为您正在重复 ASC。这应该有效:
WHERE user_id = ? ORDER BY timestmp,seq ASC
此外,只要您将主键定义为PRIMARY KEY((user_id),timestmp,seq)),您甚至不需要指定ORDER BY x[,y] ASC。它将按该顺序对磁盘上的数据进行聚类,从而将其返回给已按该顺序排序的您。 ORDER BY 仅在您希望将结果按降序排列(或与您定义的相反顺序)时才需要。
如果可能发生时间戳冲突怎么办?
我认为您额外的 seq 列应该足够了,具体取决于您计划如何插入数据。如果您从客户端设置timestmp,那么您应该没问题。但是,看看当我(使用你的第二个表)INSERT 行同时以两种不同的方式创建时间戳时会发生什么。
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('Mal',dateof(now()),1,'commanding');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('Wash',dateof(now()),1,'piloting');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River',dateof(now()),1,'freaking out');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River',dateof(now()),3,'being weird');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River',dateof(now()),2,'killing reavers');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River','2015-01-13 13:14-0600',1,'freaking out');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River','2015-01-13 13:14-0600',3,'being weird');
INSERT INTO user_events(user_id,timestmp,seq,event) VALUES ('River','2015-01-13 13:14-0600',2,'killing reavers');
通过“River”的user_id 查询该数据会得到:
aploetz@cqlsh:stackoverflow> SELECT * FROM user_events WHERE user_id='River';
user_id | timestmp | seq | event
---------+--------------------------+-----+-----------------
River | 2015-01-13 13:14:00-0600 | 1 | freaking out
River | 2015-01-13 13:14:00-0600 | 2 | killing reavers
River | 2015-01-13 13:14:00-0600 | 3 | being weird
River | 2015-01-14 12:58:41-0600 | 1 | freaking out
River | 2015-01-14 12:58:57-0600 | 3 | being weird
River | 2015-01-14 12:58:57-0600 | 2 | killing reavers
(6 rows)
请注意,使用now() 函数生成timeuuid,然后将其转换为带有dateof() 的时间戳会导致出现timestmp 为“2015-01-14 12:58:57-0600”的两行是一样的。但它们并不相同,您可以通过seq 列看出这一点。
所以在使用/生成时间戳时要小心一点。它们可能看起来相同,但它们可能不会存储为相同的值。为了安全起见,我会改用 timeuuid。