我知道事件源应该是不可变的,只能追加。
但是,我想知道如何处理逻辑删除。如果用户在用户界面上单击“删除”,并且希望进行硬删除,我是否在事件中包含IsDeleted标志?这里还有其他选择吗?
编辑:当周围有敏感数据(可能存储在事件本身中)并且用户希望将其从我们的系统中完全清除掉时,该问题特别引起关注。这可能与欧盟GDPR法规和法律有关。
答案 0 :(得分:1)
您可以发布“已删除”事件,该事件将删除/标记已读数据库中的数据为已删除,但这不是硬删除(您在问题中指定)。您仍将数据保留在事件存储中。
使用事件源时,硬删除实际上非常困难。我假设您正在使用事件源客户数据?通常有一些解决方案,但是它们并不是很漂亮:
您要么不公开获取敏感客户数据,而是将其单独存储,然后以某种方式从汇总中引用该数据
您要么删除旧事件(请注意,这可能会破坏您的意愿,但这取决于您的设计/应用程序)
您可以添加已删除的事件并更改现有事件以去除敏感数据。
答案 1 :(得分:0)
我是否在事件中包含IsDeleted标志?这里还有其他选择吗?
如果您询问“是否可以通过设置isDeleted标志来撤消事件?”;不,我们通常不这样做。而是添加一个新事件,该事件“反转”第一个事件的效果。有时您会看到这被描述为补偿事件。在成熟的域(考虑计费)中,通常有一个明确的事件反转协议。
答案 2 :(得分:0)
通常,您不会在用户界面中显示事件,而是显示根据事件计算得出的读取模型。
例如,您可以有事件
TASK_CREATED“一个”
TASK_CREATED为“两个”
TASK_CREATED“三个”
TASK_DELETED“两个”
在读取模型(任务列表)更新代码中,您只需在TASK_CREATED事件上添加项目,然后在TASK_DELETED事件上将其删除,因此结果列表将是:
“一个”
“三个”
因此,如果用户在UI中单击“删除”,它将向集合发送DELETE_TASK命令,集合将发布TASK_DELETED事件,并且此事件将应用于读取的模型(从列表中删除项目)。现在,当您查询读取模型时,它将删除一项。
答案 3 :(得分:0)
正如@Vincent Hendriks所说,“您可以发布“已删除”事件,该事件将删除/标记已读取数据库中的已删除数据。”
这是一个很好的例子,演示了这个概念: http://next.belus.com/Demos/Events
在演示中,单击“编辑”链接,然后按“删除”按钮。在页面底部,查看创建的事件。