0

按照此处提到的 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)
);

然后,我使用 DataStax 的 Python 驱动程序创建了 2 个模型,每个表一个。

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

问题

我似乎无法弄清楚如何在插入其中一个表以也插入另一个表时完全确保原子性。我唯一能想到的是

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

我正在寻找是否有另一种方法来确保插入一个表被反映到另一个表中 - 可能在模型或表定义中,以便希望防止错误插入到其中一个模型中。

如果需要,我也愿意完全重组或重新制作我的表格以适应这种情况。

4

1 回答 1

0

专为高可用性和分区容错(CAP 的 AP)而设计的 NoSQL 数据库不提供高引用完整性。相反,它们旨在提供高吞吐量和低延迟的读取和写入。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)
);

对于每个输入记录,您可以在表中创建两个条目,一个以第一个 id 作为 primary_id(second_id 和 secondary_id),第二个记录以 second_id 作为 primary_id(和 first_id 作为 secondary_id)。现在使用批量插入(如上述文档中所述。这可能不是解决您的问题的最佳解决方案,但请考虑一下。

于 2020-03-03T12:49:39.353 回答