Cassandra DB将数据插入多个表中



我一直在阅读Cassandra Db关于数据税的文档以及Apache文档。到目前为止,我了解到我们不能在一个表上创建多个索引(一个主索引,一个辅助索引(。每个查询都应该有一个单独的表。将其与SQL表进行比较,例如,我们想查询4个字段的SQL表,对于这个表,在Cassandra的情况下,我们应该将这个表拆分为4个表,对吗?(如果我错了,请纠正我(。在这4个表上,我可以拥有索引并进行查询,我的问题是,我们如何将数据插入这4个表中,我应该连续发出4个插入请求吗?

我的首要任务是避免二级索引

要在未规范化的表中保持数据同步,需要使用CQLBATCH语句。

例如,如果您要维护以下表格:

  • movies
  • movies_by_actor
  • movies_by_genre

然后将更新分组在CQLBATCH中,如下所示:

BEGIN BATCH
INSERT INTO movies (...) VALUES (...);
INSERT INTO movies_by_actor (...) VALUES (...);
INSERT INTO movies_by_genre (...) VALUES (...);
APPLY BATCH;

请注意,也可以在批处理中执行UPDATEDELETE语句以及条件写入。

上面的例子只是为了在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驱动程序Batch语句。干杯

Cassandra支持二级索引,SSTable Attached secondary Index(SASI(。存储附加索引(SAI(已捐赠给该项目,但尚未被接受。

您需要创建您的表,这样您就可以使用类似的单个查询从表中获得所有所需的数据

SELECT * from keyspace.table_name where key = 'ABC';

作为一名设计师,这意味着什么呢。您需要识别所有查询,并根据这些查询定义数据模型(表(。因此,如果您认为需要4个表来满足您的查询,那么您是对的。

由于您定义的所有4个表都必须同步,如果它们表示相同的数据,最好的方法是使用批

BEGIN BATCH 
DML_statement1 ;
DML_statement2 ;
DML_statement3 ;
DML_statement4 ;
APPLY BATCH ;

Batch并不保证所有语句都会成功回滚。它通知客户端一组语句已失败。所以客户端应该重试应用它们。

如果可以的话,最好避免使用辅助索引,因为它们存在性能问题。一般的经验法则是用很少值的低基数对列进行索引。

最新更新