Пакетная вставка в несколько таблиц с использованием операций модели 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). Теперь используйте пакетные вставки (как указано в документации выше. Возможно, это не лучшее решение вашей проблемы, но подумайте об этом.