Как мне отсортировать данные по дате последнего обновления в 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.

Это решение определенно не является полным как есть, но я надеюсь, что оно приведет вас в правильном направлении.

Другие вопросы по тегам