Cassandra硬vs软删除

时间:2016-02-21 17:28:50

标签: cassandra

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

我想到了实现这个目标的两个选择:

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

    优势:仅从一个表中查询。

    缺点

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

    优势:一个表格结构

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

  3. 我还应该考虑额外的考虑因素吗? 哪种方式更好?

2 个答案:

答案 0 :(得分:2)

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

如果您来自关系背景,选项#2并不像您预期​​的那样简单,因为在Cassandra中向表中添加is_deleted列并期望能够查询它并不是一件容易的事。主要原因是Cassandra在查询主键(分区键+可选聚类键)而不是二级索引时表现更好。因此,为了获得最佳性能,您需要将其建模为聚类密钥 - 这样做会阻止您简单地发布更新 - 无论如何您都需要删除+插入。

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

答案 1 :(得分:1)

  

我还应该考虑其他性能因素吗?

通过两次插入数据,您将有效地将群集的写入负载和存储大小加倍。这包括压缩,修复,引导新节点和备份。

  

哪种方式更好?

让我建议第三个选项。

  1. 创建包含每一行的表all_data,永远不会从
  2. 中删除
  3. 使用相同的分区键创建表active_data。此表格仅包含未删除的行(编辑:,但根本不包含任何数据!)。
  4. 在从active_data读取之前检查密钥是否在all_data中,只允许您读取未删除的行