Как моделировать данные в Кассандре, чтобы избежать бесполезного дублирования - PullRequest
1 голос
/ 02 апреля 2019

Я настраиваю новую услугу , которая управляет некоторыми платежными транзакциями . У меня четыре варианта использования :

  1. Чтение последних 10 транзакций.
  2. Прочитать последнюю транзакцию дня.
  3. Считать последние 10 транзакций по номеру карты
  4. Чтение последних 10 транзакций, выполненных с определенным устройством (например, идентификатор устройства «device01»).

Для достижения этой цели я создал три таблицы:

CREATE TABLE test.transaction_by_device (
uid  uuid ,
device text,
time timestamp,
amount double, 
currency text, 
cardNumber text,
PRIMARY KEY ((device),time)
) WITH CLUSTERING ORDER BY (time DESC);


CREATE TABLE test.transaction_by_cardNumber (
uid  uuid ,
device text,
time timestamp,
amount double, 
currency text, 
cardNumber text,  
PRIMARY KEY ((cardNumber),time)
) WITH CLUSTERING ORDER BY (time DESC);

CREATE TABLE test.transaction_by_time (
uid  uuid ,
device text,
year text,
month text,
day text,
time timestamp,
amount double, 
currency text, 
cardNumber text, 
PRIMARY KEY ((year,month,day),time)
) WITH CLUSTERING ORDER BY (time DESC);

Я использовал следующие запросы:

const select_last_10_transactions_by_time =
    'SELECT * FROM test.transaction_by_time LIMIT 10';
const select_last_10_transactions_of_the_day_by_time =
    "SELECT * FROM test.transaction_by_time WHERE YEAR='2019' AND MONTH='2' AND DAY='22'";
const select_last_10_transactions_by_cardNumber =
    "SELECT * FROM test.transaction_by_cardNumber where cardNumber='4242800217402773' LIMIT 10";
const select_last_10_transactions_by_device =
    "SELECT * FROM test.transaction_by_device where device='device01' ";

Все работает очень хорошо, и время выбора для 1 миллиона строк составляет около 0,5 с

Проблема заключается в том, что каждые данные дублируются в каждой таблице. Что я делаю не так с моделированием данных в этих случаях использования?

Есть ли лучший способ оптимизировать эти запросы / таблицы?

Я читал кое-что о материализованном представлении , но я также читал, что он не готов к производству.

Источник ссылки

Спасибо.

1 Ответ

1 голос
/ 03 апреля 2019

Проблема в том, что все данные дублируются в каждой таблице. Что я делаю не так с моделированием данных в этих случаях использования?

Вы не делаете это неправильно, вы делаете это правильно. Дисковое пространство, как правило, намного дешевле, чем попытки распределенных объединений. Особенно крошечные данные, как это. Если что-то не так, я бы беспокоился о том, чтобы ваши разделы для одной карты или устройства становились слишком большими, поскольку они практически не ограничены. Что делать, если клиент настраивает транзакцию с устройства каждую секунду? Через месяц или год с этим будет немного сложно работать.

...