如何设计table这种请求?

How to design table about such kind of request?

我正在尝试使用 Cassandra 作为消息系统的数据库。我将所有消息保存到一个 table 中,该 table 保存了我稍后将查询的所有必需数据。 现在我有一个请求,我必须显示用户最近 10 个聊天室的最新 100 条消息。聊天室需要按上次访问时间排序

我计划创建一个 table 让我持续 10 个聊天室并按他们的访问时间排序。

但是我想不出怎么设计table。我目前通过创建 table 和

来执行此类请求

用户,聊天室,access_time。并使用 (user, chatroom) 作为主键。

然后我每次收到消息时都会更新 access_time。 所以我可能会有这样的table

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 中进行排序的好方法。 Table 有更好的设计吗? 一般来说,聊天室不应该是一个大名单。所以即使我自己排序,排序时间应该也不是问题。

谢谢~~

埃里克

我确实尝试了 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

看来我还需要额外的过滤才能得到我想要的。 那么..是否有一种简单的方法来进行我想要的过滤?

在 Cassandra 中,您几乎总是对数据进行非规范化处理以适合您的查询。对于您的问题,只需跟踪访问时间,例如:

cqlsh:demo> create table room_access ( user text, when timestamp, room text, primary key (user, when) ) WITH CLUSTERING ORDER BY (when DESC);

table 的唯一目的是跟踪每个用户的最后访问时间。注意聚类列和降序:

让我们插入一些数据:

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');

现在您可以select最后十个房间:

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>