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

Я проектирую схему для следующего варианта использования:

  1. Объект, который мы хотим сохранить в БД, содержит 3 атрибута (тип, имя, идентификатор).
  2. Убедитесь, что комбинация (тип, имя) уникальна.
  3. Убедитесь, что идентификатор уникален.
  4. Найдите строку по (типу, имени).
  5. Найти строку по идентификатору.
  6. Вывести список всех строк данного типа.
  7. удалить строку по ее (типу, имени).
  8. Обновить имя строки.После обновления тип и идентификатор не должны изменяться, а имя должно оставаться уникальным, т. Е. Тип и имя не могут быть обновлены.
  9. Создать строку по типу, имени и идентификатору.
  10. Все запросы на создание / получение / список / обновление / удаление могут приходить с разных узлов.В пределах одного и того же узла запрос может поступать от другого сервиса.Количество узлов меньше 1000.
  11. Количество строк относительно невелико (наихудший случай 12000, обычно намного меньше 1000), и большинство операций - get / list.Производительность чтения не важна.

Я пробовал:

  1. Мы пробовали PRIMARY KEY (тип, имя).В этом случае функция 8 невозможна, так как имя является частью первичного ключа и, следовательно, не может быть обновлено.
  2. Мы использовали только PRIMARY KEY (тип, ID) или (ID).Кассандра не позволяет накладывать уникальные ограничения на столбцы.

    i.Если я читаю, а затем пишу, между двумя операциями могут возникнуть потенциальные проблемы.Функция 10 не выполняется.
    ii.Я также смотрел на BATCH-операции, так как он называется атомарным и изолированным на одном разделе.https://docs.datastax.com/en/cql/3.3/cql/cql_using/useBatch.html Однако описание для изоляции «Изоляция гарантирует, что частичная вставка или обновления не будут доступны, пока все операции не будут завершены».отличается от определения изоляции для традиционных БД.Если Cassandra DB блокирует все другие операции чтения / записи, то это хорошо для варианта использования.Если это не так, суть в том, что операция BATCH блокирует все другие операции записи.Может кто-нибудь объяснить фактический уровень изоляции пакетной операции на одном разделе?

  3. Я обнаружил, что поток говорит, что использование MATERIALIZED VIEW может использоваться для обеспечения уникальности вторичного индекса. Можно ли создать уникальный вторичный индекс в Кассандре? .Чтобы убедиться в уникальности (тип, имя), первичным ключом для материализованного представления должен быть (тип, имя), а идентификатор не должен быть его частью.Тогда, если не может быть частью первичного ключа таблицы в соответствии с ограничением: материализованное представление должно «включать все первичные ключи исходной таблицы в первичный ключ материализованного представления».https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateMV.html. Однако, если мы хотим поддерживать функцию 8, имя не может быть частью первичного ключа таблицы.Тогда для этого нет решения.

Я хочу найти решение для всех этих функций, но ни один из моих PoC не отвечает всем требованиям.Если у вас есть идеи по обеспечению уникальности, обеспечению изоляции при записи и / или более эффективные решения и мысли, пожалуйста, оставьте это в комментариях.

...