首页 > 解决方案 > 如何在 Cassandra 中按上次更新日期对数据进行排序?

问题描述

我需要建议以正确设计 Cassandra 中的表格。我需要得到所有书籍的排序列表。排序按上次更新日期执行。每次购买特定书籍时,number_of_buyers都会更新该列。另外,我需要更新updated_at列的值。问题是updated_atclustering keyprimary key. 我们无法更新属于主键的列中的值。

create table books (
   book_id uuid,
   created_at timestamp,
   updated_at timestamp,
   book_name varchar,
   book_author varchar,
   number_of_buyers int,
   primary key (book_id, updated_at)
) with clustering order by (updated_at desc);

另一个例子:

create table chat_rooms (
   chat_room_id uuid,
   created_at timestamp,
   updated_at timestamp,
   last_message_content varchar,
   last_message_author varchar,
   unread_messages_number int,
   primary key (chat_room_id, updated_at)
) with clustering order by (updated_at desc);

每个聊天室都有最新消息。这些信息总是在变化。如果发生变化,我想将聊天室放在列表的顶部。许多信使的经典行为。

标签: databasecassandracqlcassandra-3.0amazon-keyspaces

解决方案


所以可以肯定;您将需要对不同的东西进行分区。诀窍是在避免未绑定分区增长的同时找到查询灵活性(您显然需要)的正确平衡。

对于books表,是否可以对类似的东西进行分区category?你知道,像恐怖片、奇幻片、图画小说、非小说类、教学类等等……?

CREATE TABLE book_events (
   book_id uuid,
   created_at timestamp,
   updated_at timestamp,
   book_name varchar,
   book_author varchar,
   number_of_buyers int,
   category text,
   PRIMARY KEY (category, book_name, updated_at, book_id)
) WITH CLUSTERING ORDER BY (book_name ASC,updated_at DESC,book_id ASC);

对于 PRIMARY KEY 定义,我们可以在 上进行分区category,然后在book_name和上进行聚类updated_atbook_id最后使用 (为了唯一性)。然后,INSERT每个销售事件都有一个新行。在查询中(插入几行后),在使用 on子句时使用MAX聚合on 。updated_atGROUP BYbook_name

SELECT book_name,book_author,number_of_buyers,MAX(updated_at) FROm book_events 
 WHERE category='Computers & Technology' GROUP BY book_name;

 book_name                       | book_author                                                | number_of_buyers | system.max(updated_at)
---------------------------------+------------------------------------------------------------+------------------+---------------------------------
  Mastering Apache Cassandra 3.x |                                Aaron Ploetz, Teja Malepati |               52 | 2020-10-05 14:29:33.134000+0000
 Seven NoSQL Databases in a Week | Aaron Ploetz, Devram Kandhare, Brian Wu, Sudarshan Kadambi |              163 | 2020-10-05 14:29:33.142000+0000

(2 rows)

唯一的其他考虑因素是如何处理过时的销售行。当然,您可以随时删除它们,具体取决于写入频率。最佳解决方案是考虑销售节奏,并应用 TTL。

这个解决方案绝对不是完整的,但我希望它能引导你朝着正确的方向前进。


推荐阅读