database - 如何在 Cassandra 中按上次更新日期对数据进行排序?
问题描述
我需要建议以正确设计 Cassandra 中的表格。我需要得到所有书籍的排序列表。排序按上次更新日期执行。每次购买特定书籍时,number_of_buyers
都会更新该列。另外,我需要更新updated_at
列的值。问题是updated_at
列clustering key
是primary 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);
每个聊天室都有最新消息。这些信息总是在变化。如果发生变化,我想将聊天室放在列表的顶部。许多信使的经典行为。
解决方案
所以可以肯定;您将需要对不同的东西进行分区。诀窍是在避免未绑定分区增长的同时找到查询灵活性(您显然需要)的正确平衡。
对于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_at
,book_id
最后使用 (为了唯一性)。然后,INSERT
每个销售事件都有一个新行。在查询中(插入几行后),在使用 on子句时使用MAX
聚合on 。updated_at
GROUP BY
book_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。
这个解决方案绝对不是完整的,但我希望它能引导你朝着正确的方向前进。
推荐阅读
- javascript - HTML/CSS:出现滚动条时获取不同的 offsetWidth 值
- subquery - 选择多个字段不在子查询中的位置(不包括连接)
- presto - Presto 如何收集运行时内存?
- c++ - 我想在终端窗口中运行我的 CLion 程序
- java - Android Studio - Firebase 在尝试签署 facebook 或 google 时返回 null
- sql - 如何在配置单元中从特定日期到今天的日期获取一组不同的月份值
- java - 如何在多线程环境中使用 JedisPool 创建多个 Jedis 实例
- unity3d - 将单独的图像上传到预制件的每个孩子
- hadoop - 在安装在 edgenode 上的 hive 上工作时出错
- flutter - firebase_database 在线/离线状态