Cassandra 硬删除与软删除

use*_*569 5 cassandra

我有多个表要保留已删除的数据。

我想到了两种选择来实现这一目标:

  1. 创建名为deleted_x 的新表,当从x 删除时,立即插入到deleted_x。

    优点:只查询一张表。

    缺点

    • 为每次删除插入
    • 当原始表结构发生变化时,我将不得不更改已删除的表。
  2. 调用一列is_deleted并将其放入每个表的分区键中,并在删除行时将其设置为 true。

    优点:一张表结构

    缺点is_deleted在表中的所有查询中提及

我还应该额外考虑任何性能方面的考虑吗?哪种方式更好?

Jef*_*rsa 2

选项#1 很尴尬,但这可能是在 Cassandra 中做事的正确方法。您可以在一个批次中发出两个突变(一个 DELETE 和一个 INSERT),并保证两者都被写入。

如果您有关系背景,选项 #2 并不像您想象的那么容易,因为is_deleted向 Cassandra 中的表添加一列并期望能够对其进行查询并非易事。主要原因是 Cassandra 在查询主键(分区键 + 可选集群键)时的性能明显优于二级索引。因此,为了获得最佳性能,您需要将其建模为集群键 -这样做会阻止您简单地发布更新 - 无论如何,您都需要删除+插入。

选项 #2 在 3.0+ 中通过物化视图变得更加可行 - 如果您正在考虑 Cassandra 3.0+,它可能值得考虑。