У меня возникают проблемы с попыткой моделирования моих данных, чтобы я мог эффективно запросить Cassandra для последних 10 (на самом деле) записей, которые были недавно изменены. Каждая запись имеет столбец last_modified_date, который задается приложением при вставке/обновлении записи.
Я исключил столбцы данных из этого примера кода.
Таблица основных данных (содержит только одну строку на запись):
CREATE TABLE record (
record_id int,
last_modified_by text,
last_modified_date timestamp,
PRIMARY KEY (record_id)
);
Решение 1 (сбой)
Я попытался создать отдельную таблицу, в которой использовался порядок ключей кластеризации.
Таблица (одна строка для каждой записи, только вставка последней измененной даты):
CREATE TABLE record_by_last_modified_index (
record_id int,
last_modified_by text,
last_modified_date timestamp,
PRIMARY KEY (record_id, last_modified_date)
) WITH CLUSTERING ORDER BY (last_modified_date DESC);
Query:
SELECT * FROM record_by_last_modified_index LIMIT 10
Это решение не работает, поскольку порядок кластеризации применяется только к упорядочению записей с одним и тем же ключом раздела. Поскольку каждая строка имеет другой ключ раздела (record_id), результаты запроса не включают ожидаемые записи.
Решение 2 (неэффективно)
Другое решение, которое я пробовал, - это просто запросить Cassandra для всех значений record_id и last_modified_date, отсортировать их и выбрать первые 10 записей в моем приложении. Это явно неэффективно и не будет хорошо масштабироваться.
Решение 3
Последнее решение, которое я рассмотрел, использует один и тот же ключ раздела для всех записей и использует порядок кластеризации для обеспечения правильной сортировки записей. Проблема с этим решением заключается в том, что данные не будут правильно разделены по узлам, поскольку все записи будут иметь один и тот же ключ раздела. Это кажется мне не стартером.