Использование даты и времени в качестве ключа раздела и ключа кластеризации - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть таблица, в которой хранятся системные действия.Модель данных имеет следующую структуру

CREATE TABLE activities {
  id UUID,
  json text,
  activity_date Date,
  activity_time Timestamp,
  activity_type Text,
  Primary Key(activity_date, activity_type, activity_time)
}

Потенциальные варианты использования, которые будет обслуживать приведенная выше таблица:

  1. Найти события, которые были сгенерированы для данной даты
  2. Найти события, которые были сгенерированы для данной даты и тип_операции
  3. Найти события, которые были сгенерированы для данной даты и типа_действие в течение заданного периода времени.

ВышеМодель данных уязвима для ошибки, когда если в одну и ту же миллисекунду вставляются 2 действия с одинаковым типом активности, одно из них может переопределить другое.Это потому, что casssandra гарантирует уникальность метки времени с точностью до миллисекунды.

Другая таблица в базе данных имела похожую структуру, и мы видели записи, перекрывающие друг друга дважды.Это происходило 2 раза за 2 года.Хотя вероятность мала, но все же возможно испортить целостность данных.

Чтобы обойти эту проблему, мы могли бы потенциально добавить предложение IF NOT EXISTS в запрос на вставку, что приведет к сбою 1 вставки, в то время как другой будет успешным, если такой случай когда-либо возникнет.

Однако я хотел бы понять, что еще здесь можно сделать?

Что еще может предложить Кассандра, чего нам не хватает?

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

1 Ответ

0 голосов
/ 18 февраля 2019

В общем, если у вас могут быть противоречивые метки времени - вы можете пойти и использовать timeuuids вместо меток времени.Они должны быть уникальными, и вы всегда можете получить временные метки от них.

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/timeuuid_functions_r.html

Некоторые другие примечания:

  • Вы используете свой UUID, который вы определили?

  • Вы должны добавить энтропию к своему ключу раздела, возможно ((activity_date, activity_type), activity_time), потому что только наличие activity_date в качестве ключа раздела приведет к горячим точкам

...