按照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驱动程序创建了两个模型,每个表一个。
class ModelByFirstId (...)
class ModelBySecondId (...)
问题
我似乎不知道如何清楚地确保原子性时,插入到一个表也插入到另一个表。我唯一能想到的就是
def insert_some_data(...):
ModelByFirstId.create(...)
ModelBySecondId.create(...)
我想看看是否有另一种方法可以确保一个表中的插入被反映到另一个表中——也许是在模型或表定义中,以便有希望地防止错误插入到其中一个模型中。
如果需要的话,我也愿意重组或重新设计我的table。
1条答案
按热度按时间v8wbuo2f1#
专门为高可用性和分区容限(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
特别是对于您的用例,如果您可以使用以下单表数据模型,请尝试:
对于每个输入记录,您可以在表中创建两个条目,一个以第一个id作为主\u id(第二个\u id和第二个\u id),另一个以第二个\u id作为主\u id(第一个\u id作为第二个\u id)。现在使用批插入(如上述文档中所述)。这可能不是解决你问题的最佳方案,但请仔细想想。