【发布时间】:2021-12-30 18:18:28
【问题描述】:
每当我们进行行更新时,我需要将行的旧值保留在历史表中以供审核。 Apache Cassandra 中是否有可用的解决方案来实现这一目标? 我查看了触发器,在文档中没有太多提及。如果我们使用触发器,不确定性能问题。另外,如果我们使用触发器,它会在我们更新时为列提供旧值吗?
【问题讨论】:
-
将您的问题更改为 - 如何使用 Cassandra 表进行审计?
每当我们进行行更新时,我需要将行的旧值保留在历史表中以供审核。 Apache Cassandra 中是否有可用的解决方案来实现这一目标? 我查看了触发器,在文档中没有太多提及。如果我们使用触发器,不确定性能问题。另外,如果我们使用触发器,它会在我们更新时为列提供旧值吗?
【问题讨论】:
Cassandra 是保存行历史记录的最佳工具。我将尝试用一个例子来解释它。考虑下表设计 -
CREATE TABLE user_by_id (
userId text,
timestamp timestamp,
name text,
fullname text,
email text,
PRIMARY KEY (userId,timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);
通过这种表格设计,您可以保留历史记录。 这里,userid 是行分区键,时间戳是集群键。同一用户的每次插入都将记录为不同的行。例如 -
insert into user_by_id (userId,timestamp ,name, fullname, email ) values ('1',<newTimeStamp>,'x',xyz,'x@xyz.com');
insert into user_by_id (userId,timestamp ,name, fullname, email ) values ('1',<newTimeStamp>,'y',xyz,'y@xyz.com');
insert into user_by_id (userId,timestamp ,name, fullname, email ) values ('1',<newTimeStamp>,'z',xyz,'z@xyz.com');
上面的插入语句实际上是在更新 name 和 email 列的值。但是,由于时间戳作为聚类键,这将保存在三个不同的行中,每行的时间戳都是不同的。如果要获取最新值,只需在选择查询中使用 LIMIT。
这种设计保留了行的历史记录,可用于审计目的。
【讨论】: