Пакетная вставка в несколько таблиц с использованием операций модели DataStax в Cassandra

Следуя совету DataStax "использовать примерно одну таблицу для каждого шаблона запроса", как упоминалось здесь, я настроил одну и ту же таблицу дважды, но с разными ключами для оптимизации времени чтения.

-- This table supports queries that filter on specific first_ids and a gt/lt filter on time
CREATE TABLE IF NOT EXISTS table_by_first_Id
(
    first_id  INT,
    time      TIMESTAMP,
    second_id INT,
    value     FLOAT,
    PRIMARY KEY (first_id, time, second_id)
);

-- Same table, but rearranged to filter on specific second_ids and the same gt/lt time filter
CREATE TABLE IF NOT EXISTS table_by_second_Id
(
    second_id INT,
    time      TIMESTAMP,
    first_id  INT,
    value     FLOAT,
    PRIMARY KEY (second_id, time, first_id)
);

Затем я создал 2 модели, используя драйвер Python DataStax, по одной для каждой таблицы.

class ModelByFirstId (...)
class ModelBySecondId (...)

Эта проблема

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

def insert_some_data(...):
    ModelByFirstId.create(...)
    ModelBySecondId.create(...)

Я ищу, есть ли альтернативный способ гарантировать, что вставка в одну таблицу отражается в другой - возможно, в определении модели или таблицы, чтобы, надеюсь, защитить от ошибочных вставок только в одну из моделей.

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

1 ответ

Базы данных NoSQL, специально созданные для обеспечения высокой доступности и устойчивости к разделам (AP of CAP), не предназначены для обеспечения высокой ссылочной целостности. Скорее они предназначены для обеспечения высокой пропускной способности и низкой задержки чтения и записи. Сама Cassandra не имеет понятия ссылочной целостности между таблицами. Но ищите LWT (легкие транзакции) и концепцию пакетов для вашего варианта использования.

Пожалуйста, найдите хороший материал для чтения:

https://www.oreilly.com/content/cassandra-data-modeling/

https://docs.datastax.com/en/cql-oss/3.3/cql/cql_using/useBatch.html

Специально для вашего варианта использования попробуйте использовать модель данных с одной таблицей ниже:

CREATE TABLE IF NOT EXISTS table_by_Id
(
    primary_id INT,
    secondary_id INT,
    time      TIMESTAMP,
    value     FLOAT,
    PRIMARY KEY (primary_id ,secondary_id ,time)
);

для каждой входной записи вы можете создать две записи в таблице, одну с первым идентификатором как primary_id (second_id и secondary_id), а во вторую запись с second_id как primary_id (и first_id как secondary_id). Теперь используйте пакетные вставки (как указано в документации выше. Возможно, это не лучшее решение вашей проблемы, но подумайте об этом.

Другие вопросы по тегам