在 SQL Server 2008+ 中,我们希望能够跟踪操作数据库中“客户”表的历史更改。
这是一个新表,我们的应用程序控制所有对数据库的写入,因此我们不需要触发器之类的恶意黑客。相反,我们会将更改跟踪构建到我们的业务对象层中,但我们需要找出要使用的正确数据库模式。
行数将低于 100,000,每条记录的更改数平均为每年 1.5。
我们至少有两种方法来对此建模:
作为名为 的类型 2 渐变维度表,其中包含、
CustomersHistory
的列(针对客户的当前版本设置为)和审计列,例如和。然后我们会在该表上构建一个视图,该视图被过滤为. 我们应用程序的大多数部分都将使用该视图进行查询,并且只有需要历史感知的部分才会查询基础表。为了提高性能,我们可以物化视图和/或在 EffectiveEndDate=NULL 上添加过滤索引。EffectiveStartDate
EffectiveEndDate
NULL
ChangeReason
ChangedByUsername
Customers
EffectiveEndDate=NULL
带有单独的审计表。对记录的每次更改都会
Customer
写入Customer
表一次,然后再写入CustomerHistory
审计表。
从对 StackOverflow 问题的快速回顾来看,#2 似乎更受欢迎。但这是因为大多数数据库应用程序必须处理遗留和流氓作家吗?
鉴于我们是从一张白纸开始,这两种方法的优缺点是什么?你会推荐哪个?