历史,版本化和不可变数据

时间:2014-04-07 16:01:41

标签: sql-server database database-design sql-server-2012 event-sourcing

我们需要向项目添加数据审核。

我们可以创建某种LogAudit表来记录SQL数据库中的更改。但是,让数据库中的数据不可变是不是更好的主意。因此,不是更新现有值,而是添加新的带时间戳的行。这样就可以跟踪所有更改。

我们正在使用存储库模式,因此这可以提供一种从客户端代码中完全抽象这种不变性/历史/版本控制的方法。我们的存储库包含基本的CRUD操作(添加,更新,删除,查找/获取)。需要进行以下更改:

  • 添加:使用新的Identity插入并设置Timestamp
  • 更新:使用旧标识值插入并设置Timestamp
  • 删除:使用旧标识插入,将IsDeleted标记设置为false并设置Timestamp
  • 查找/获取:仅返回包含最新Timestamp值且IsDeleted为假的行。

其他方法:

  • Read from this post:而是使用两个时间戳值,即开始和结束数据。
  • 而不是时间戳,而是使用某种IsLatest标志

我唯一的抱怨是,如果数据不知何故坏了,可以在给定的日期和时间内返回多行。

这个设计中是否存在任何重大缺陷,或者我可以采取哪些不同的方式?上面可能有一个正式的方法吗?

这是否与事件采购有关?

1 个答案:

答案 0 :(得分:2)

我对此的看法:

除了标识列之外,您将无法为数据创建唯一约束。

此外,使FK处理复杂化。更新父行时会发生什么?它是插入,因此是新的标识,但子行仍然引用“旧”记录。

表现会受到影响。

我建议为存档创建一个单独的表。您可以使用带有UPDATE的OUTPUT子句简化更新,并在同一语句中插入存档。

您描述的方法更适合DWH,然后是OLTP数据库。