【问题标题】:Cassandra hard vs soft deleteCassandra 硬删除与软删除
【发布时间】:2016-11-22 19:12:28
【问题描述】:

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

我想到了两种方法来实现这一点:

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

    优势:只查询一张表。

    缺点:

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

    优点:一表结构

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

还有什么我应该考虑的性能注意事项吗? 哪种方式更好?

【问题讨论】:

  • 为什么不保留数据而只对同一张表使用deleted 标志?
  • 这正是选项#2 中解释的场景。问题是必须始终通过此deleted 标志进行查询,这意味着将其放在主键中或暴露给开发人员错误,他们可以通过二级索引在没有它的情况下进行查询

标签: cassandra


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但我仍然不明白为什么选项#1 更好。是否存在性能问题?因为在选项#1 中,我将不得不在另一个表中维护表结构。你有这两种方式的经验吗?
【解决方案2】:

还有什么我应该考虑的性能注意事项吗?

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

哪种方式更好?

让我建议第三个选项。

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

【讨论】:

  • 这通常被认为是 Cassandra 中的一种反模式。两次写入数据被认为是可以接受的。
猜你喜欢
  • 2011-12-26
  • 2013-10-08
  • 1970-01-01
  • 2018-03-30
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多