sql-server - 事件溯源 SQL Server 删除

标签 sql-server database cqrs event-sourcing

我们在 Microsoft SQL Server 2016 Enterprise 中使用事件溯源。三年后,我们想从写入和读取模型中删除数据。公司出于隐私和合规原因要求这样做。

  • Write 模型 Event Store 是 varbinary 类型的列
  • 读取模型是一个类似关系数据库的 Inmon OLTP

我们想按客户订单日期的年份删除。 (例如,当前年份是 2018 年,任何 2015 年或以下)。

我相信 Write Event Store 是不可变的;只能插入,不能删除。重放事件也需要它(或者我们也可以利用 ES 快照)。

是否允许使用不可变写入事件存储规则在事件源事件中删除? MSSQL 中正确的删除规则是什么?

某些主题:

(a) 客户可以在一年后返回,我们只收集增量数据。所以我们可能需要保留一些eventstore数据。 3年规则可以变成4

(b) 此外,我们按年份删除订单日期(不同于 Etlcreatedate 和 Etlupdatedates)

最佳答案

事件存储是一种仅附加持久性。这意味着它公开的接口(interface)不包含对持久化事件的删除或更新操作;这是因为事件存储的正常操作不需要此类操作。

但是,可以迁移事件存储,更准确地说,可以在新版本的事件存储中修改它包含的事件——旧事件存储保持不变,但修改/处理的事件存储在新事件中店铺。然后,新的事件存储可以被应用程序的配置引用,旧的事件存储可以被归档或删除。

此迁移可以离线完成,使用一次性脚本。它不需要在实时系统上运行。

可以对事件进行很多转换,在 Greg's Young book 中介绍。 :复制和替换,两个聚合 - 一个流,一个聚合 - 两个流,复制 - 转换等。

在您的情况下,为了尊重隐私和合规性,您可以将包含个人客户数据的事件匿名化。例如,您可以用空格替换客户的地址、姓名或任何个人数据。通过这种方式,您不会弄乱聚合和读取模型上的事件重放。

迁移事件存储后,您应该重建所有受影响的读取模型,以确保清除所有个人/敏感/必须删除的信息。

如果您真的想删除旧事件(即早于 2014 年),那么您应该将所有这些旧事件折叠在快照类型/初始化类型事件中,这将使您的聚合处于有效的初始状态。这对于将来应该能够接收命令的聚合是必需的。

对于不应再存在的聚合,您可以删除旧事件。

附言当我说“删除”时,我的意思是您根本不会将它们复制到新的事件商店。

关于sql-server - 事件溯源 SQL Server 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48163179/

相关文章:

azure - CQRS:读取端 ACID

mysql - 在表、XML 或 JSON 中存储大文本的最佳方法?

node.js - 如何高效地将 Postgres 数据从 Query 传输到 S3

bdd - 有没有人使用 SpecFlow/StoryQ 用 CQRS 完成 BDD

sql - 根据单元格位置将选择性字段从 Excel 批量插入到 SQL

mysql - group by 和 group concat ,不使用主 pk 优化 mysql 查询

nservicebus - 是什么导致 EventStore 如此容易抛出 ConcurrencyException?

sql-server - SQL Azure - 连接失败 - 但没有问题?

SQL 将行数据连接到列中

sql - SQL Server 中的条件连接依赖于其他表值