Python 在Cassandra中使用DataStax模型操作批量插入多个表

Python 在Cassandra中使用DataStax模型操作批量插入多个表,python,cassandra,datastax-python-driver,Python,Cassandra,Datastax Python Driver,按照DataStax关于“每个查询模式大约使用一个表”的建议,我已经设置了两次相同的表,但设置了不同的键以优化读取时间 --此表支持根据特定的第一个\u ID进行筛选的查询和按时间进行gt/lt筛选的查询 创建表(如果不存在)表\u按\u第一个\u Id ( 第一个id INT, 时间戳, 第二个id INT, 价值浮动, 主键(第一个\u id、时间、第二个\u id) ); --相同的表,但重新排列以在特定的秒\u ID和相同的gt/lt时间筛选器上进行筛选 如果不存在,则创建表\u按\u第

按照DataStax关于“每个查询模式大约使用一个表”的建议,我已经设置了两次相同的表,但设置了不同的键以优化读取时间

--此表支持根据特定的第一个\u ID进行筛选的查询和按时间进行gt/lt筛选的查询
创建表(如果不存在)表\u按\u第一个\u Id
(
第一个id INT,
时间戳,
第二个id INT,
价值浮动,
主键(第一个\u id、时间、第二个\u id)
);
--相同的表,但重新排列以在特定的秒\u ID和相同的gt/lt时间筛选器上进行筛选
如果不存在,则创建表\u按\u第二个\u Id创建表
(
第二个id INT,
时间戳,
第一个id INT,
价值浮动,
主键(第二个\u id、时间、第一个\u id)
);
然后,我使用DataStax的Python驱动程序创建了两个模型,每个表一个

类ModelByFirstId(…)
类ModelBySecondId(…)

问题 我似乎不知道如何在插入到一个表中同时插入到另一个表中时干净地确保原子性。我唯一能想到的就是

def插入一些数据(…):
ModelByFirstId.create(…)
ModelBySecondId.create(…)
我想看看是否有另一种方法可以确保插入到一个表中会反映到另一个表中——可能是在模型或表定义中,以防止错误插入到其中一个模型中


如果需要的话,我也愿意重新构造或重新制作我的表以适应这种情况。

专门为高可用性和分区容差(CAP的AP)而设计的NoSQL数据库并不是为了提供高引用完整性。相反,它们旨在提供高吞吐量和低延迟的读写。Cassandra本身没有跨表引用完整性的概念。但一定要为您的用例寻找LWT(轻量级事务)和批处理概念

请找一些好的材料来阅读:

特别针对您的用例,如果您可以选择以下单表数据模型,请尝试:

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作为主id(第二个id和第二个id),另一个是第二个id作为主id(第一个id作为第二个id)。现在使用批插入(如上述文档所述。这可能不是解决您的问题的最佳解决方案,但请仔细考虑。

您是否尝试在该用例中使用轻量级事务?嗯,据我所知,LWT要求我编写原始CQL-虽然这不是一个真正的问题,但我想看看我是否可以利用DataStax的建模方面来重新编写在炼金术的脉络中减少错误(尤其是在与他人合作时)。