Я на начальных этапах моделирования данных в Кассандре для приложения.Это приложение имеет существующий реляционный персистентный слой, который должен быть заменен на Cassandra.
Приложение использует таблицу с именем login_log
для пользователей, которая обеспечивает время последнего входа для всех пользователей во всех приложениях.
Вот CQL
, который я использую для создания этой таблицы
create table login_log (
user_id int,
application_name text,
login_date timestamp,
primary key (user_id, application_name, login_date)
) with clustering order by (application_name asc, login_date desc)
user_id
- ключ раздела.application_name
и login_date
- ключи кластеризации.В этой таблице ведется история входов в систему, в ней никогда не удаляются данные.
Я пытаюсь получить дату последнего входа в систему с указанным user_id
для всех приложений в одном запросе.
Если яписали запрос SQL
, чтобы сделать то же самое, это выглядело бы примерно так:
select user_id, application_name, max(login_date) from login_log group by user_id, application_name
Однако это не может быть сделано в Cassandra, так как нет функции группировки по выражениям или агрегации.Возможно, столбцы кластеризации уже сгруппированы, но я не могу создать запрос, который извлекает последние login_date
для всех приложений в одном запросе.
Если бы вы делали это для одного приложения, CQL
выглядело бы как ниже
select * from login_log where user_id = ? and application_name = ? limit 1
Поскольку кластер уже упорядочен по login_date
, order by
не требуется.Мне нужно расширить один и тот же запрос, чтобы получить данные для всех приложений за один раз.
Возможно ли это сделать в Кассандре?Если нет, то есть ли метод моделирования данных, который позволил бы мне сделать это?
Любой намек приветствуется.