【发布时间】:2014-08-11 16:24:24
【问题描述】:
在 SQL Server 2008+ 中,我们希望能够跟踪操作数据库中“客户”表的历史更改。
这是一个新表,我们的应用程序控制所有对数据库的写入,因此我们不需要触发器之类的恶意攻击。相反,我们会将更改跟踪构建到我们的业务对象层中,但我们需要找出要使用的正确数据库模式。
行数将低于 100,000 行,每条记录的更改次数平均为每年 1.5 次。
我们一直在研究建模的方法至少有两种:
作为名为
CustomersHistory的 Type 2 Slowly Changing Dimension 表,具有EffectiveStartDate、EffectiveEndDate的列(对于当前版本的客户,设置为NULL)和审计列,如ChangeReason和ChangedByUsername。然后我们会在该表上构建一个Customers视图,该表被过滤为EffectiveEndDate=NULL。我们应用程序的大多数部分都将使用该视图进行查询,并且只有需要历史感知的部分才会查询基础表。为了提高性能,我们可以物化视图和/或在 EffectiveEndDate=NULL 上添加过滤索引。带有单独的审计表。对
Customer记录的每次更改都会写入一次Customer表,然后再次写入CustomerHistory审计表。
通过对 StackOverflow 问题的快速回顾,#2 似乎更受欢迎。但这是因为大多数数据库应用程序必须处理遗留和流氓作家吗?
鉴于我们是从一张白纸开始,这两种方法的优缺点是什么?你会推荐哪个?
【问题讨论】:
-
它是一个 OLTP 数据库而不是一个单独的数据仓库,但有问题的表不会经常更改。
-
我想应用程序中的一个常见操作将显示给定客户交易的列表。 SCD 2 每次都需要额外的连接 -
CustomersCurrentView WHERE Customer = 'John Doe' JOIN CustomersHistory JOIN Transactions。我的建议是——如果不经常使用历史数据,就保留一组单独的审计表;仅当历史感知组件构成应用程序的重要部分时才考虑 SCD 2。为一个非常有趣的问题 +1!
标签: sql sql-server-2008 data-modeling dimensional-modeling scd