Как мне отсортировать данные по дате последнего обновления в 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);
В каждой чат-комнате есть последнее сообщение. Эта информация постоянно меняется. В случае изменения я хочу поместить чат-комнату вверху списка. Классическое поведение во многих мессенджерах.
1 ответ
Так что точно; вам нужно будет разделить на что-то другое. Уловка состоит в том, чтобы найти правильный баланс гибкости запросов (ваша очевидная потребность здесь), избегая при этом несвязанного роста секций.
Для
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
новая строка для каждого события распродажи. В запросе (после вставки нескольких строк) используйте
MAX
агрегирование на
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.
Это решение определенно не является полным как есть, но я надеюсь, что оно приведет вас в правильном направлении.