我正在尝试使用Cassandra作为消息系统的数据库。我将所有消息保存到一个表中,该表保存了稍后我将查询的所有必需数据。 现在我有一个请求,我必须显示用户最新的10个聊天室最新的100条消息。聊天室需要按照持续访问时间进行排序。
我计划创建一个表格,让我可以获得10个聊天室,并按访问时间排序。
但我无法弄清楚如何设计表格。我目前通过使用
创建表来执行此类请求用户,聊天室,access_time。并使用(用户,聊天室)作为主键。
然后我每次收到消息时都会更新access_time。 所以我可能有这样的表
user chatroom time
1 2 1005
2 1 1000
1 3 1003
1 4 1004.
我很容易将用户1的列表作为
1, 2, 1005,
1, 3, 1003,
1, 4, 1004.
我自己重新订购并获得了
1, 3, 1003.
1, 4, 1004.
1, 2, 1005.
这就是我需要的最新结果。我需要[3,4,2]作为最终结果。 但我无法弄清楚如何在Cassandra中进行排序部分的好方法。 表有更好的设计吗? 一般来说,聊天室不应该是一个大清单。因此,即使我自己排序,排序时间也不应该成为问题。
谢谢~~
埃里克
我确实尝试过Mandraenke的评论。但我的意见如下:
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_4');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_4');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_4');
INSERT INTO room_access (user, when, room) VALUES ( 'demo4', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo5', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo7', toTimeStamp(now()), 'room_4');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo8', toTimeStamp(now()), 'room_5');
INSERT INTO room_access (user, when, room) VALUES ( 'demo9', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_7');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo5', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo7', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo7', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_5');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_8');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo5', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_4');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo7', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo4', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo6', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_1');
INSERT INTO room_access (user, when, room) VALUES ( 'demo1', toTimeStamp(now()), 'room_3');
INSERT INTO room_access (user, when, room) VALUES ( 'demo2', toTimeStamp(now()), 'room_2');
INSERT INTO room_access (user, when, room) VALUES ( 'demo3', toTimeStamp(now()), 'room_1');
我的查询结果:
select * from room_access where user='demo1';
将是
user | when | room
-------+---------------------------------+--------
demo1 | 2018-01-01 18:17:27.886000+0000 | room_3
demo1 | 2018-01-01 18:17:27.865000+0000 | room_1
demo1 | 2018-01-01 18:17:27.850000+0000 | room_2
demo1 | 2018-01-01 18:17:27.831000+0000 | room_2
demo1 | 2018-01-01 18:17:27.738000+0000 | room_1
demo1 | 2018-01-01 18:17:27.594000+0000 | room_2
demo1 | 2018-01-01 18:17:27.556000+0000 | room_1
demo1 | 2018-01-01 18:17:27.513000+0000 | room_1
demo1 | 2018-01-01 18:17:27.456000+0000 | room_8
demo1 | 2018-01-01 18:17:27.430000+0000 | room_1
demo1 | 2018-01-01 18:17:27.404000+0000 | room_3
demo1 | 2018-01-01 18:17:27.386000+0000 | room_1
demo1 | 2018-01-01 18:17:27.202000+0000 | room_7
demo1 | 2018-01-01 18:17:27.136000+0000 | room_3
demo1 | 2018-01-01 18:17:27.088000+0000 | room_4
demo1 | 2018-01-01 18:17:27.020000+0000 | room_2
demo1 | 2018-01-01 18:17:26.964000+0000 | room_2
demo1 | 2018-01-01 18:17:26.947000+0000 | room_1
demo1 | 2018-01-01 18:14:47.267000+0000 | room_1
访问时间经常修改,实际结果将超过数千条记录(样本中只有19条记录。)但我想要的实际结果是
user | when | room
-------+---------------------------------+--------
demo1 | 2018-01-01 18:17:27.886000+0000 | room_3
demo1 | 2018-01-01 18:17:27.865000+0000 | room_1
demo1 | 2018-01-01 18:17:27.850000+0000 | room_2
demo1 | 2018-01-01 18:17:27.456000+0000 | room_8
demo1 | 2018-01-01 18:17:27.202000+0000 | room_7
demo1 | 2018-01-01 18:17:27.088000+0000 | room_4
似乎我仍然需要额外的过滤来获得我想要的东西。 那么......有一个简单的方法来做我想要的过滤吗?
答案 0 :(得分:2)
在Cassandra中,您几乎总是对数据进行非规范化以适合您的查询。对于您的问题,只需跟踪访问时间,例如:
cqlsh:demo> create table room_access ( user text, when timestamp, room text, primary key (user, when) ) WITH CLUSTERING ORDER BY (when DESC);
该表的唯一目的是跟踪每个用户的上次访问时间。请注意聚类列和降序:
让我们插入一些数据:
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_a');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_b');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_c');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_d');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_e');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_f');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_g');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_h');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_i');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_j');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_k');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_l');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_b');
cqlsh:demo> INSERT INTO room_access (user, when, room) VALUES ( 'demo', toTimeStamp(now()), 'room_a');
现在您可以选择最后十个房间:
cqlsh:demo> SELECT room FROM room_access WHERE user='demo' limit 10;
room
--------
room_a
room_b
room_l
room_k
room_j
room_i
room_h
room_g
room_f
room_e
(10 rows)
cqlsh:demo>