我有多个表要保留已删除的数据。
我想到了实现这个目标的两个选择:
创建名为deleted_x的新表,从x中删除时,立即插入到deleted_x。
优势:仅从一个表中查询。
缺点:
有一个名为is_deleted
的列,并将其放在每个表中的分区键中,并在删除行时将其设置为true。
优势:一个表格结构
缺点:在表格的所有查询中提及is_deleted
我还应该考虑额外的考虑因素吗? 哪种方式更好?
答案 0 :(得分:2)
选项#1很尴尬,但它可能是在Cassandra做事的正确方法。您可以在一个批次中发出两个突变(一个DELETE和一个INSERT),并保证两者都被写入。
如果您来自关系背景,选项#2并不像您预期的那样简单,因为在Cassandra中向表中添加is_deleted
列并期望能够查询它并不是一件容易的事。主要原因是Cassandra在查询主键(分区键+可选聚类键)而不是二级索引时表现更好。因此,为了获得最佳性能,您需要将其建模为聚类密钥 - 这样做会阻止您简单地发布更新 - 无论如何您都需要删除+插入。
选项#2在物化视图的3.0+中变得更加可行 - 如果你正在考虑Cassandra 3.0+,它可能值得考虑。
答案 1 :(得分:1)
我还应该考虑其他性能因素吗?
通过两次插入数据,您将有效地将群集的写入负载和存储大小加倍。这包括压缩,修复,引导新节点和备份。
哪种方式更好?
让我建议第三个选项。
all_data
,永远不会从active_data
。此表格仅包含未删除的行(编辑:,但根本不包含任何数据!)。active_data
读取之前检查密钥是否在all_data
中,只允许您读取未删除的行