Пакетная вставка в несколько таблиц с использованием операций модели DataStax в Cassandra - PullRequest
0 голосов
/ 28 февраля 2020

Следуя совету 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 Ответ

0 голосов
/ 03 марта 2020

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...