【发布时间】:2021-10-31 07:54:52
【问题描述】:
我正在使用 Cassandra 作为 DB 构建一个应用程序,我想知道是否有任何方法可以复制粘贴并将列值与另一个列值“同步”。 我尝试使用物化视图,但无法在创建视图的同一行中添加额外的常规列。我还看到了这个关于 cql 中“链接”的图表。
谁能帮我找到一种方法吗?
【问题讨论】:
标签: database cassandra cql cqlsh
我正在使用 Cassandra 作为 DB 构建一个应用程序,我想知道是否有任何方法可以复制粘贴并将列值与另一个列值“同步”。 我尝试使用物化视图,但无法在创建视图的同一行中添加额外的常规列。我还看到了这个关于 cql 中“链接”的图表。
谁能帮我找到一种方法吗?
【问题讨论】:
标签: database cassandra cql cqlsh
在 Cassandra 中没有办法做到这一点。您将需要使用 CQL BATCH 语句来保持表同步。它将插入、更新和删除分组到一个原子事务中。看看这篇文章,我已经更详细地解释了它——https://community.datastax.com/articles/2744/。
例如,如果您要维护这些表:
moviesmovies_by_actormovies_by_genre然后您将在 CQL BATCH 中对更新进行分组,如下所示:
BEGIN BATCH
INSERT INTO movies (...) VALUES (...);
INSERT INTO movies_by_actor (...) VALUES (...);
INSERT INTO movies_by_genre (...) VALUES (...);
APPLY BATCH;
请注意,还可以执行 UPDATE 和 DELETE 语句以及批量条件写入。
上面的例子只是在cqlsh中说明而已,实际并没有用到。这是一个使用 Java 驱动程序的示例BatchStatement:
SimpleStatement insertMovies =
SimpleStatement.newInstance(
"INSERT INTO movies (...) VALUES (?, ...)", <some_values>);
SimpleStatement insertMoviesByActor =
SimpleStatement.newInstance(
"INSERT INTO movies_by_actor (...) VALUES (?, ...)", <some_values>);
SimpleStatement insertMoviesByGenre =
SimpleStatement.newInstance(
"INSERT INTO movies_by_genre (...) VALUES (?, ...)", <some_values>);
BatchStatement batch =
BatchStatement.builder(DefaultBatchType.LOGGED)
.addStatement(insertMovies)
.addStatement(insertMoviesByActor)
.addStatement(insertMoviesByGenre)
.build();
详情请见Java driver Batch statements。干杯!
【讨论】: