Cassandra DB 将数据插入多个表

Hus*_*ali 2 database cassandra datastax-enterprise cassandra-2.0 cassandra-3.0

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

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

Eri*_*rez 6

为了保持非规范化表之间的数据同步,您需要使用 CQLBATCH语句。

例如,如果您需要维护这些表:

  • movies
  • movies_by_actor
  • movies_by_genre

然后您可以将更新分组到 CQL 中,BATCH如下所示:

BEGIN BATCH
  INSERT INTO movies (...) VALUES (...);
  INSERT INTO movies_by_actor (...) VALUES (...);
  INSERT INTO movies_by_genre (...) VALUES (...);
APPLY BATCH;
Run Code Online (Sandbox Code Playgroud)

请注意,也可以批量执行 do UPDATEandDELETE语句以及条件写入。

上面的例子只是为了在cqlsh中进行说明,实际中并没有使用。BatchStatement以下是使用 Java 驱动程序的示例:

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();
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Java 驱动程序批处理语句。干杯!