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