Database 卡桑德拉未读邮件计数

Database 卡桑德拉未读邮件计数,database,cassandra,nosql,datastax,cql,Database,Cassandra,Nosql,Datastax,Cql,请尝试对未读邮件计数进行建模。我有一个用户信息表 CREATE TABLE user_messages ( user text, sender text, message text, read boolean, creation_date timestamp, PRIMARY KEY (user, creation_date) ); 创建表用户消息( 用户文本, 发件人文本, 消息文本, 读布尔, 创建日期时间戳,

请尝试对未读邮件计数进行建模。我有一个用户信息表 CREATE TABLE user_messages ( user text, sender text, message text, read boolean, creation_date timestamp, PRIMARY KEY (user, creation_date) ); 创建表用户消息( 用户文本, 发件人文本, 消息文本, 读布尔, 创建日期时间戳, 主键(用户、创建日期) ); 我如何知道未读邮件的总数?我是否需要创建计数器表并在每次读取消息时更新user_messages表?
CREATE TABLE user_messages ( user text, sender text, message text, read boolean, creation_date timestamp, PRIMARY KEY (user, creation_date) );
我还了解到,使用select count(*)成本太高,不建议用于生产。请告诉我需要帮助。

您可以使用静态列保留未读邮件的数量,并在阅读邮件时进行更新(但您需要确保未从两个位置进行更新)。比如:

CREATE TABLE user_messages (
  user text,
  unread int static,
  sender text,
  message text,
  read boolean,
  creation_date timestamp,
  PRIMARY KEY (user, creation_date)
);
然后获取未读邮件的数量将是一个简单的查询(或缩小到特定字段):

并从答案中获取
未读
字段


关于
计数(*)
-如果不指定分区键,成本会很高,但如果在分区内计数(在您的情况下,如果在用户=?时使用
),则成本会更低,但由于传输数据,成本仍然会很高。因为
read
标志不是一个集群列,所以您不能对其进行限制。

您可以使用此处或此处或此处描述的解决方案。我不明白您何时说“您需要确保它不是从2个位置更新的?”。同一列上的并发更新(未读int static)不能保证一致性?请告诉我,我仍然不明白您对这个问题的答案。我很困惑,我需要进一步澄清。如何获取未读邮件总数?每个未读字段(int static)都属于每个记录。如果要确保数据不会被另一个实例覆盖,则需要进行条件更新,例如,
update table SET unread=1 If unread=2