【问题标题】:Cassandra DB Java: for each row gotten in query, fetch data stored in seperate table (eg counter table)?Cassandra DB Java:对于查询中的每一行,获取存储在单独表(例如计数器表)中的数据?
【发布时间】:2018-07-25 16:06:24
【问题描述】:

有没有人知道一种有效的方法来获取存储在单独表中的计数器数据,用于查询中获得的每一行?

表定义如下

TABLE person (
    id timeuuid,
    name text,
    many other attributes... );
TABLE person_counts(
      id timeuuid, //same id as person
      count1 counter,
      PRIMARY KEY (id));

目标是当获取人/单人时,在返回之前添加计数然后返回。遍历每个人并查询 person_counts 是实现这一目标的唯一方法吗?它需要是一个计数器,但是因为我需要一个人表的主键,所以我不能直接在那里有一个计数器。

如果有影响,我正在使用 datastax cassandra。

【问题讨论】:

  • 读取与更新的频率如何?
  • 读取相对频繁且一致,而更新可能不频繁,但会从各种来源分批发生。

标签: cassandra nosql datastax datastax-java-driver cassandra-3.0


【解决方案1】:

对于此插入,您可以使用批处理操作,它是 cassandra datastax 驱动程序中的原子操作。每当您尝试在persons 表中输入记录时,您必须为persons 表和persons_count 表创建一个准备好的查询,并将这两个准备好的查询添加到一个批处理中并进行插入。批处理的优点是,它是一个原子操作,即,它要么插入两条记录,要么根本不插入。

以同样的方式,每当您想从persons 表中删除时,创建一个批处理并从persons 和persons_count 表中删除。你可以在这里阅读更多关于它们的信息:https://datastax.github.io/cpp-driver/topics/basics/batches/

注意:两个表是独立的,可以分别读取两个表的条​​目。通过批量操作插入不会使它们相互链接。

现在,对于获取的要求,您必须先从表中查询计数,然后再转到persons表。可能没有其他方法,因为 cassandra 不支持任何连接。此外,您必须为 person 表和其他属性指定主键,这有助于最终确定 count 是应该在其他表中还是可以在同一个表中使用。如果你对这个实现没问题,你可以使用这个:

创建表person(id uuid, 名称文本,计数计数器,主键(id,名称));

和更新计数器列的语句。那么,也不需要其他表了。

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2019-04-23
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2014-03-03
    相关资源
    最近更新 更多