Дизайн таблицы CQL для временных данных - PullRequest
0 голосов
/ 02 июля 2018

Как новичок в Cassandra, у меня есть вопрос по дизайну CQL. Я хочу повторно использовать концепцию, которую я создал до использования систем RDBMS, для создания истории для customerData. Клиент сам увидит только самую последнюю версию, поэтому она должна быть самой быстрой, но запросы по всей истории могут быть выполнены.

Мои предлагаемые свойства объекта:

идентификатор клиента, дата validFromDate, дата validUntilDate, Текст данных клиента

  • Сначала сохраните customerData, просто ВСТАВЬТЕ customerData с validFromDate = NOW и validUntilDate = 31-12-9999
  • Последующее сохранение customerData изменяет последнюю запись - установка validUntilDate = NOW - и Устанавливает новые customerData с validFromDate = NOW и validUntilDate = 31-12-9999

Результат:

  • Таким образом, запрос (customerId, validUntilDate) = (id, 31-12-9999) даст последнюю сохраненную версию.
  • Запрос по (customerId) выдаст всю историю.
  • Для запроса customerData в определенное время t просто используйте запрос с validFromDate

Я предполагаю, что PARTITION_KEY = customerId, а CLUSTER_KEY может быть validFromDate. Или используйте PRIMARY KEY = customerId. Или я мог бы создать две таблицы: одну для быстрого запроса последней версии (без истории), а другую для исторического анализа.

Как вы разрабатываете это CQL-способом? Я думаю, что слишком много думаю о RDBMish.

1 Ответ

0 голосов
/ 05 июля 2018

Использовать метку времени изменения как КЛАСТЕРНЫЙ КЛЮЧ в заказе DESC, например,

   CREATE TABLE customer_data_versions (
    id text,
    change_time timestamp,
    name text,
    PRIMARY KEY (id, change_time)
) WITH CLUSTERING ORDER BY ( change_time DESC );

Это позволит вам хранить версии данных по идентификатору клиента в порядке убывания.

Вставьте две версии для одного и того же идентификатора:

INSERT INTO customer_data_versions (id, change_time, name) VALUES ('id1', totimestamp(now()),'John'); 
INSERT INTO customer_data_versions (id, change_time, name) VALUES ('id1', totimestamp(now()),'John Doe'); 

Получить последнюю сохраненную версию:

SELECT * FROM customer_data_versions WHERE id='id1' LIMIT 1;

Получить все версии для идентификатора:

SELECT * FROM customer_data_versions WHERE id='id1';

Получить версии между датами:

SELECT * FROM customer_data_versions WHERE id='id1' AND change_time <= before_date AND change_time >= after_date;

Обратите внимание, что существуют некоторые ограничения для размера раздела (сколько версий вы сможете сохранить для каждого идентификатора клиента):

Ячейки в разделе: ~ 2 миллиарда (231); размер одного столбца: 2 ГБ (рекомендуется 1 МБ)

...