В настоящее время я работаю в чате и хочу разбить на страницы сообщения данной темы. Я таблица Кассандры, которая выглядит следующим образом:
CREATE TABLE messages (
ID uuid,
...
CreatedAt timestamp,
...
ThreadID varchar,
Bucket int,
...,
PRIMARY KEY ((ThreadID, Bucket, SentAt), ID)
) WITH CLUSTERING ORDER BY (ID DESC);
Подход состоит в том, чтобы сообщения были разделены по ThreadID и Bucket (чтобы каждый раздел получал максимум 100k сообщений) и по дате SentAt (для разбивки на страницы). Я также использую идентификатор в своем первичном ключе, чтобы ЗАКАЗАТЬ мое сообщение во время вставки. Если я не прав, пожалуйста, исправьте меня
Я получил этот подход по обеим ссылкам:
(Отказ от ответственности: следующий код только для чтения, пока ничего не разработано)
Если я сделаю запрос с использованием SELECT token(ThreadID, Bucket, SentAt),... FROM Messages WHERE token(ThreadID, Bucket, SentAt) < token('5e139304b842595704c01da0', 3, '2020-01-06 21:00:23 +0000');
, какое будет окончательное поведение?
- Будет ли это работать, если я буду использовать UUID вместо BigInt в качестве типа идентификатора?
- Является ли факт упорядочения сообщений по идентификатору на самом деле ускоряющим чтение части?
- Исходя из некоторых правил, значение Bucket может быть увеличено на 1. Будет ли сначала сопоставляться маркерный подход с использованием
< token(..., 3, date)
дата (по убыванию), затем ведро?
Спасибо за ваше разъяснение!
РЕДАКТИРОВАТЬ Пример, чтобы сделать его более понятным
id | threadid | bucketid | sentat
-----+----------+----------+---------------------------------
xxxx | A | 1 | 2020-01-06 21:00:23 +0000
xxxx | A | 1 | 2020-01-06 21:22:21 +0000
xxxx | A | 1 | 2020-01-06 23:00:00 +0000
.... | ....... | ........ | .........................
xxxx | A | 2 | 2020-01-07 01:23:50 +0000
.... | ....... | ........ | .........................
.... | ....... | ........ | .........................
xxxA | A | 3 | 2020-01-07 18:30:49 +0000
xxxB | A | 3 | 2020-01-07 18:30:55 +0000
.... | ....... | ........ | .........................
Вот моя таблица ( абстрактно конечно). Каждые X сообщений, BucketID увеличивается (скажем, каждые ~ 100k новых сообщений). Мое последнее возвращенное сообщение - это сообщение xxxA . Отсюда я хочу разбить на страницы еще 10 сообщений. Использование идентификатора корзины помогло бы мне разбивать страницы только на разделы моей таблицы (раздел 3 на данный момент). Однако, если я не могу получить сообщения, мне нужно уменьшить BucketID во время выполнения запроса и повторить попытку.
Итак, мне нужен подход с двойным токеном для моего предложения WHERE? Поскольку сначала мне нужно, чтобы токен (ThreadID, BucketID) был (A, 3), но в то же время я хочу получить первые 10 результатов до (старше) указанного токена (ThreadID, SentAt) (A, 2020-01-07 18:30:49 +0000)
Спасибо!