我需要在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);每个聊天室都有最新消息。这些信息总是在变化。如果有变化,我想把聊天室放在列表的最上面。许多信使中的经典行为。
发布于 2020-10-05 22:33:43
因此,可以肯定的是,您需要在不同的分区上进行分区。诀窍是找到查询灵活性(您在这里的明显需求)之间的适当平衡,同时避免未绑定的分区增长。
对于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);对于主键定义,我们可以在category上进行分区,然后在book_name和updated_at上进行集群,最后使用book_id (为了唯一性)。然后,为每个销售事件INSERT一个新行。在查询上(插入几行之后),在updated_at上使用MAX聚合,同时在book_name上使用GROUP BY子句。
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。
这个解决方案肯定不是完整的,但我希望它能引导您朝着正确的方向前进。
https://stackoverflow.com/questions/64153341
复制相似问题