我有一个Cassandra表,如下
CREATE TABLE inventory(
prodid varchar,
loc varchar,
qty float,
PRIMARY KEY (prodid)
) ;
要求:
对于提供的主键,如果表中不存在记录,我们需要直接插入。但是,当主键的记录存在时,我们需要通过将表中的现有值与接收到的新值相加来更新qty列。
根据我的理解,我需要首先查询表中提供的主键,获得数量列的值,并添加从请求中收到的新值,然后用轻量级事务执行更新查询。
例如:表中prodid=1的数量为10,如果我从用户那里收到新的数量为2(这是增量(,那么我需要将prodi=1的数量更新为12。
这种逻辑正确吗?或者有什么更好的方法来设计表或处理用例?这种方法会在加载过程中引入延迟问题吗?因为我们需要先进行选择查询,如果数据存在,则用新值更新列值?请帮忙。
您可以将数量列更改为静态。这样,您就不必更新表,而是插入。更新是资源密集型的,所以cassandra将UPDATE语句视为插入语句。因此,您的表定义应该是-
CREATE TABLE inventory(
prodid varchar,
loc varchar,
qty float static,
PRIMARY KEY (prodid) ) ;
因此,您可以使用业务逻辑来计算QTY列的新值,并使用INSERT语句,该语句将对同一列进行内部更新。
另一种方法是使用计数器列-
CREATE TABLE inventory(
prodid varchar,
loc varchar,
qty counter,
PRIMARY KEY (prodid, loc ) ) ;
在这个设计中,你可以只使用下面这样的更新查询-
update inventory set qty = qty + <calculated Quantity> where prodid = 1;
请注意,在第二个表设计中,所有其他列都必须是主键的一部分。就你的情况而言,它既简单又方便。